mirror of
https://github.com/ptitSeb/box64.git
synced 2026-11-08 17:39:19 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dae0917c47 | ||
|
|
37a189814c | ||
|
|
baa962f586 | ||
|
|
df37f14729 | ||
|
|
48d5ce7b34 | ||
|
|
4ed3c02834 | ||
|
|
bebae710ec | ||
|
|
0254fbdd83 | ||
|
|
758a1a9ea5 | ||
|
|
7f6e5fca90 | ||
|
|
866cfe300d | ||
|
|
ac5a149297 | ||
|
|
4759e2d20d | ||
|
|
e0b4a8a48a | ||
|
|
977dcc6c4c | ||
|
|
a89704c8a7 | ||
|
|
09bdbcb049 | ||
|
|
c23de7dc9c | ||
|
|
816f807a2d | ||
|
|
7e15f0e3d5 | ||
|
|
1e73fe64e1 | ||
|
|
32fbdd28ac | ||
|
|
050e0f9f43 | ||
|
|
7420c5a088 | ||
|
|
9a5a8fedc5 | ||
|
|
9d6fcab85f | ||
|
|
1654964362 | ||
|
|
3b5f3b26f1 | ||
|
|
8e4a17f851 | ||
|
|
cc117019ff | ||
|
|
490350acac | ||
|
|
90706e7f74 | ||
|
|
3ac959275f | ||
|
|
d6651c3615 | ||
|
|
80dafff3c5 | ||
|
|
3eb8e16958 | ||
|
|
6a1861572d | ||
|
|
78a2109344 | ||
|
|
894285b1db | ||
|
|
663ae1abda | ||
|
|
fddba78b84 | ||
|
|
0cec2e8bf8 | ||
|
|
2557acc3b2 | ||
|
|
a8bb97f7e2 | ||
|
|
5adfb41a37 | ||
|
|
dd1420eeba | ||
|
|
b9a9317a73 | ||
|
|
ac816e90aa | ||
|
|
d7f71d7a2f | ||
|
|
d15a203bb1 | ||
|
|
3b9edf0070 | ||
|
|
0ae576964c | ||
|
|
7086d0e5a2 | ||
|
|
e912aff5c6 | ||
|
|
f93af92f5d | ||
|
|
e02c5c325d | ||
|
|
06950103a2 | ||
|
|
8f736dcdee | ||
|
|
9aa5ba1b90 | ||
|
|
30f891aaa6 | ||
|
|
57466cf0f0 | ||
|
|
2babe3aa89 | ||
|
|
0fa0e02844 | ||
|
|
a983cbe67b | ||
|
|
f5d468718d | ||
|
|
62a053bc48 | ||
|
|
451c7901b4 | ||
|
|
066e7d3aea | ||
|
|
1de324a500 | ||
|
|
2db33422c6 | ||
|
|
f2660cd3f0 | ||
|
|
b34b7aca42 | ||
|
|
cdf3890a33 | ||
|
|
14b660e3bb | ||
|
|
87d74ebf02 | ||
|
|
3a6653dabf | ||
|
|
052db75bd8 | ||
|
|
25b83a80f0 | ||
|
|
f4ee2cc701 | ||
|
|
0158102974 | ||
|
|
7586bd47cb | ||
|
|
7f20c20031 | ||
|
|
2143a88d99 | ||
|
|
67c2df0b58 | ||
|
|
24ba5357de | ||
|
|
57f1b60fb0 | ||
|
|
5b5b6aca0d | ||
|
|
b7c386289d | ||
|
|
b0b2f3c611 | ||
|
|
b9af6270d4 | ||
|
|
59b35d49e2 | ||
|
|
c68dc6fd7b | ||
|
|
c49ec4417f | ||
|
|
8e3fc1e8d8 | ||
|
|
5ed336f8ce | ||
|
|
ecba89ea31 | ||
|
|
9bf06e9929 | ||
|
|
4e07b1765d | ||
|
|
391973d4a0 | ||
|
|
136b683e81 | ||
|
|
f82c3ffe74 | ||
|
|
76e41e7b1a | ||
|
|
bb78e2e63b | ||
|
|
1b8da86465 | ||
|
|
b53ba64cef | ||
|
|
3970c2d50d | ||
|
|
9b868c9511 | ||
|
|
acad5acbef | ||
|
|
e6961d845e | ||
|
|
cb2deb5cef | ||
|
|
96f786e4a9 | ||
|
|
9b3e548437 | ||
|
|
5a85a5eec4 | ||
|
|
b481e9d4fe | ||
|
|
dc138a244f | ||
|
|
3810383851 | ||
|
|
466e5eb84b | ||
|
|
55b6071e63 | ||
|
|
ac08b010d5 | ||
|
|
5253a7f483 | ||
|
|
64855cd5e9 | ||
|
|
0727555759 | ||
|
|
92e5e5618d | ||
|
|
33c9d63498 | ||
|
|
1369ac4b0c | ||
|
|
529fc7fe11 | ||
|
|
1dd8775ff3 | ||
|
|
a1f9147868 | ||
|
|
1df9adcd14 | ||
|
|
52e2514279 | ||
|
|
05b561f739 | ||
|
|
a573268b1b | ||
|
|
fe186b32e7 | ||
|
|
f79a31e535 | ||
|
|
eb743a1307 | ||
|
|
da76e7e214 | ||
|
|
34e9bf1caf | ||
|
|
498019ca75 | ||
|
|
cd8890f760 | ||
|
|
aa45e2583d | ||
|
|
1c28994871 | ||
|
|
2a68951574 | ||
|
|
fa03a3915b | ||
|
|
1cc40d8401 | ||
|
|
1c282c2c26 | ||
|
|
2c5bdd76fb | ||
|
|
789c4e4671 | ||
|
|
df7d74f418 | ||
|
|
98e50e28a6 | ||
|
|
06296c77c7 | ||
|
|
db191e2e72 | ||
|
|
ed21c85ade | ||
|
|
c59bc5d54a | ||
|
|
ce88a2be94 | ||
|
|
67b1569c11 | ||
|
|
dfb284aa4e | ||
|
|
056999e8fd | ||
|
|
5540c85ae4 | ||
|
|
3e30aa0002 | ||
|
|
13f9a9f83e | ||
|
|
2d2c6a2aa1 | ||
|
|
039c6f557e | ||
|
|
c4e09fddb9 | ||
|
|
5a0448a1d5 | ||
|
|
185de7eaf7 | ||
|
|
90babc5c45 | ||
|
|
555b5065a0 | ||
|
|
c4e821db36 | ||
|
|
8642d48aee | ||
|
|
c64a431e35 | ||
|
|
b0ef9838a3 | ||
|
|
ffd32899ef | ||
|
|
3059fe2d09 | ||
|
|
be1c926b67 | ||
|
|
76fc77d6f8 | ||
|
|
1eb55587b6 | ||
|
|
25f0bd14b8 | ||
|
|
36b4fbae85 | ||
|
|
f6b6066509 | ||
|
|
d5d4cc0951 | ||
|
|
57b9f6ca3c | ||
|
|
a1945549ad | ||
|
|
e8e25b3f01 | ||
|
|
8491e0d4db | ||
|
|
b66c932fbc | ||
|
|
589d042c34 | ||
|
|
0add723460 | ||
|
|
024bdffb02 | ||
|
|
12580e593d | ||
|
|
c5ce123d4d | ||
|
|
c272dd95ec | ||
|
|
be8a3bdfdd | ||
|
|
8a40b11574 | ||
|
|
2fd3238187 | ||
|
|
1371a34e0d | ||
|
|
ee345ae46d | ||
|
|
cd645f7d7d | ||
|
|
a814aeeb37 | ||
|
|
e8611d2f38 | ||
|
|
c75c8eb4fa | ||
|
|
3ec07fa5df | ||
|
|
6d7b649bcd | ||
|
|
d4f72f8bf5 | ||
|
|
7befdcf0a9 | ||
|
|
22197b3540 | ||
|
|
8aa23c5629 | ||
|
|
07ef276274 | ||
|
|
7988fca992 | ||
|
|
31db9ecfbc | ||
|
|
3ad3873d80 | ||
|
|
5b27657166 | ||
|
|
984c9d4f2f | ||
|
|
e4a8d7f5c4 | ||
|
|
9d0d825f9f | ||
|
|
fa874dbc0b | ||
|
|
d328d6390b | ||
|
|
0c405897d3 | ||
|
|
187b9af1b6 | ||
|
|
cae4502731 | ||
|
|
a91f6d82d7 | ||
|
|
cc389b3ec3 | ||
|
|
4b24f51e2d | ||
|
|
e6cbf0975a | ||
|
|
dc9c82db25 | ||
|
|
63b0debcf1 | ||
|
|
f8cc9de4f8 | ||
|
|
cfb8879410 | ||
|
|
6f7519b36e | ||
|
|
85bcfadfd6 | ||
|
|
c71e688663 | ||
|
|
de69cb4f7b | ||
|
|
9efde7809c | ||
|
|
a170660a81 | ||
|
|
ad90eaef8d | ||
|
|
05c75d7182 | ||
|
|
a1e8ff3faf | ||
|
|
3cea6dab34 | ||
|
|
27fba0e0eb | ||
|
|
442d727f5e | ||
|
|
cb26e7f3fe | ||
|
|
f74b67ed8f | ||
|
|
0a37916aa3 | ||
|
|
41bdb5db66 | ||
|
|
13d0814c4d | ||
|
|
cc00818d1d | ||
|
|
c5aa4e7d49 | ||
|
|
82fbf9db7d | ||
|
|
7b456fe1fa | ||
|
|
b2db02a5a8 | ||
|
|
e3b13ebd7d | ||
|
|
2d5b7bf979 | ||
|
|
5d7a86551e | ||
|
|
f69ab5733c | ||
|
|
3f7facd8e0 | ||
|
|
60cea01eb5 | ||
|
|
809d51bd8a | ||
|
|
f6bec4e201 | ||
|
|
2bf6aa8648 | ||
|
|
db03c644e9 | ||
|
|
bffc81e547 | ||
|
|
c723d10dc2 | ||
|
|
a453563f02 | ||
|
|
6489fc199b | ||
|
|
3d378366df | ||
|
|
ad60ba9fe2 | ||
|
|
871259b47d | ||
|
|
22c7db557a | ||
|
|
f2058e56f6 | ||
|
|
c5444fc67d | ||
|
|
66c09a7f7f | ||
|
|
8d3b6c5423 | ||
|
|
3e8c02d645 | ||
|
|
e34da3a466 | ||
|
|
476592df7c | ||
|
|
9939760901 | ||
|
|
510966a8f9 | ||
|
|
751c229c00 | ||
|
|
0a84ed5dae | ||
|
|
f3d3f1a84e | ||
|
|
d37b843ee9 | ||
|
|
ccac55667d | ||
|
|
81b080eb5d | ||
|
|
cc541b08c3 | ||
|
|
e90676213a | ||
|
|
adef248942 | ||
|
|
c6e9b87ef3 | ||
|
|
ca9da1855a | ||
|
|
b6fb4865fb | ||
|
|
6af34e0c43 | ||
|
|
f4ce7a0893 | ||
|
|
6f658a9b2c | ||
|
|
c35af59da9 | ||
|
|
3872d8df46 | ||
|
|
fbbf74f601 | ||
|
|
a5ec9bfc4c | ||
|
|
0adaa219bf | ||
|
|
0358034389 | ||
|
|
c674c13114 | ||
|
|
a1bf126d7b | ||
|
|
36a5020d36 | ||
|
|
94c7dd5796 | ||
|
|
8c5a5d9fb5 | ||
|
|
2f23cf5812 | ||
|
|
85fd15902f | ||
|
|
96708b31d5 | ||
|
|
b1824baf2b | ||
|
|
53528ddd61 | ||
|
|
fe19ac7c6d | ||
|
|
7fec355012 | ||
|
|
838060f996 | ||
|
|
cebeff3d3e | ||
|
|
d117c77247 | ||
|
|
901811b8f9 | ||
|
|
f97a25ae0c | ||
|
|
87683a18f5 | ||
|
|
dfd5ed8675 | ||
|
|
1fab6582d7 | ||
|
|
164a85c18f | ||
|
|
9d6488b35d | ||
|
|
0ef66adfa9 | ||
|
|
564a75b917 | ||
|
|
05e4b4592d | ||
|
|
7faeec0864 | ||
|
|
08cf5fd6c3 | ||
|
|
26aae9ba3b | ||
|
|
9b7c83f885 | ||
|
|
b2830d3070 | ||
|
|
b6024590ef | ||
|
|
7ee7b99a84 | ||
|
|
93ff6ca414 | ||
|
|
78080748e6 | ||
|
|
522f8c3dd0 | ||
|
|
4825b31305 | ||
|
|
a96f2dcda9 | ||
|
|
08f2f8255d | ||
|
|
3004c7f280 | ||
|
|
f649132b6f | ||
|
|
503cf716ec | ||
|
|
5b8f18f6bf | ||
|
|
e78169bc4e | ||
|
|
fa7a4ce29c | ||
|
|
37040f3b49 | ||
|
|
4a1f92a634 | ||
|
|
bffca555a3 | ||
|
|
dcd3ba0d16 | ||
|
|
b2e68e8032 | ||
|
|
e0a67969ca | ||
|
|
a5ef0c2ac0 | ||
|
|
14e3d05b87 | ||
|
|
85e48644b1 | ||
|
|
ec7a898058 | ||
|
|
d0dccb8e19 | ||
|
|
85125305b9 | ||
|
|
0c00db9851 | ||
|
|
91163afd7b | ||
|
|
db20fd7e49 | ||
|
|
e6843dcb9f | ||
|
|
2ecde96fe2 | ||
|
|
1a552f2105 | ||
|
|
86a207cf36 | ||
|
|
af99dd0e76 | ||
|
|
bb7d674582 | ||
|
|
4f37a9a7dd | ||
|
|
6c291548f0 | ||
|
|
2b070086d1 | ||
|
|
8b72b3bf70 | ||
|
|
44822bb07b | ||
|
|
75ea309ca1 | ||
|
|
de020c2b4c | ||
|
|
8caf35ccd8 | ||
|
|
0ab3d844e7 | ||
|
|
1c34a7ce38 | ||
|
|
3f0400a89b | ||
|
|
cd26f27e98 | ||
|
|
713c137e09 | ||
|
|
64a6802b5e | ||
|
|
2286636386 | ||
|
|
c51edca058 | ||
|
|
69a549eb8f | ||
|
|
073a8ba703 | ||
|
|
4a9fbf10c4 | ||
|
|
f3fbff531c | ||
|
|
894712461f | ||
|
|
af97642dba | ||
|
|
425f838ee8 | ||
|
|
9c8b92e8df | ||
|
|
302dfbe539 | ||
|
|
6a717bd7c6 | ||
|
|
b2b6d12508 | ||
|
|
86e8a24d0d | ||
|
|
a9a27a93d2 | ||
|
|
ab8731411e | ||
|
|
1f7a69ef31 | ||
|
|
01e906ead8 | ||
|
|
5d02f2cb1b | ||
|
|
b066ca201c | ||
|
|
e735a591a0 | ||
|
|
e49c4d78d0 | ||
|
|
e6c4bbcd41 | ||
|
|
8be949ba57 | ||
|
|
6d74f71d96 | ||
|
|
b4adf1e8ef | ||
|
|
435dce44ac | ||
|
|
f71fd3d2c1 | ||
|
|
44e4ba2d01 | ||
|
|
716433658c | ||
|
|
4e80fdfaef | ||
|
|
3280f02135 | ||
|
|
c985fe1bb7 | ||
|
|
c95c16231d | ||
|
|
448ee01f44 | ||
|
|
ea86135152 | ||
|
|
b079d85636 | ||
|
|
46489c3cd6 | ||
|
|
ab72625a8f | ||
|
|
f1ee1933b1 | ||
|
|
ec39c6393e | ||
|
|
f65b57bfac | ||
|
|
1cd7edf172 | ||
|
|
5f7a1982ac | ||
|
|
d42055477c | ||
|
|
83082b081c | ||
|
|
66e8828345 | ||
|
|
0850dec01f | ||
|
|
1a27269089 | ||
|
|
6c1fce4a01 | ||
|
|
79efa2d8e5 | ||
|
|
83a37589f2 | ||
|
|
fe0e3b7a9f | ||
|
|
e3cd3e8347 | ||
|
|
d730610c02 | ||
|
|
b0c11ae14f | ||
|
|
2db2532092 | ||
|
|
95182c9f21 | ||
|
|
b95f0a0ffa | ||
|
|
0833a07a65 | ||
|
|
aa4dbe72c9 | ||
|
|
b76e26dc84 | ||
|
|
ed267b1a05 | ||
|
|
609d5c27b2 | ||
|
|
9960128f4e | ||
|
|
58875dee13 | ||
|
|
57a6c5a8b9 | ||
|
|
abb6446b28 | ||
|
|
440308f604 | ||
|
|
25134fca48 | ||
|
|
f2b168e674 | ||
|
|
bd616a3779 | ||
|
|
f568ae4844 | ||
|
|
4edbdc005b | ||
|
|
88aefd44ad | ||
|
|
c8f6041ab0 | ||
|
|
640e2b8bcf | ||
|
|
f4aab38964 | ||
|
|
2a06a5d1c3 | ||
|
|
b40cb7b84a | ||
|
|
d0045b158b | ||
|
|
1d4a9e8863 | ||
|
|
cc68021a14 | ||
|
|
f5a64f93b6 | ||
|
|
6732546e60 | ||
|
|
74f4fbdcb0 | ||
|
|
524c5ad47a | ||
|
|
3d0423acf7 | ||
|
|
3ad0ddfe88 | ||
|
|
81c56d7155 | ||
|
|
524bf21011 | ||
|
|
6fbb827955 | ||
|
|
80610037cd | ||
|
|
bbd22d76be | ||
|
|
256632ea4c | ||
|
|
f5eff13acc | ||
|
|
7b66c024f0 | ||
|
|
af437fa354 | ||
|
|
2a559622c9 | ||
|
|
494428dbbe | ||
|
|
a40b6d49cb | ||
|
|
a5b3c0af5e | ||
|
|
276e67f329 | ||
|
|
56684a2f67 | ||
|
|
56b4de3b84 | ||
|
|
275c25a048 | ||
|
|
0a0228eae2 | ||
|
|
65b6f716d5 | ||
|
|
70ab16a6d6 | ||
|
|
74d4db051b | ||
|
|
41f61cf702 | ||
|
|
f0eab197be | ||
|
|
6250f03b09 | ||
|
|
535798a730 | ||
|
|
89e5c644d0 | ||
|
|
2ae7402fd7 | ||
|
|
18d95a4627 | ||
|
|
b6c9cc93fb | ||
|
|
4cc74f45eb | ||
|
|
9892089325 | ||
|
|
a029fca7bd | ||
|
|
3cfe54f8cf | ||
|
|
297dc34799 | ||
|
|
c0ec7eb2bf | ||
|
|
c33e39bd25 | ||
|
|
1dd9b23022 | ||
|
|
63592011fe | ||
|
|
73238883cb | ||
|
|
73aed7fd0e | ||
|
|
e8ed70905c | ||
|
|
f9aa5651cc | ||
|
|
b1c10d5ccd | ||
|
|
7bf2caa5c4 | ||
|
|
6ae0524da6 | ||
|
|
5768989e54 | ||
|
|
c4c9f1b8cd | ||
|
|
d547fe4d37 | ||
|
|
118f4cf3b4 | ||
|
|
5ac53d6be2 | ||
|
|
a02873b9ee | ||
|
|
ba9731838e | ||
|
|
7c064ef16c | ||
|
|
84756e1ada | ||
|
|
a37f7d1800 | ||
|
|
86dde8c1f7 | ||
|
|
e48881715a | ||
|
|
79e3d00e35 | ||
|
|
9b2bef153b | ||
|
|
4d7e9ccf51 | ||
|
|
8f5613055d | ||
|
|
501e8a77ec | ||
|
|
0e90b94272 | ||
|
|
7889934ffa | ||
|
|
3dfd5bf4b0 | ||
|
|
c605e4630e | ||
|
|
bad4d13c09 | ||
|
|
5bfb27d3fa | ||
|
|
0d355aaf01 | ||
|
|
220b1e6dad | ||
|
|
78833500c8 | ||
|
|
1a58da4315 | ||
|
|
0f4e298142 | ||
|
|
c5981dd11c | ||
|
|
24c15e148d | ||
|
|
ea48f2b823 | ||
|
|
85b07f7441 | ||
|
|
c4f5b7c062 | ||
|
|
04c1998f1c | ||
|
|
775c1c19ec | ||
|
|
f077b28459 | ||
|
|
c08fb5d53d | ||
|
|
365b6d57df | ||
|
|
ef117f726c | ||
|
|
52fe2485ae | ||
|
|
2c6816be8f | ||
|
|
965e2c93eb | ||
|
|
fe343190d8 | ||
|
|
e514f75c8e | ||
|
|
1dbb057dec | ||
|
|
5bd7b24be3 | ||
|
|
f216fda9c1 | ||
|
|
93fc3be3df | ||
|
|
d509261f81 | ||
|
|
7862e8a3d5 | ||
|
|
7acdd87198 | ||
|
|
4fb9c658a1 | ||
|
|
c6bb8b335a | ||
|
|
464fdc3ebe | ||
|
|
6b9ed18286 | ||
|
|
dca2b99c91 | ||
|
|
6f144aa429 | ||
|
|
e5c1e3a2a2 | ||
|
|
e7d2cf5538 | ||
|
|
427f1b8c55 | ||
|
|
f639357591 | ||
|
|
49b69ad122 | ||
|
|
1ef35d5d8b | ||
|
|
65b7909f6e | ||
|
|
c8c707e7cc | ||
|
|
6440aac9e1 | ||
|
|
4edba2e67a | ||
|
|
6b41f28e2b | ||
|
|
5e02758713 | ||
|
|
ff9b2a235b | ||
|
|
be2f566fbf | ||
|
|
08944bc7ca | ||
|
|
ade6843d3a | ||
|
|
2de6058c6a | ||
|
|
986e271280 | ||
|
|
578009cccf | ||
|
|
94c40d99f6 | ||
|
|
28d07f9bf0 | ||
|
|
994ce41adc | ||
|
|
d890527281 | ||
|
|
470b8664d2 | ||
|
|
b31e522eb2 | ||
|
|
cb3cfa991f | ||
|
|
4b6766c84b | ||
|
|
5e5c972cec | ||
|
|
e5556e90df | ||
|
|
1edd0eb47d | ||
|
|
f46987b6af | ||
|
|
2af7492cf8 | ||
|
|
1b2515cd49 | ||
|
|
197f962543 | ||
|
|
373d778f6a | ||
|
|
fcd1aacef0 | ||
|
|
56ae4a35e1 | ||
|
|
1141516226 | ||
|
|
b57cafd93d | ||
|
|
60ff412d60 | ||
|
|
87064c15ec | ||
|
|
67d6501f54 | ||
|
|
d0ce4ef913 | ||
|
|
e863acf0a8 | ||
|
|
3fe020572d | ||
|
|
234f6f2b14 | ||
|
|
bdb4aa5dc6 | ||
|
|
cf626c580d | ||
|
|
485447850c | ||
|
|
709a526217 | ||
|
|
1cddcad20a | ||
|
|
aa30e665ff | ||
|
|
9effd3f711 | ||
|
|
d71200de69 | ||
|
|
8579ef84bd | ||
|
|
747882cb4e | ||
|
|
e76570ad7b | ||
|
|
e964b45894 | ||
|
|
b8526c7920 | ||
|
|
2a525b4eb2 | ||
|
|
cb2c29c5f9 | ||
|
|
3b0977eee1 | ||
|
|
893ffe8205 | ||
|
|
82a91e717a | ||
|
|
031d3def2d | ||
|
|
7c32cb24a0 | ||
|
|
cea8f94358 | ||
|
|
d476217f4c | ||
|
|
34e789484a | ||
|
|
6a6af076dd | ||
|
|
5327489f39 | ||
|
|
392255594b | ||
|
|
8d94d21716 | ||
|
|
44448774a7 | ||
|
|
a280884f09 | ||
|
|
7435006b7c | ||
|
|
1c2e763ffb | ||
|
|
5f144d8ddd | ||
|
|
0a53d2223a | ||
|
|
fe2930cbe3 | ||
|
|
bf6c1533b3 | ||
|
|
167217c76b | ||
|
|
f615a10fe1 | ||
|
|
2d60c8c5b9 | ||
|
|
270ce3750e | ||
|
|
83e2427bfe | ||
|
|
3815c28bfe | ||
|
|
5144a2e286 | ||
|
|
febaf31b93 | ||
|
|
af057e309a | ||
|
|
db864b6aa6 | ||
|
|
3793e595f0 | ||
|
|
abe29cc0ba | ||
|
|
c4e50cdbb1 | ||
|
|
dce81673af | ||
|
|
df2e4f941f | ||
|
|
efd01c1126 | ||
|
|
197e5e440d | ||
|
|
eff93582a7 | ||
|
|
1535907f2d | ||
|
|
9eb1642ec8 | ||
|
|
c85072e4d3 | ||
|
|
e1b6976528 | ||
|
|
a9aff45bf2 | ||
|
|
c59b9f2686 | ||
|
|
98431d8cf5 | ||
|
|
a083025565 | ||
|
|
309dad99b4 | ||
|
|
c2c5d3b836 | ||
|
|
87baa884d2 | ||
|
|
442d6a262b | ||
|
|
47dbadb4d4 | ||
|
|
676efe4032 | ||
|
|
dd7b99ffd1 | ||
|
|
f82c5440b7 | ||
|
|
c9d5e8bfc3 | ||
|
|
7e5598d0db | ||
|
|
9d5b2f3cc5 | ||
|
|
1eba5b1af6 | ||
|
|
daeff6fc41 | ||
|
|
368f14b4ce | ||
|
|
f480ae4459 | ||
|
|
bfb2d14fee | ||
|
|
bef83b6c03 | ||
|
|
f4cd829c82 | ||
|
|
7b0ecf9f6c | ||
|
|
c769330d92 | ||
|
|
afe466b051 | ||
|
|
4bb4e45836 | ||
|
|
cbd1f487c7 | ||
|
|
926176c1b5 | ||
|
|
aac7345603 | ||
|
|
0dc9f8cb62 | ||
|
|
cb0b274c27 | ||
|
|
ebac583441 | ||
|
|
6221b01976 | ||
|
|
caac35cc1e | ||
|
|
f7302ecb1b | ||
|
|
4c30838448 | ||
|
|
ded60bbabd | ||
|
|
c2805b0f9b | ||
|
|
7e9775de94 | ||
|
|
ae0ac5a1d0 | ||
|
|
ea804a5261 | ||
|
|
a17811f4a6 | ||
|
|
d2c77ddb01 | ||
|
|
6c438a5e65 | ||
|
|
6da5698c02 | ||
|
|
ecbe739f52 | ||
|
|
27312d7a15 | ||
|
|
d19a3d987b | ||
|
|
d33706065d | ||
|
|
97a78f2d98 | ||
|
|
ec0e1077c9 | ||
|
|
127d72da17 | ||
|
|
f2baa6ed35 | ||
|
|
5fd843750f | ||
|
|
8180cb3218 | ||
|
|
68e16f5154 | ||
|
|
0fd5d67fe3 | ||
|
|
f628c37a61 | ||
|
|
0734efea39 | ||
|
|
f43a221ffc | ||
|
|
397399fd30 | ||
|
|
3e9f394228 | ||
|
|
32e2112ab0 | ||
|
|
f0866438fc | ||
|
|
ec2edd5b3a | ||
|
|
4a625db27a | ||
|
|
32cebc6137 | ||
|
|
b02b9174e0 | ||
|
|
5b3f675c0d | ||
|
|
a908ce881d | ||
|
|
49cc5eabcb | ||
|
|
bf429a1dcf | ||
|
|
e1c1303d28 | ||
|
|
4a8a373662 | ||
|
|
fff274b45f | ||
|
|
8e1e299395 | ||
|
|
b8d40a8d71 | ||
|
|
a3cad12d66 | ||
|
|
c4521b3772 | ||
|
|
729fbb24d5 | ||
|
|
6740ca196e | ||
|
|
7b755bb6a2 | ||
|
|
5f7da532c4 | ||
|
|
fc1b149fed | ||
|
|
ea16e05142 | ||
|
|
3e74454cf4 | ||
|
|
f3a748ae8f | ||
|
|
5d90fe95e4 | ||
|
|
8271d37539 | ||
|
|
206e3cd561 | ||
|
|
5d2a99307e | ||
|
|
a55cece387 | ||
|
|
ca24435b92 | ||
|
|
0e97b105fe | ||
|
|
2d164c89e2 | ||
|
|
48ae536d95 | ||
|
|
b2225e26b1 | ||
|
|
484dc1365e | ||
|
|
c9a41ee3ac | ||
|
|
7f6d18930c | ||
|
|
17ea04766e | ||
|
|
b1613be0f0 | ||
|
|
cdaffe0c1f | ||
|
|
7fb315c356 | ||
|
|
a960e98394 | ||
|
|
ef2f960d4b | ||
|
|
e829cad612 | ||
|
|
609ff66c2c | ||
|
|
1a4bfc2feb | ||
|
|
e5329d6864 | ||
|
|
37b1d9ea85 | ||
|
|
98f2460c46 | ||
|
|
7a4583699b | ||
|
|
26851574ad | ||
|
|
179cba7a28 | ||
|
|
0a59321106 | ||
|
|
ce08e8e27f | ||
|
|
6960cfa56f | ||
|
|
c558bdcb69 | ||
|
|
0674e546e1 | ||
|
|
2a10ddc75b | ||
|
|
8ed08b3bbc | ||
|
|
cf5241ceb3 | ||
|
|
78460724ea | ||
|
|
6ea020eb54 | ||
|
|
968594ee63 | ||
|
|
3ac62c64d8 | ||
|
|
5596b9ae3f | ||
|
|
64efac63c0 | ||
|
|
6da287f59f | ||
|
|
1c65cdc7cb | ||
|
|
efa6ee7275 | ||
|
|
1ac4cdeae9 | ||
|
|
4bb1bc9ea8 | ||
|
|
614d142205 | ||
|
|
aeec79ec00 | ||
|
|
b1971c8ef3 | ||
|
|
1ed7609fe9 | ||
|
|
04396f421e | ||
|
|
b4d43748e5 | ||
|
|
549b384c3c | ||
|
|
60ea78729d | ||
|
|
ab9b88091c | ||
|
|
a0fb28ac55 | ||
|
|
9d92aac4f5 | ||
|
|
5923a9089f | ||
|
|
e274abf13d | ||
|
|
e327799e62 | ||
|
|
d56464d01d | ||
|
|
accbbe83e2 | ||
|
|
44ff3375df | ||
|
|
dacc294340 | ||
|
|
569b7471f9 | ||
|
|
74710cbf6a | ||
|
|
54ea4859ec | ||
|
|
2278438462 | ||
|
|
a942cef1ee | ||
|
|
f6773b2489 | ||
|
|
614c8035ef | ||
|
|
b01a0ccbb4 | ||
|
|
c6eaae8760 | ||
|
|
4a447e7f94 | ||
|
|
c8c2b84287 | ||
|
|
2ce7bdf321 | ||
|
|
2302adcbb9 | ||
|
|
f6bb7310bb | ||
|
|
d57416f4fb | ||
|
|
e75234c83d | ||
|
|
42b98f77ce | ||
|
|
bb253f3708 | ||
|
|
0c87fbd42c | ||
|
|
bc210752ab | ||
|
|
c274475c47 | ||
|
|
48a1b11281 | ||
|
|
3698763bbe | ||
|
|
d67bc08d2d | ||
|
|
e2b9776860 | ||
|
|
208a84bebb | ||
|
|
6a6ad9748a | ||
|
|
70ee5f0c83 | ||
|
|
266bb4aa88 | ||
|
|
82016ae44f | ||
|
|
f470fdcc90 | ||
|
|
09e39704ae | ||
|
|
f14fa2f2ce | ||
|
|
7962aacc7f | ||
|
|
9195bc2d4a | ||
|
|
5e9972f2d3 | ||
|
|
acc0d451bb | ||
|
|
1f5ce7ec18 | ||
|
|
f8314ffb2b | ||
|
|
9b6ff79c9c | ||
|
|
4eabf07385 | ||
|
|
0d02532dab | ||
|
|
8ae0b6e181 | ||
|
|
f6d9caf0d1 | ||
|
|
c66630da49 | ||
|
|
0cc58732fb | ||
|
|
dcb47b7df8 | ||
|
|
d6c08a7511 | ||
|
|
f1e8841030 | ||
|
|
cfdc733e2f | ||
|
|
168fe67904 | ||
|
|
58f4cc352e | ||
|
|
b840606105 | ||
|
|
f88c864fce | ||
|
|
41a914fa5e | ||
|
|
1f710620fc | ||
|
|
eb110bf213 | ||
|
|
42c0f891e3 | ||
|
|
725316a538 | ||
|
|
cc9ed70837 | ||
|
|
c96c1ad5dd | ||
|
|
71220b7fef | ||
|
|
ae0c91dce0 | ||
|
|
ab6deeb319 | ||
|
|
c1785a93ab | ||
|
|
924903e8d2 | ||
|
|
d9925eb46a | ||
|
|
01e997a4da | ||
|
|
51db3f1f9a | ||
|
|
73dfc35c99 | ||
|
|
038835c81e | ||
|
|
decec260b2 | ||
|
|
ae6ec48623 | ||
|
|
9d93770a84 | ||
|
|
3b53d2dac7 | ||
|
|
a3d153caf0 | ||
|
|
3f7d726c17 | ||
|
|
0dedfd03a6 | ||
|
|
099b9c2aaf | ||
|
|
2d740c91d2 | ||
|
|
926a59803d | ||
|
|
db24d5ddb7 | ||
|
|
217c0fa4e9 | ||
|
|
abe3e1c4f8 | ||
|
|
ffbb0a400e | ||
|
|
0d10035ffd | ||
|
|
9cacc44125 | ||
|
|
3f757df028 | ||
|
|
e0ef328402 | ||
|
|
e0067667f7 | ||
|
|
44669935da | ||
|
|
e2f22310f4 | ||
|
|
347f90f975 | ||
|
|
cc6d5eb0d9 | ||
|
|
4029d52a75 | ||
|
|
d0dd1c4d4f | ||
|
|
5ebdab90ea | ||
|
|
d1f8458f58 | ||
|
|
12d6d14ae2 | ||
|
|
bfd0e1700b | ||
|
|
0ae6083730 | ||
|
|
64080cea81 | ||
|
|
ab5c42f0dc | ||
|
|
b19dc0db89 | ||
|
|
d886cf1d98 | ||
|
|
e427c6e9cd | ||
|
|
caba957426 | ||
|
|
873be3cf87 | ||
|
|
685afa2302 | ||
|
|
d3f0d1c30f | ||
|
|
7de8687a79 | ||
|
|
4fc5885d74 | ||
|
|
4539eccd40 | ||
|
|
03d220b1d2 | ||
|
|
053c4fd6bb | ||
|
|
7b0fada974 | ||
|
|
d09b46c1bf | ||
|
|
294178b598 | ||
|
|
e9242b8849 | ||
|
|
c5755c8241 | ||
|
|
75dcfb225a | ||
|
|
067e84eb05 | ||
|
|
faffa2a4d0 | ||
|
|
c3659df777 | ||
|
|
5aac024868 | ||
|
|
a4523caf81 | ||
|
|
db1c2cedbf | ||
|
|
4b96a74fc3 | ||
|
|
1b131d28df | ||
|
|
ec2e94249b | ||
|
|
0ffb15fce3 | ||
|
|
61a62645e8 | ||
|
|
e4edb65c2b | ||
|
|
b49bcbf68b | ||
|
|
eb69484bd6 | ||
|
|
195ac02ea1 | ||
|
|
8ebe32257e | ||
|
|
89e470d59c | ||
|
|
7a76430e87 | ||
|
|
60890a550b | ||
|
|
2038df85c0 | ||
|
|
ab5d2eba64 | ||
|
|
b142c5a181 | ||
|
|
37ed49cbb8 | ||
|
|
94ed2596c0 | ||
|
|
84498707dd | ||
|
|
d29be5fd14 | ||
|
|
53bb00a769 | ||
|
|
038e9511d1 | ||
|
|
94789d6705 | ||
|
|
67b15f09cf | ||
|
|
a0693590bd | ||
|
|
f1df65d88f | ||
|
|
6697c7d229 | ||
|
|
6a41f33bf3 | ||
|
|
67f7c988d5 | ||
|
|
01da6215de | ||
|
|
1fc558fcab | ||
|
|
c835881a77 | ||
|
|
a9f4e72c4b | ||
|
|
1f46ca81af | ||
|
|
8dbeee5dcb | ||
|
|
7a4cf9fc9e | ||
|
|
2fdd7f6188 | ||
|
|
803d8ac28a | ||
|
|
77c2683762 | ||
|
|
ae9ee3d9d8 | ||
|
|
6947a5bb94 | ||
|
|
103875b487 | ||
|
|
4c234b0418 | ||
|
|
abd1ebb425 | ||
|
|
e994c65116 | ||
|
|
c52b36abd4 | ||
|
|
a42936d998 | ||
|
|
e09adad1b9 | ||
|
|
b6429edf09 | ||
|
|
1e2bae9237 | ||
|
|
b7ddb92c80 | ||
|
|
d40f51bdc5 | ||
|
|
b78ffcfad8 | ||
|
|
3f9c5c496c | ||
|
|
37068c4f36 | ||
|
|
18a02fafb1 | ||
|
|
06d4fc79ec | ||
|
|
fa874ffcbc | ||
|
|
b729e3e37b | ||
|
|
73e7c6b480 | ||
|
|
5916869329 | ||
|
|
c9f3b990b4 | ||
|
|
6592b63800 | ||
|
|
1898d35c53 | ||
|
|
77f7c1278b | ||
|
|
1c7a7c9895 | ||
|
|
bd23f259cc | ||
|
|
efe1eb73dc | ||
|
|
8c51be6985 | ||
|
|
f25af13f79 | ||
|
|
019f85e4a3 | ||
|
|
7af5f625d7 | ||
|
|
a1ac9cccc4 | ||
|
|
b13811259a | ||
|
|
a7f4041604 | ||
|
|
72e05a52b2 | ||
|
|
e1e3122a1f | ||
|
|
4f88b2bdd7 | ||
|
|
5b8a71d720 | ||
|
|
58021bbf42 | ||
|
|
45d3cbd1b4 | ||
|
|
e07ec82344 | ||
|
|
37eb5492ba | ||
|
|
0e7b986116 | ||
|
|
be16c14dcb | ||
|
|
a1c29448a3 | ||
|
|
16bdcc0c93 | ||
|
|
2798c3c8cd | ||
|
|
d7538334e0 | ||
|
|
5dbcc4ad0d | ||
|
|
2cd4d60325 | ||
|
|
3dc00e9262 | ||
|
|
649af04fa5 | ||
|
|
3b97efb9ca | ||
|
|
8005af1387 | ||
|
|
5b45329968 | ||
|
|
b1379c88d4 | ||
|
|
274949f9d0 | ||
|
|
4a70577e6f | ||
|
|
b818a29499 | ||
|
|
69c88442b4 | ||
|
|
3d0b4ac9e1 | ||
|
|
4be5149b8d | ||
|
|
76ba181d98 | ||
|
|
4542244c4f | ||
|
|
a58e9d1dc9 | ||
|
|
938a2379c6 | ||
|
|
881814b21c | ||
|
|
915c4bf3b7 | ||
|
|
7a8a1a7791 | ||
|
|
e38d20e610 | ||
|
|
3d18e9c9e2 | ||
|
|
27685a4680 | ||
|
|
81b26569e5 | ||
|
|
76bbca2808 | ||
|
|
b435966bd0 | ||
|
|
be0839a478 | ||
|
|
f81f29b19a | ||
|
|
816c4bdb61 | ||
|
|
a9ddd396c4 | ||
|
|
f0b060dadd | ||
|
|
b1eabd7583 | ||
|
|
7a2d9967f5 | ||
|
|
2aeddc8829 | ||
|
|
df4dcf88da | ||
|
|
8160a90fd5 | ||
|
|
a8adde9234 | ||
|
|
daa3fca1f1 | ||
|
|
d744026819 | ||
|
|
689d6b9330 | ||
|
|
22fdc90fe2 | ||
|
|
78193c5f1a | ||
|
|
51d2b73cd7 | ||
|
|
7b5200094c | ||
|
|
5d14413b89 | ||
|
|
ec54969094 | ||
|
|
11513d662d | ||
|
|
6487ee0eda | ||
|
|
8d7db7f1fb | ||
|
|
11563f3b62 | ||
|
|
ff566e8116 | ||
|
|
1ddf9a0a00 | ||
|
|
35fa13899a | ||
|
|
5ee4385477 | ||
|
|
25000d0903 | ||
|
|
b96e410f53 | ||
|
|
6203880a5f | ||
|
|
889dd64c5f | ||
|
|
198eea49a8 | ||
|
|
b500a6ebc2 | ||
|
|
cb26a742ff | ||
|
|
4b44501d17 | ||
|
|
830cc8a498 | ||
|
|
16b0922ec5 | ||
|
|
9791016c74 | ||
|
|
ced1157132 | ||
|
|
56982e4c05 | ||
|
|
f5e93a14a2 | ||
|
|
eae608f35c | ||
|
|
89dbd81f27 | ||
|
|
c835227b8b | ||
|
|
57f07446ea | ||
|
|
7b2e084170 | ||
|
|
ab70523b39 | ||
|
|
f0859e6462 | ||
|
|
737a93a77c | ||
|
|
17cbeab0be | ||
|
|
313e16d2bc | ||
|
|
ae8b5b4239 | ||
|
|
1aa29ec1d3 | ||
|
|
f72d43b77e | ||
|
|
25de8bd35c | ||
|
|
5c9dc159d2 | ||
|
|
5a4021d72b | ||
|
|
ebaea69204 | ||
|
|
a221d50c17 | ||
|
|
4441be7a02 | ||
|
|
bb7dfd395f | ||
|
|
b552de33f9 | ||
|
|
35c8beb15f | ||
|
|
e1fd56123c | ||
|
|
b7ae6ebc27 | ||
|
|
9b904c622a | ||
|
|
950371427d | ||
|
|
be63129179 | ||
|
|
02423c2d7d | ||
|
|
4add55aa45 | ||
|
|
7334bb46c6 | ||
|
|
9c962f8b2c | ||
|
|
1f73944603 | ||
|
|
e844c5baa3 | ||
|
|
c849178bf8 | ||
|
|
ff4ae1f4d8 | ||
|
|
f7acb78743 | ||
|
|
6796b9ca02 | ||
|
|
e4da025dc0 | ||
|
|
b6b069cf8d | ||
|
|
f9475aa540 | ||
|
|
c6f0872e50 | ||
|
|
71dc02e06f | ||
|
|
e9715e4f0f | ||
|
|
8f197a7c08 | ||
|
|
3542c88dc1 | ||
|
|
4585b74310 | ||
|
|
768dfd37bb | ||
|
|
d8212fab48 | ||
|
|
740f4a19dc | ||
|
|
c469ed867a | ||
|
|
37dcb1a77b | ||
|
|
2e90a5dbaf | ||
|
|
d988a39456 | ||
|
|
fc381e744e | ||
|
|
e52b24b615 | ||
|
|
7158405b73 | ||
|
|
e059506d5e | ||
|
|
6da3a1265d | ||
|
|
d51997bc77 | ||
|
|
af555abb6f | ||
|
|
926e4b2da8 | ||
|
|
4903177bab | ||
|
|
d8a6fa0395 | ||
|
|
69127efae9 | ||
|
|
6f0db360a4 | ||
|
|
223de50ec9 | ||
|
|
5cfad22165 | ||
|
|
815836d285 | ||
|
|
468a3c2165 | ||
|
|
3afe87bcce | ||
|
|
d79d6bd6c2 | ||
|
|
cc6500b7dd | ||
|
|
ad494480ce | ||
|
|
854f6675db | ||
|
|
fc15743ff9 | ||
|
|
91ead3b12a | ||
|
|
75aaf7aa64 | ||
|
|
39a66e25ee | ||
|
|
574d6f9dab | ||
|
|
c39869b770 | ||
|
|
302b6493e2 | ||
|
|
20ea2987a8 | ||
|
|
eee547d50a | ||
|
|
a19f4b9eca | ||
|
|
6f3f3e0e85 | ||
|
|
2384462f61 | ||
|
|
e6e6c3ac65 | ||
|
|
102e6a1f61 | ||
|
|
460e6c517d | ||
|
|
965105c08a | ||
|
|
3fef880a7d | ||
|
|
e7b4c79d12 | ||
|
|
7cdfa187c5 | ||
|
|
d0da57547e | ||
|
|
e60fd72672 | ||
|
|
c6ae7d36dd | ||
|
|
3836625017 | ||
|
|
319f67d577 | ||
|
|
28d12f6785 | ||
|
|
e7113b228f | ||
|
|
bc3cfe82cf | ||
|
|
6ccac8ab5a | ||
|
|
c9d756eeea | ||
|
|
549b57ee30 | ||
|
|
660dbfc3ad | ||
|
|
d89ad5f1b9 | ||
|
|
00a7d321a7 | ||
|
|
4c9765cd5e | ||
|
|
fe307dbc96 | ||
|
|
518c860e5d | ||
|
|
053c389cfb | ||
|
|
81be6b1f30 | ||
|
|
3d975b090e | ||
|
|
882d933d84 | ||
|
|
9579dd9ff1 | ||
|
|
46a91e0ad9 | ||
|
|
b26a20e709 | ||
|
|
d7eb87129e | ||
|
|
7f569247d5 | ||
|
|
1ba0ea157f | ||
|
|
1e64476f31 | ||
|
|
96080e48cf | ||
|
|
4695a4ff3c | ||
|
|
8f3018e10c | ||
|
|
24b0ba9885 | ||
|
|
4f04deadfe | ||
|
|
064c2b037e | ||
|
|
12a90ebe98 | ||
|
|
5cd201241b | ||
|
|
6b2373af93 | ||
|
|
cf32412f98 | ||
|
|
f559bc48a4 | ||
|
|
0021fbbea3 | ||
|
|
ee530a7331 | ||
|
|
b7cb36d362 | ||
|
|
1bd471bf13 | ||
|
|
21911620c8 | ||
|
|
56f58501ec | ||
|
|
a89748e9e5 | ||
|
|
91f9a58b30 | ||
|
|
fea05a30e8 | ||
|
|
e678e8428b | ||
|
|
20377b9927 | ||
|
|
163689d2bb | ||
|
|
e49551bda5 | ||
|
|
514427cf8a | ||
|
|
68f5512ee7 | ||
|
|
b3165e62ab | ||
|
|
0fbf5f1896 | ||
|
|
592a2a75bb | ||
|
|
6c46e3d9b1 | ||
|
|
fa85d4d900 | ||
|
|
51d9eb966d | ||
|
|
310d4016fa | ||
|
|
0bb41a73c2 | ||
|
|
f9f082ee53 | ||
|
|
66bb1aeb89 | ||
|
|
91848efa34 | ||
|
|
5ea247b84c | ||
|
|
8c991cb676 | ||
|
|
70770db8be | ||
|
|
d0a5352c1a | ||
|
|
7391befb7e | ||
|
|
c9b6b5fbe0 | ||
|
|
62765f151a | ||
|
|
d592c1996d | ||
|
|
8b3d4404d7 | ||
|
|
b060fca66c | ||
|
|
4aab7a02f4 | ||
|
|
6d7af8674a | ||
|
|
5fc3188bc8 | ||
|
|
f4f868831a | ||
|
|
1e89ccb17e | ||
|
|
e80b595e8e | ||
|
|
ecc5375615 | ||
|
|
8da0fab674 | ||
|
|
fb955a3975 | ||
|
|
8cd3ba8c9e | ||
|
|
8cba915bca | ||
|
|
cd3163a785 | ||
|
|
b472459a22 | ||
|
|
42c241ee4e | ||
|
|
fb6ee29539 | ||
|
|
be6104c2ed | ||
|
|
3f90221b18 | ||
|
|
b5c792f5f0 | ||
|
|
b45d75f0c4 | ||
|
|
b68d46311d | ||
|
|
2c7a2082e6 | ||
|
|
3230265646 | ||
|
|
c2a77fca27 | ||
|
|
670876112e | ||
|
|
495d3cc4c0 | ||
|
|
b7ab26073e | ||
|
|
1c3df4b92c | ||
|
|
b1ba548d62 | ||
|
|
da4f574bdd | ||
|
|
8561a4a833 | ||
|
|
c40f9651bc | ||
|
|
104e582253 | ||
|
|
03c69338f5 | ||
|
|
0fa28b87f1 | ||
|
|
4ae94c5168 | ||
|
|
a429ca70e7 | ||
|
|
ee760fced1 | ||
|
|
a80659075d | ||
|
|
da0d0c1fc2 | ||
|
|
5ea2c245d6 | ||
|
|
e7b71cba5f | ||
|
|
d2817e7246 | ||
|
|
7ae8e9a86f | ||
|
|
0a59695fb3 | ||
|
|
cfdeb3685c | ||
|
|
fdf01ace3f | ||
|
|
30689882f0 | ||
|
|
d2e8ff5118 | ||
|
|
ec385c8e75 | ||
|
|
3aed032738 | ||
|
|
409b5a37fb | ||
|
|
9587e490cc | ||
|
|
ad40638345 | ||
|
|
443fe043e4 | ||
|
|
6d9560870d | ||
|
|
95d6106e3a | ||
|
|
5fb1ee033e | ||
|
|
fed73858c6 | ||
|
|
cb5a52bf40 | ||
|
|
eaa5f8feec | ||
|
|
8c6d9f04ec | ||
|
|
45f7b4991f | ||
|
|
98151eaebf | ||
|
|
933381f5fa | ||
|
|
a021fc2005 | ||
|
|
75e9aae281 | ||
|
|
b0de73852c | ||
|
|
d7744ea22d | ||
|
|
d3d3fa25f5 | ||
|
|
98162e395f | ||
|
|
9511d83955 | ||
|
|
10cbb3c8a9 | ||
|
|
0a3fa1c918 | ||
|
|
75e8b9961b | ||
|
|
5ab56ee172 | ||
|
|
7873b70306 | ||
|
|
86d9d851c6 | ||
|
|
aed08d428e | ||
|
|
affeef2380 | ||
|
|
a6c1e4126e | ||
|
|
ba630300b6 | ||
|
|
0e32c17076 | ||
|
|
14569db74d | ||
|
|
c519556962 | ||
|
|
c7280d9312 | ||
|
|
daca99017b | ||
|
|
546238681e | ||
|
|
87327b182f | ||
|
|
5b9951e1bd | ||
|
|
6ce22546fe | ||
|
|
2da064d04d | ||
|
|
77141304f6 | ||
|
|
3336cb6248 | ||
|
|
7fa3a1e627 | ||
|
|
d28c8aa41a | ||
|
|
7b065eb17a | ||
|
|
7f23664566 | ||
|
|
d555d9661f | ||
|
|
18888e404e | ||
|
|
394513971c | ||
|
|
8b75020036 | ||
|
|
e1d121aa6b | ||
|
|
30285d9ec6 | ||
|
|
9795027988 | ||
|
|
d49fb1568e | ||
|
|
ea067beac2 | ||
|
|
8905a31469 | ||
|
|
e6fd9c05f1 | ||
|
|
a79128e951 | ||
|
|
1793c2a182 | ||
|
|
b72002703e | ||
|
|
a17a97a545 | ||
|
|
0d73fc7228 | ||
|
|
8aab7296b8 | ||
|
|
4aa7eb1187 | ||
|
|
1af85c69a1 | ||
|
|
3087ea0e61 | ||
|
|
b0ad333ea4 | ||
|
|
835ecf8a19 | ||
|
|
470ff6e652 | ||
|
|
3ef6d28108 | ||
|
|
fb701d8e39 | ||
|
|
d4a539b957 | ||
|
|
7c4c6823fe | ||
|
|
3fc677cb85 | ||
|
|
2b300bd199 | ||
|
|
9c69ebd717 | ||
|
|
ea01b56422 | ||
|
|
216cf51d4a | ||
|
|
1476b502a2 | ||
|
|
bc53ae8925 | ||
|
|
9cef52a1fc | ||
|
|
5ed60d99a8 | ||
|
|
d7c7a716fe | ||
|
|
41bee35634 | ||
|
|
e764029cae | ||
|
|
b110623103 | ||
|
|
35c1f97115 | ||
|
|
e8a7bef5a0 | ||
|
|
c2f73e6de0 | ||
|
|
0724f52d5f | ||
|
|
61a605a2dc | ||
|
|
7a058c9194 | ||
|
|
99971e94c0 | ||
|
|
445d885090 | ||
|
|
fc02f0d140 | ||
|
|
c2d02977f8 | ||
|
|
946c999e25 | ||
|
|
c8b6f80f99 | ||
|
|
9444ce0b89 | ||
|
|
401d2ae0b9 | ||
|
|
8dde796103 | ||
|
|
7ba0e7a055 | ||
|
|
eb039c0449 | ||
|
|
0c0f5263e1 | ||
|
|
ad70febaac | ||
|
|
39583c6da4 | ||
|
|
1bf4851cf6 | ||
|
|
2129e98b0e | ||
|
|
b015f33376 | ||
|
|
2636e7e8b5 | ||
|
|
b0e726d953 | ||
|
|
eb40c49132 | ||
|
|
5dadc513db | ||
|
|
4120dc10bd | ||
|
|
48f51bd5fe | ||
|
|
940317949a | ||
|
|
f9b6ea48e9 | ||
|
|
3567c6da2b | ||
|
|
f3fe72b541 | ||
|
|
14966e48a6 | ||
|
|
91b282235b | ||
|
|
63c3e4fcf5 | ||
|
|
c740590bcd | ||
|
|
e868c89233 | ||
|
|
c517d7196d | ||
|
|
cb42b3b00f | ||
|
|
61362b06ec | ||
|
|
bb8559933f | ||
|
|
c2cb333261 | ||
|
|
b7e4cc4f50 | ||
|
|
a4908f1407 | ||
|
|
a252e87fa9 | ||
|
|
ee3ee539e0 | ||
|
|
c4b79374fe | ||
|
|
5dfa27ea58 | ||
|
|
49cba432c2 | ||
|
|
39a9cf903f | ||
|
|
611ac3933c | ||
|
|
fdd1509ee5 | ||
|
|
52a9443f53 | ||
|
|
0d1488b016 | ||
|
|
fb4662cb28 | ||
|
|
32a747979a | ||
|
|
362a92c158 | ||
|
|
c27b659bce | ||
|
|
049cbd3783 | ||
|
|
8b5b5aa3a7 | ||
|
|
f85b9ac664 | ||
|
|
ee5a41e21e | ||
|
|
d49fc43791 | ||
|
|
9ec7930eb1 | ||
|
|
26dd597a1b | ||
|
|
040f8d9a9f | ||
|
|
f107321d06 | ||
|
|
64313d5aa6 | ||
|
|
71845a11bb | ||
|
|
e3adda8ff9 | ||
|
|
85e79a8224 | ||
|
|
9ef3e080fa | ||
|
|
4b5f63dc6d | ||
|
|
730e9d215c | ||
|
|
efa1cbd49a | ||
|
|
91798194d5 | ||
|
|
d550f9384c | ||
|
|
d59d531f14 | ||
|
|
c9369c5ea1 | ||
|
|
05fd25d3bb | ||
|
|
2b75a0de55 | ||
|
|
59e1da5f74 | ||
|
|
639466d45a | ||
|
|
95bdaf6eca | ||
|
|
9dc10bdc47 | ||
|
|
bf212a7b52 | ||
|
|
40d83ad882 | ||
|
|
baa9efeaa6 | ||
|
|
0c17b55e28 | ||
|
|
e2f4ab7700 | ||
|
|
84982ff86f | ||
|
|
cfd17e59ac | ||
|
|
af0b0c6c9d | ||
|
|
0e588e444f | ||
|
|
f575a7846e | ||
|
|
c7ff0f658b | ||
|
|
b8cc8594f6 | ||
|
|
6197b70a9a | ||
|
|
60396f58c0 | ||
|
|
ee83ef4c01 | ||
|
|
4b7e116aa7 | ||
|
|
785d3ed5ab | ||
|
|
33d1727925 | ||
|
|
a50d34e4ba | ||
|
|
7e0c4dcee5 | ||
|
|
f5174d12aa | ||
|
|
2cb25c095a | ||
|
|
d0039c65b4 | ||
|
|
099bd148cb | ||
|
|
20885702b9 | ||
|
|
751582df05 | ||
|
|
5212de0d66 | ||
|
|
056bb38607 | ||
|
|
1a01adb2ef | ||
|
|
797731e9e2 | ||
|
|
3e2c698710 | ||
|
|
58b24c85a2 | ||
|
|
28ebc1a0b7 | ||
|
|
65487dac51 | ||
|
|
592af6db3b | ||
|
|
997140f500 | ||
|
|
16f0adec6f | ||
|
|
ba6ff73c69 | ||
|
|
2bf78ea18c | ||
|
|
fc6efb220b | ||
|
|
523bfbdf3b | ||
|
|
46ad2261e7 | ||
|
|
6c60ad4695 | ||
|
|
37697e2ec7 | ||
|
|
f5eb3c1e9b | ||
|
|
5cfd379e97 | ||
|
|
fecaf3111b | ||
|
|
ff6f34aadf | ||
|
|
4c3d55fb5c | ||
|
|
d2a5005dcc | ||
|
|
05e1b422d3 | ||
|
|
69f49f79e4 | ||
|
|
2453eb9b2d | ||
|
|
93b4813ee2 | ||
|
|
7cbe71c218 | ||
|
|
8bb53e1001 | ||
|
|
f79af5afd4 | ||
|
|
7c27085bd3 | ||
|
|
53834f2b29 | ||
|
|
7c09957263 | ||
|
|
242832fa3c | ||
|
|
9beb6b4f63 | ||
|
|
0861a88d6e | ||
|
|
1c0dc8ec7c | ||
|
|
b21776f9b0 | ||
|
|
998f164aa3 | ||
|
|
58d8627cea | ||
|
|
877ca41451 | ||
|
|
94dedd47c6 | ||
|
|
1173c1d23f | ||
|
|
d9c9575e6a | ||
|
|
2239f92816 | ||
|
|
637e177408 | ||
|
|
bb653e6888 | ||
|
|
09e07973dd | ||
|
|
6b7afd7f8e | ||
|
|
eb7858d23a | ||
|
|
1db09fe897 | ||
|
|
22a5b573d5 | ||
|
|
f12f366a3d | ||
|
|
b51ab081ae | ||
|
|
50fcaf04b4 | ||
|
|
96bca6eac3 | ||
|
|
ed7147e598 | ||
|
|
4892c68f17 | ||
|
|
3ab56994da | ||
|
|
a54afc8e04 | ||
|
|
01b5ee9c78 | ||
|
|
a513cd847b | ||
|
|
06b6871c80 | ||
|
|
f5dc038621 | ||
|
|
38dce9138d | ||
|
|
2aa5c5f337 | ||
|
|
e6d2c12792 | ||
|
|
c3dbdf419d | ||
|
|
c566ba970d | ||
|
|
81925643e8 | ||
|
|
285c874e53 | ||
|
|
ba078c63a8 | ||
|
|
a54959a6e3 | ||
|
|
c573742845 | ||
|
|
dab01b8b9f | ||
|
|
9e58047980 | ||
|
|
6f8f37e8ff | ||
|
|
3ec950726b | ||
|
|
cec62dad44 | ||
|
|
89eca28d3a | ||
|
|
313e4854a0 | ||
|
|
8c1ffca530 | ||
|
|
7099774a3c | ||
|
|
925f6a9922 | ||
|
|
356200159a | ||
|
|
f0d8712275 | ||
|
|
fe3b66b018 | ||
|
|
83af8c6cdf | ||
|
|
ad5b5ea617 | ||
|
|
b439817467 | ||
|
|
276191cdcf | ||
|
|
8438b61747 | ||
|
|
f4a9f8dd79 | ||
|
|
f235c7f702 | ||
|
|
8e1e2c7840 | ||
|
|
0b632afbfe | ||
|
|
89dcd2566b | ||
|
|
314edea645 | ||
|
|
fe28bd93bd | ||
|
|
d882a5c8fe | ||
|
|
044dec0bfa | ||
|
|
ed8b6fe9db | ||
|
|
c98b4c8f45 | ||
|
|
b78d81d319 | ||
|
|
9f3be89e12 | ||
|
|
9e0b300354 | ||
|
|
dde6d26236 | ||
|
|
e6eac39759 | ||
|
|
5654e77625 | ||
|
|
c9f01d975d | ||
|
|
1fe213f900 | ||
|
|
802002b7a3 | ||
|
|
69a7c00841 | ||
|
|
c24f040888 | ||
|
|
0f225fc1a0 | ||
|
|
666506e834 | ||
|
|
21c0a2e7d7 | ||
|
|
03204f709e | ||
|
|
6827fc6cc9 | ||
|
|
cff4798249 | ||
|
|
93bf308179 | ||
|
|
166c4858a1 | ||
|
|
4b8fb02198 | ||
|
|
8432f7d8e2 | ||
|
|
ec675564c6 | ||
|
|
8c71178238 | ||
|
|
72df0bd1a0 | ||
|
|
6035cbd5c1 | ||
|
|
d7007dd3cc | ||
|
|
9c5daf5954 | ||
|
|
a57bc9e780 | ||
|
|
2e2bed4374 | ||
|
|
4eeaddf490 | ||
|
|
0cd53ca748 | ||
|
|
fa2bd920bd | ||
|
|
613f2cccf1 | ||
|
|
d91461f468 | ||
|
|
bcc497c865 | ||
|
|
2414f82c38 | ||
|
|
fd7d811b29 | ||
|
|
e533cd0ea1 | ||
|
|
9b7e5d69b2 | ||
|
|
0c5e6d867f | ||
|
|
32c646d0d2 | ||
|
|
35a6828209 | ||
|
|
2b66675a08 | ||
|
|
93638ac95a | ||
|
|
f489761e68 | ||
|
|
56ccde005e | ||
|
|
47e4aa0b84 | ||
|
|
b977d84f11 | ||
|
|
b7f14ff338 | ||
|
|
86211e5970 | ||
|
|
d8669d7c7d | ||
|
|
0d8e02a3fe | ||
|
|
1e681cead0 | ||
|
|
53f2423578 | ||
|
|
6cdfa05604 | ||
|
|
d55e879879 | ||
|
|
d377433997 | ||
|
|
207073bf36 | ||
|
|
316f31a4bb | ||
|
|
ada8efcdef | ||
|
|
99d0889cfd | ||
|
|
653a67c8ad | ||
|
|
b99893d1c3 | ||
|
|
a5c4d01649 | ||
|
|
82105a1543 | ||
|
|
c65910fd25 | ||
|
|
b5de464e85 | ||
|
|
81eb0b45b3 | ||
|
|
c772d1ab49 | ||
|
|
1af7c15801 | ||
|
|
e11901a7a6 | ||
|
|
0b2f84df54 | ||
|
|
a1ff40733b | ||
|
|
a61888e06c | ||
|
|
691259ec0d | ||
|
|
91e678da5b | ||
|
|
8a7c2b5228 | ||
|
|
e7710f59fa | ||
|
|
4039f3c249 | ||
|
|
6f46ccdd5a | ||
|
|
b79ba11d95 | ||
|
|
5a35184ba7 | ||
|
|
db801da658 | ||
|
|
f160fe3300 | ||
|
|
5d5dd3a3bc | ||
|
|
5fa65a4b38 | ||
|
|
cc34c75fc3 | ||
|
|
7fb1a34947 | ||
|
|
d087020139 | ||
|
|
4065e61ec5 | ||
|
|
da6b799a10 | ||
|
|
967c73efd1 | ||
|
|
6a35cd2a56 | ||
|
|
ebf03f8878 | ||
|
|
d7dbee5126 | ||
|
|
08930381e9 | ||
|
|
495c98a488 | ||
|
|
80a4b61e5c | ||
|
|
1d20968f82 | ||
|
|
ca8d569e63 | ||
|
|
670770e24a | ||
|
|
b55b138303 | ||
|
|
d0c7cb46e7 | ||
|
|
6e1e7de52b | ||
|
|
bb0a445a6b | ||
|
|
7157803c03 | ||
|
|
b7c5adae3d | ||
|
|
809b663350 | ||
|
|
1c4f1cb8c2 | ||
|
|
cace5f0ccb | ||
|
|
4aaa0b5d24 | ||
|
|
c0829b807c | ||
|
|
7d3cdb06e3 | ||
|
|
42f3884478 | ||
|
|
fcd46e2cdc | ||
|
|
f36f9d290d | ||
|
|
ae512cc4ed | ||
|
|
4fd59da003 | ||
|
|
e2d7cc5011 | ||
|
|
79413a4147 | ||
|
|
80b357da41 | ||
|
|
a54f516447 | ||
|
|
26ba1148e8 | ||
|
|
8b2b96d5c5 | ||
|
|
e21a506936 | ||
|
|
e86c6359d6 | ||
|
|
acce64b268 | ||
|
|
89713993cb | ||
|
|
cf24eaf9d2 | ||
|
|
cd1ac51b79 | ||
|
|
a7ded59393 | ||
|
|
205ef4ddeb | ||
|
|
145689783f | ||
|
|
21a21b04e6 | ||
|
|
87e19076ad | ||
|
|
9492b6ca66 | ||
|
|
4a45db781f | ||
|
|
0329d5fcc2 | ||
|
|
f39b5514c5 | ||
|
|
4700a6322e | ||
|
|
91a8fef1bb | ||
|
|
a56a66a227 | ||
|
|
1b262dac29 | ||
|
|
3b15ef1cb5 | ||
|
|
9ac695b9be | ||
|
|
05060803b2 | ||
|
|
e84f2e4a8b | ||
|
|
6fac9ee35b | ||
|
|
93cc31bc48 | ||
|
|
13ee4acd59 | ||
|
|
1360e7112c | ||
|
|
12987af561 | ||
|
|
e071a70ec2 | ||
|
|
48db75961e | ||
|
|
da0820ce0a | ||
|
|
ac81132435 | ||
|
|
946da43038 | ||
|
|
cad9450e16 | ||
|
|
0c7cc657cc | ||
|
|
ce4590f5ba | ||
|
|
cd3f5ca97d | ||
|
|
fc2a6d4dd1 | ||
|
|
85fe4c628e | ||
|
|
1bb7d9efd8 | ||
|
|
25b4dd1457 | ||
|
|
ea13414083 | ||
|
|
3e745474d3 | ||
|
|
5ad2f155c1 | ||
|
|
945b4192b1 | ||
|
|
3b71ba6090 | ||
|
|
9fc4697233 | ||
|
|
8a37b12f81 | ||
|
|
6ac7d7a1db | ||
|
|
291db1530c | ||
|
|
e77ea1b45c | ||
|
|
80db0175e0 | ||
|
|
15f90899eb | ||
|
|
e2ce483e0d | ||
|
|
41b31dc58d | ||
|
|
f8b9c7b2b7 | ||
|
|
a8000cb629 | ||
|
|
17f2371804 | ||
|
|
4d377de5ab | ||
|
|
956f6ffc15 | ||
|
|
600ae18d4b | ||
|
|
39aa02c19c | ||
|
|
7dcb86f500 | ||
|
|
f873255a19 | ||
|
|
4662ab1c80 | ||
|
|
b0b34e3a2a | ||
|
|
631da8a532 | ||
|
|
f80886fd68 | ||
|
|
cbe7ced335 | ||
|
|
955f6e74ab | ||
|
|
8a982e8b5e | ||
|
|
47f5fe7caf | ||
|
|
6e0f32f4ca | ||
|
|
62eca11bee | ||
|
|
13f5ec1524 | ||
|
|
e751d41ba7 | ||
|
|
7fd884b9c1 | ||
|
|
a98887589d | ||
|
|
0882f910df | ||
|
|
f65c22d329 | ||
|
|
485959195e | ||
|
|
28fb1bb0c0 | ||
|
|
cc12620868 | ||
|
|
9c89e64691 | ||
|
|
d432b18d23 | ||
|
|
98c0811525 | ||
|
|
77b16ae30d | ||
|
|
f4a4bdd006 | ||
|
|
ed7dddc3d8 | ||
|
|
4c6401c66b | ||
|
|
42441c99cc | ||
|
|
f775474062 | ||
|
|
c30e012e8d | ||
|
|
d90522bc4e | ||
|
|
0f7bec0d38 | ||
|
|
201b971ad7 | ||
|
|
1c72527dc8 | ||
|
|
5ce3e29913 | ||
|
|
1a7cff559a | ||
|
|
c28b0629fa | ||
|
|
6a3c56c131 | ||
|
|
d03c85da90 | ||
|
|
6a5d831331 | ||
|
|
2164c564f2 | ||
|
|
2a33cf4e60 | ||
|
|
6698a844f6 | ||
|
|
1c5ccefdef | ||
|
|
64bfd06be4 | ||
|
|
5bf154195d | ||
|
|
0239305f69 | ||
|
|
3ee5558c70 | ||
|
|
059dc12adc | ||
|
|
610c63cd15 | ||
|
|
fa3db3df11 | ||
|
|
4b4c0143d9 | ||
|
|
fa76ce1f05 | ||
|
|
59bb9c2083 | ||
|
|
689d64b62a | ||
|
|
f6c3386960 | ||
|
|
5055866a5a | ||
|
|
9f7d0c4404 | ||
|
|
7e5aa3e7c6 | ||
|
|
c7afc0b3df | ||
|
|
566ff08109 | ||
|
|
2247b61ed3 | ||
|
|
55d6971a23 | ||
|
|
7168167400 | ||
|
|
7e17c862cf | ||
|
|
bb60cc8568 | ||
|
|
857c4600dc | ||
|
|
88bd65998f | ||
|
|
ecbd382ae4 | ||
|
|
16f63a94c3 | ||
|
|
bd7ff2efd6 | ||
|
|
ed21342995 | ||
|
|
4c238f0e17 | ||
|
|
7c000adb87 | ||
|
|
2d4f073925 | ||
|
|
a25aab1426 | ||
|
|
54f593fa75 | ||
|
|
054de8e83f | ||
|
|
e6d1bf78a6 | ||
|
|
b4b8617a92 | ||
|
|
20bad4e126 | ||
|
|
3650609975 | ||
|
|
fe3b30ccbb | ||
|
|
ccae82e1f5 | ||
|
|
f1addb8b28 | ||
|
|
96f5108a37 | ||
|
|
3eeb10c0a6 | ||
|
|
ce3d2afad2 | ||
|
|
bdee719767 | ||
|
|
42263e0be9 | ||
|
|
ca08012bbf | ||
|
|
ca47ee273e | ||
|
|
eb299f500b | ||
|
|
a25b50d3aa | ||
|
|
b735a8663e | ||
|
|
769c6c8f61 | ||
|
|
b250056a61 | ||
|
|
e305e5f1bb | ||
|
|
18ce48e2c0 | ||
|
|
06c93c93fe | ||
|
|
869ddcfdda | ||
|
|
65e5e86c2b | ||
|
|
122b5e64e8 | ||
|
|
6c66d66b02 | ||
|
|
85d694b36e | ||
|
|
44cff3ae25 | ||
|
|
c2d7dc573a | ||
|
|
a30433ea12 | ||
|
|
6f7b462d53 | ||
|
|
95e5724117 | ||
|
|
1eaef70d2d | ||
|
|
3ed1e565f8 | ||
|
|
8d0c976a18 | ||
|
|
9165ec875a | ||
|
|
6a7997b41e | ||
|
|
2a9d863131 | ||
|
|
e3e9a86088 | ||
|
|
d5c787c213 | ||
|
|
559040e290 | ||
|
|
59ba5b7f0e | ||
|
|
474a43a424 | ||
|
|
fb276bdc6b | ||
|
|
1c1a26626b | ||
|
|
93f29d8cd9 | ||
|
|
0054dde600 | ||
|
|
794f2104bc | ||
|
|
036af9f55f | ||
|
|
5bde45cc86 | ||
|
|
ae1739f330 | ||
|
|
cfc09e0965 | ||
|
|
26c9b3426f | ||
|
|
963da34562 | ||
|
|
4adad381ce | ||
|
|
e561196f44 | ||
|
|
14bd1368cc | ||
|
|
415fc458be | ||
|
|
f2822f1a05 | ||
|
|
646dd718f5 | ||
|
|
83ed8ebb22 | ||
|
|
88aab487f1 | ||
|
|
6d1e30cd3c | ||
|
|
ab73969ea4 | ||
|
|
93b371eb8c | ||
|
|
b7007a1bdd | ||
|
|
a26c108464 | ||
|
|
2971e9729c | ||
|
|
6b2d923041 | ||
|
|
cb30db320e | ||
|
|
e1ae914a1d | ||
|
|
51aa4b0416 | ||
|
|
b0db168fb5 | ||
|
|
3b3338d132 | ||
|
|
cc50331745 | ||
|
|
2777bc142f | ||
|
|
c73545e25b | ||
|
|
b862e74ae4 | ||
|
|
0d662b8543 | ||
|
|
ea0b23b783 | ||
|
|
f15a187087 | ||
|
|
12a82cf91f | ||
|
|
5af2fa49c3 | ||
|
|
843fe30e46 | ||
|
|
0da561cd20 | ||
|
|
fd613de55e | ||
|
|
b2dc460db9 | ||
|
|
e5b7dfb524 | ||
|
|
de0b602748 | ||
|
|
d0d85e684d | ||
|
|
05b322414a | ||
|
|
38ee050a09 | ||
|
|
1ee4959c05 | ||
|
|
bc9086551b | ||
|
|
f9f0c99c1b | ||
|
|
a1b46711c4 | ||
|
|
f6bb071f84 | ||
|
|
746a0031f8 | ||
|
|
f78d0ae471 | ||
|
|
7879a33cdc | ||
|
|
a84a9847be | ||
|
|
0c54e19c5f | ||
|
|
d507f8a6d0 | ||
|
|
b18efe4e40 | ||
|
|
83d69939f3 | ||
|
|
aee5032597 | ||
|
|
c7cc78194f | ||
|
|
089db91b39 | ||
|
|
cb33043dd4 | ||
|
|
b207ecad6a | ||
|
|
48461001d2 | ||
|
|
12649d04c7 | ||
|
|
5033738f73 | ||
|
|
df80b9c5de | ||
|
|
ffa94268d7 | ||
|
|
b7f0996459 | ||
|
|
dcf196c2ae | ||
|
|
a71856801b | ||
|
|
84608fc581 | ||
|
|
c30a392fe8 | ||
|
|
d8c16de2ec | ||
|
|
2d04cbe97c | ||
|
|
ab65422034 | ||
|
|
3bde222242 | ||
|
|
d0af86d5bf | ||
|
|
73b17d4add | ||
|
|
93fa5323c5 | ||
|
|
b0c10c9ae5 | ||
|
|
b8ed1b9646 | ||
|
|
0912e8f16d | ||
|
|
327dc2c835 | ||
|
|
8f937788ce | ||
|
|
52ba725fa5 | ||
|
|
a39249454e | ||
|
|
c1f2304c88 | ||
|
|
85c6e28d47 | ||
|
|
d1a253f469 | ||
|
|
6aa57f5c73 | ||
|
|
023aeae9e6 | ||
|
|
38880ab5a4 | ||
|
|
4e19324177 | ||
|
|
9757d1b67a | ||
|
|
5422b108af | ||
|
|
0d650b183f | ||
|
|
fa432bb9d1 | ||
|
|
81e4e26dc5 | ||
|
|
4f6a66f9c6 | ||
|
|
127d273ada | ||
|
|
469d4f81eb | ||
|
|
8f08a14115 | ||
|
|
4ac43047d0 | ||
|
|
4257fdded3 | ||
|
|
56298870f6 | ||
|
|
48354185dd | ||
|
|
5f0cbcf26d | ||
|
|
ffc875c2d6 | ||
|
|
8a180e3892 | ||
|
|
c4d3d734b1 | ||
|
|
6e8c244b77 | ||
|
|
ac2ed68228 | ||
|
|
fb27c89282 | ||
|
|
74bed6edcb | ||
|
|
49a854fa7e | ||
|
|
5adabbbcaa | ||
|
|
42eae3e1b4 | ||
|
|
518d2b0129 | ||
|
|
bc8c786b80 | ||
|
|
5ab8a6f6f4 | ||
|
|
385a31ec11 | ||
|
|
5c49954f69 | ||
|
|
6ce7a1ba1f | ||
|
|
8c1335626f | ||
|
|
8b0eec097b | ||
|
|
a39c8aa5c5 | ||
|
|
27745ceebb | ||
|
|
64b213fe42 | ||
|
|
eaca84e9ba | ||
|
|
bca0f4d66d | ||
|
|
8c17a37d1a | ||
|
|
979a3232f9 | ||
|
|
47dbbe030c | ||
|
|
d05e719ce3 | ||
|
|
12f4afcba2 | ||
|
|
cd2638d11a | ||
|
|
c87796e51c | ||
|
|
d47b555e12 | ||
|
|
4e568e1fdf | ||
|
|
0688c53675 | ||
|
|
6d523f9c7f | ||
|
|
0f4f274bc7 | ||
|
|
09b8c3b94e | ||
|
|
1dbb676f38 | ||
|
|
331866bd1d | ||
|
|
2515096f56 | ||
|
|
8868023ce9 | ||
|
|
dd9d6f8f83 | ||
|
|
21e403c908 | ||
|
|
f66aa57594 | ||
|
|
506cb980b1 | ||
|
|
937e2cf853 | ||
|
|
82bf71ee19 | ||
|
|
eb9e7b9fee | ||
|
|
b02942c0b0 | ||
|
|
56e813ccb7 | ||
|
|
cf5b94d471 | ||
|
|
5d941f702a | ||
|
|
b46925e7e0 | ||
|
|
e676756cda | ||
|
|
591958c59c | ||
|
|
63a80ff696 | ||
|
|
ee6e3a7a96 | ||
|
|
1d607cb937 | ||
|
|
c5ced39665 | ||
|
|
7b2e77807d | ||
|
|
7a623ef19c | ||
|
|
f292be40b2 | ||
|
|
0166330c73 | ||
|
|
3cc9d47032 | ||
|
|
128708db2d | ||
|
|
3027ee9f3e | ||
|
|
51c673e62d | ||
|
|
56bd83f6fb | ||
|
|
2473bb6902 | ||
|
|
da0e153a05 | ||
|
|
394e81af45 | ||
|
|
6af8d70cc1 | ||
|
|
2dea11a9e3 | ||
|
|
cd55c12e44 | ||
|
|
cb2cf7c9b1 | ||
|
|
494786be26 | ||
|
|
27013d6a03 | ||
|
|
3ba91a6513 | ||
|
|
c547090ee0 | ||
|
|
f87b9c15d3 | ||
|
|
3d76bcde2e | ||
|
|
1a6f49ce45 | ||
|
|
745a7fc034 | ||
|
|
6158a0ad45 | ||
|
|
a51f684c41 | ||
|
|
681e207af5 | ||
|
|
f651b7bfb0 | ||
|
|
6c53e12b49 | ||
|
|
01c9157fce | ||
|
|
3448e94171 | ||
|
|
08085be360 | ||
|
|
3809866d99 | ||
|
|
52a05c9f67 | ||
|
|
ba5aa0c83b | ||
|
|
939486fa05 | ||
|
|
c8d98f6901 | ||
|
|
38cfeeb558 | ||
|
|
cf9f8d0535 | ||
|
|
9e43737e18 | ||
|
|
5d03ad24c3 | ||
|
|
ac6721edac | ||
|
|
126cf27972 | ||
|
|
0a677c7f83 | ||
|
|
63e35941e2 | ||
|
|
3ae6992641 | ||
|
|
a243532730 | ||
|
|
ed99f5e6d2 | ||
|
|
7d1bf95d93 | ||
|
|
93cbf59e9e | ||
|
|
e8f9796752 | ||
|
|
adb423d96b | ||
|
|
74acad3628 | ||
|
|
541adff4d4 | ||
|
|
39189a746b | ||
|
|
f82e938ae8 | ||
|
|
34520c0b4f | ||
|
|
121148da72 | ||
|
|
1e34db98a8 | ||
|
|
9f821d6406 | ||
|
|
70a6d96748 | ||
|
|
4a440b6f0a | ||
|
|
fdfc5c4a41 | ||
|
|
6699c0ee7f | ||
|
|
8807b1aa3c | ||
|
|
2aff4239cc | ||
|
|
d99d18759b | ||
|
|
68c3be3e16 | ||
|
|
f148b106a5 | ||
|
|
9ffabf4c85 | ||
|
|
aebfd61539 | ||
|
|
8dee79d380 | ||
|
|
d3c1ea5b0f | ||
|
|
2835a2f87d | ||
|
|
062a098ac5 | ||
|
|
5563103453 | ||
|
|
a1d62eb92b | ||
|
|
138a021fad | ||
|
|
bdf0e95a12 | ||
|
|
90674b825a | ||
|
|
b3bc09f898 | ||
|
|
320459c2c6 | ||
|
|
8d14c10b8c | ||
|
|
2c2b252dac | ||
|
|
8efd1e3ae0 | ||
|
|
e7adc6b7f9 | ||
|
|
fc7d204d4b | ||
|
|
2153e7098c | ||
|
|
29beabd683 | ||
|
|
80c346060f | ||
|
|
4e10cd654f | ||
|
|
a12653a25d | ||
|
|
f683ae95c3 | ||
|
|
6bdeb18253 | ||
|
|
8f1f23c991 | ||
|
|
42345af443 | ||
|
|
a5797da100 | ||
|
|
0821e6acc2 | ||
|
|
0fb87c7926 | ||
|
|
b578487d01 | ||
|
|
cdf81eb1d7 | ||
|
|
97491658c6 | ||
|
|
b2b3653d67 | ||
|
|
de102bec5e | ||
|
|
3598f2855f | ||
|
|
f36a479d0f | ||
|
|
5363c013e6 | ||
|
|
b609328ac1 | ||
|
|
65c2b103b1 | ||
|
|
22a89ba914 | ||
|
|
fda9b6f75d | ||
|
|
b29e9b706e | ||
|
|
bd145ad6b2 | ||
|
|
fc71ec9785 | ||
|
|
cce43790d2 | ||
|
|
1e31e1fff8 | ||
|
|
af2a0c9747 | ||
|
|
d30488da87 | ||
|
|
59ba2fc7ab | ||
|
|
1936052e79 | ||
|
|
103ec5d72a | ||
|
|
9139ec3e5c | ||
|
|
7430463b33 | ||
|
|
6f2d067f3a | ||
|
|
d31b9c9caa | ||
|
|
2670d37542 | ||
|
|
617fd69bcc | ||
|
|
5fcd9d45a3 | ||
|
|
b6cd19b78b | ||
|
|
6a3a19da68 | ||
|
|
efd103004c | ||
|
|
18e033cdd8 | ||
|
|
2a4ecc1d28 | ||
|
|
c0c91678ba | ||
|
|
7a531ed272 | ||
|
|
93e3fcb386 | ||
|
|
143fc90a4c | ||
|
|
f65feaf9da | ||
|
|
a17b0effa1 | ||
|
|
b0d5c7a1a5 | ||
|
|
9c4a407fdc | ||
|
|
67b2151e3c | ||
|
|
b8024469da | ||
|
|
7f5c826bb1 | ||
|
|
acad3f3963 | ||
|
|
1f6ce24eaa | ||
|
|
4a82f21cc3 | ||
|
|
0cf707599d | ||
|
|
e2e6bdc4cb | ||
|
|
8136186554 | ||
|
|
9b733041af | ||
|
|
9e01876747 | ||
|
|
ee909b8c08 | ||
|
|
fdf1982982 | ||
|
|
88ccd7f537 | ||
|
|
c6cd9ceb75 | ||
|
|
ce735357d6 | ||
|
|
887dee83eb | ||
|
|
fd73a2bc8b | ||
|
|
21b5f90a33 | ||
|
|
d1c5cd7b0a | ||
|
|
656a36061a | ||
|
|
05384f581f | ||
|
|
84f3c104b2 | ||
|
|
761f7e40de | ||
|
|
b760c21414 | ||
|
|
bb651298c4 | ||
|
|
8850a11072 | ||
|
|
499338e80d | ||
|
|
c12f8fa254 | ||
|
|
7ae36b8667 | ||
|
|
591e2db712 | ||
|
|
8414563ad0 | ||
|
|
85fc57faa3 | ||
|
|
c8e10a004b | ||
|
|
e1fac2404c | ||
|
|
65adf2a860 | ||
|
|
dea6906ae9 | ||
|
|
22ccae3301 | ||
|
|
58d58b0af7 | ||
|
|
ce5daaa835 | ||
|
|
8fe0681681 | ||
|
|
3987e644a8 | ||
|
|
f073415510 | ||
|
|
4c69bcd97a | ||
|
|
05aac0879e | ||
|
|
cb5dafe8db | ||
|
|
82c7d45c4b | ||
|
|
f81677278f | ||
|
|
2ef6011c7a | ||
|
|
6e0b5358fb | ||
|
|
e783e3c794 | ||
|
|
8965d9bd70 | ||
|
|
37fe9bad6d | ||
|
|
a4daf4c228 | ||
|
|
ae080c3ad3 | ||
|
|
ad0c08c2de | ||
|
|
7b93791c3f | ||
|
|
172df2cd0c | ||
|
|
b395cd7ccc | ||
|
|
8ec6b15dc2 | ||
|
|
2a2f82a745 | ||
|
|
13a7801421 | ||
|
|
1a5cd1c1ff | ||
|
|
224974f218 | ||
|
|
b96556f80f | ||
|
|
c29be5b945 | ||
|
|
21b60db107 | ||
|
|
baa3f573ae | ||
|
|
0243e93e97 | ||
|
|
778bbc6d08 | ||
|
|
6ae502f181 | ||
|
|
088720db22 | ||
|
|
3d6ecc064f | ||
|
|
333bf19c00 | ||
|
|
25599b91b2 | ||
|
|
18305a1994 | ||
|
|
e6f56bf5fa | ||
|
|
681c6f4e5e | ||
|
|
11f1c3c4ff | ||
|
|
9f4eb36c99 | ||
|
|
cbbafafb46 | ||
|
|
9e853e487d | ||
|
|
0e91ad3ed3 | ||
|
|
c5e894aab2 | ||
|
|
49aaeb3080 | ||
|
|
1c7ac8c761 | ||
|
|
e2492a1426 | ||
|
|
f750391c2e | ||
|
|
95d65a02bc | ||
|
|
2685037c82 | ||
|
|
61c46994cd | ||
|
|
8b8e6501bc | ||
|
|
c4184ef733 | ||
|
|
6a5049b22c | ||
|
|
6cbcfc7ab8 | ||
|
|
564d06e84c | ||
|
|
8398799e1c | ||
|
|
c43d34d0cf | ||
|
|
a188f4ebfe | ||
|
|
e59063a13c | ||
|
|
2f95534bd0 | ||
|
|
2b0c8d45fa | ||
|
|
c88cf6359e | ||
|
|
62405c79c3 | ||
|
|
28dedd66b3 | ||
|
|
f26146bc23 | ||
|
|
2a0489a21c | ||
|
|
0980c4438a | ||
|
|
f7c93b68d8 | ||
|
|
f7e769f8c4 | ||
|
|
7f1ce6ebfd | ||
|
|
4715ef2633 | ||
|
|
703d19b256 | ||
|
|
f7d7fbb9b0 | ||
|
|
a6baf1f370 | ||
|
|
874238f61e | ||
|
|
9968963b97 | ||
|
|
5b68e46bb7 | ||
|
|
9a83521ad6 | ||
|
|
2a7eabfb1c | ||
|
|
b4a0ae20c9 | ||
|
|
87493a9bc9 | ||
|
|
0f9dac511c | ||
|
|
11724fd2ad | ||
|
|
c0955d33de | ||
|
|
bc5e686fde | ||
|
|
541489da4d | ||
|
|
79200d4df6 | ||
|
|
578bae3c37 | ||
|
|
37490d1a44 | ||
|
|
3919bb2e7d | ||
|
|
93e8434a87 | ||
|
|
97a1983c59 | ||
|
|
42e60bc7c5 | ||
|
|
93dc8fce10 | ||
|
|
34d4cde7c4 | ||
|
|
66788af44d | ||
|
|
1a8df98cf2 | ||
|
|
0fb0ac7994 | ||
|
|
24f278c961 | ||
|
|
d45001e4c9 | ||
|
|
95a0e669a2 | ||
|
|
b80e4c552a | ||
|
|
933dc0f5c8 | ||
|
|
6a3904fc48 | ||
|
|
b045dbde0f | ||
|
|
b85ebc73c9 | ||
|
|
7d76fc4945 | ||
|
|
90332ecf6e | ||
|
|
0c4c89f3ca | ||
|
|
62177d2ca3 | ||
|
|
144830bc05 | ||
|
|
24a5917b44 | ||
|
|
b38c5f095c | ||
|
|
d7ad7f0c70 | ||
|
|
dc391439ba | ||
|
|
e44c43deeb | ||
|
|
c795faf167 | ||
|
|
dad0913dcb | ||
|
|
e5db9aa874 | ||
|
|
2d0b60898c | ||
|
|
c25fc8cc24 | ||
|
|
bddeac4b45 | ||
|
|
1aa42a6779 | ||
|
|
73b3aec3ed | ||
|
|
9568cbac0a | ||
|
|
a60c742fa4 | ||
|
|
6313a31668 | ||
|
|
15a4be2db1 | ||
|
|
0c71d8d4e6 | ||
|
|
4409374c47 | ||
|
|
4299e0a3a3 | ||
|
|
c4af15c2e2 | ||
|
|
eacde4008e | ||
|
|
358e24ace5 | ||
|
|
7317472b5f | ||
|
|
9271684e5a | ||
|
|
929d462d05 | ||
|
|
e0ce06483c | ||
|
|
95e78088d6 | ||
|
|
dd72a4542e | ||
|
|
5fe0a68b46 | ||
|
|
61486749f8 | ||
|
|
31f574ed36 | ||
|
|
d9ff07b605 | ||
|
|
dbdb3d6af6 | ||
|
|
4c0a213840 | ||
|
|
aa65bad62b | ||
|
|
60c469ed06 | ||
|
|
cf87ae2e71 | ||
|
|
ea443cfa21 | ||
|
|
5e49e3cfaa | ||
|
|
8574c575f5 | ||
|
|
d2aecc0412 | ||
|
|
710d537f39 | ||
|
|
9e44c65391 | ||
|
|
c36491cfb6 | ||
|
|
c2be0268b1 | ||
|
|
4cda6dbcfb | ||
|
|
e34afea346 | ||
|
|
1ea71c89a8 | ||
|
|
856ffea797 | ||
|
|
9efae57162 | ||
|
|
09d4cb7b38 | ||
|
|
fb4f580922 | ||
|
|
15842f3464 | ||
|
|
e18846fac5 | ||
|
|
4aeb8ea1b0 | ||
|
|
6a415b54d0 | ||
|
|
5abdfd9751 | ||
|
|
ab65619b99 | ||
|
|
88629f7aa6 | ||
|
|
fb11af5859 | ||
|
|
550b72200d | ||
|
|
cd9d19a2bb | ||
|
|
ca9e43d0f0 | ||
|
|
04d2f90ab3 | ||
|
|
906cdb1584 | ||
|
|
1978ec8b71 | ||
|
|
28f32a3ca6 | ||
|
|
3b7a448b07 | ||
|
|
8f0c1efc6f | ||
|
|
c10b673fef | ||
|
|
bfd9f79267 | ||
|
|
f7c596317b | ||
|
|
e4debaf4ba | ||
|
|
4eeba053d5 | ||
|
|
7263a2e7ab | ||
|
|
ef7f25481c | ||
|
|
35d17abeb0 | ||
|
|
33472d3a8e | ||
|
|
e60ddf7ecd | ||
|
|
579332db7d | ||
|
|
b34c031139 | ||
|
|
46bc2e7183 | ||
|
|
26ddbf9466 | ||
|
|
b67dc452b2 | ||
|
|
b37b6addac | ||
|
|
a2dfe70cd8 | ||
|
|
20a2b4e051 | ||
|
|
d7c3c3fcf9 | ||
|
|
7d77a4b31f | ||
|
|
59217ccbbe | ||
|
|
f674953b87 | ||
|
|
b8798c580f | ||
|
|
2b58e8a253 | ||
|
|
f744513941 | ||
|
|
e8ecbbdc6a | ||
|
|
1f7c69e19e | ||
|
|
de4044d5b1 | ||
|
|
1503241c7a | ||
|
|
37a1261693 | ||
|
|
446d57122c | ||
|
|
1e8807ac0a | ||
|
|
40ac1bca84 | ||
|
|
bff3b935fb | ||
|
|
9faa9f41e0 | ||
|
|
9fa43f2386 | ||
|
|
f2397256e2 | ||
|
|
e5ad7c36ec | ||
|
|
3b8ba5dfa6 | ||
|
|
2e1b58a876 | ||
|
|
de7baa0b41 | ||
|
|
b361a0d2ff | ||
|
|
0acd849f18 | ||
|
|
ed4ff15682 | ||
|
|
de276ddfa9 | ||
|
|
192347ea3a | ||
|
|
d618cfdf0e | ||
|
|
0f0762a24c | ||
|
|
89a49db558 | ||
|
|
1ee51a54de | ||
|
|
68f394a38b | ||
|
|
32c94ac31a | ||
|
|
af476e0d10 | ||
|
|
b504d07afe | ||
|
|
9544fbdff9 | ||
|
|
431365d1f8 | ||
|
|
693b4adb4b | ||
|
|
1a637cb1d8 | ||
|
|
0d952641ed | ||
|
|
418e2a00ce | ||
|
|
d1d2de33e6 | ||
|
|
ab84faa3ca | ||
|
|
fc7f83c60b | ||
|
|
af028c9bad | ||
|
|
29daae551c | ||
|
|
e1a91ea420 | ||
|
|
bd60ed8df0 | ||
|
|
6b6d20732e | ||
|
|
4d60b75240 | ||
|
|
fc9900c8f6 | ||
|
|
629346b6a7 | ||
|
|
e95be7cd3f | ||
|
|
1bfb50f29a | ||
|
|
8187c35ea8 | ||
|
|
0d6028d837 | ||
|
|
2127eaea22 | ||
|
|
7794a623aa | ||
|
|
0443edc034 | ||
|
|
a7f8dbac56 | ||
|
|
b0ec124329 | ||
|
|
b40121c9b0 | ||
|
|
cc9984a082 | ||
|
|
c22758d794 | ||
|
|
1b48cd157a | ||
|
|
362402ffbf | ||
|
|
5ce868b100 | ||
|
|
823d1cc004 | ||
|
|
2ce5beae56 | ||
|
|
34fcbbd7b7 | ||
|
|
bdde96be95 | ||
|
|
26b7a49d82 | ||
|
|
fa8a5a2033 | ||
|
|
c87a56ef37 | ||
|
|
2e04ff93ca | ||
|
|
a9f96b9d62 | ||
|
|
8f855f5dde | ||
|
|
6d3fa25d5f | ||
|
|
57b7bcf8f4 | ||
|
|
f30d75ae5d | ||
|
|
e087e7782c | ||
|
|
17fa93035a | ||
|
|
f0d7582845 | ||
|
|
75bdb32828 | ||
|
|
fd633d2cee | ||
|
|
a6d7d83fb3 | ||
|
|
a450b9d12f | ||
|
|
5ac3eeef11 | ||
|
|
9838c2ccff | ||
|
|
16cee6feb2 | ||
|
|
21c86f9ac6 | ||
|
|
6044feb7fd | ||
|
|
7dc59ac342 | ||
|
|
16f156be3f | ||
|
|
64dd09becc | ||
|
|
19dc18f7c5 | ||
|
|
4e63b82f5e | ||
|
|
6bc2abae3b | ||
|
|
6c7f306baa | ||
|
|
c56517b801 | ||
|
|
b5e405b2b4 | ||
|
|
354f46f41b | ||
|
|
b34a50b381 | ||
|
|
a973c53ea2 | ||
|
|
ee7b10f064 | ||
|
|
c1ad6b5829 | ||
|
|
9eaaaaa1e3 | ||
|
|
115707a0f1 | ||
|
|
3179357666 | ||
|
|
cb7433d70a | ||
|
|
62021fc291 | ||
|
|
ab3ff07c93 | ||
|
|
22ab62a729 | ||
|
|
ff7a8bfdae | ||
|
|
27ed109394 | ||
|
|
ea807eda04 | ||
|
|
36321f809d | ||
|
|
254df70148 | ||
|
|
759cef6e01 | ||
|
|
02364151bc | ||
|
|
9178effd9f | ||
|
|
cce9e280ce | ||
|
|
5468d8b08e | ||
|
|
497f629761 | ||
|
|
6f08601479 | ||
|
|
6d6739ccea | ||
|
|
d2511e66fb | ||
|
|
e23eb14809 | ||
|
|
f5dbe2156c | ||
|
|
723b94da05 | ||
|
|
7ecdced486 | ||
|
|
13b72df762 | ||
|
|
95b38b7f79 | ||
|
|
3fb5052223 | ||
|
|
62b93a0785 | ||
|
|
371b45c420 | ||
|
|
4dcf14d026 | ||
|
|
854ee95d69 | ||
|
|
9ac536a1dd | ||
|
|
9820bee5e7 | ||
|
|
b02302a5cf | ||
|
|
9633ad35a8 | ||
|
|
4bd6294862 | ||
|
|
63e525697f | ||
|
|
4cdd46819f | ||
|
|
0450371e28 | ||
|
|
d9e5f8183f | ||
|
|
abbaf9b593 | ||
|
|
126c59b4a4 | ||
|
|
b7be225846 | ||
|
|
041eb4e69d | ||
|
|
04157f2502 | ||
|
|
189222cb66 | ||
|
|
6835c4aaf5 | ||
|
|
875a2ef3a9 | ||
|
|
bfbf18688b | ||
|
|
9de694c46b | ||
|
|
220c5ee47d | ||
|
|
99f2207fd4 | ||
|
|
50623f32f6 | ||
|
|
b5105a1e57 | ||
|
|
9beb745765 | ||
|
|
0b1dd757be | ||
|
|
a7c61d8e20 | ||
|
|
4988fb27dc | ||
|
|
db1f0825ce | ||
|
|
c7b2a5f2df | ||
|
|
b9cbd29bc4 | ||
|
|
84b53ecb42 | ||
|
|
66da28a02f | ||
|
|
15f6bbebe1 | ||
|
|
2daef545dd | ||
|
|
aac6b3d02d | ||
|
|
fda0e9a4cb | ||
|
|
f1da5d433a | ||
|
|
dead2003fa | ||
|
|
44dfa53d45 | ||
|
|
769a9f65a9 | ||
|
|
5b78159cb5 | ||
|
|
c384d53d75 | ||
|
|
683e44baf9 | ||
|
|
c845d0cf81 | ||
|
|
243a4deae7 | ||
|
|
fe80d6305c | ||
|
|
a0e7113397 | ||
|
|
d47b1b0e56 | ||
|
|
fa87b0fcef | ||
|
|
0f1bce0f32 | ||
|
|
bc0b5b1181 | ||
|
|
38833b9cf4 | ||
|
|
dda4f48397 | ||
|
|
bb712b1ad5 | ||
|
|
6ddb5b3477 | ||
|
|
c4253b73fa | ||
|
|
3c1f6c2436 | ||
|
|
83484cfb60 | ||
|
|
a106082397 | ||
|
|
6498248cef | ||
|
|
b2f94b274c | ||
|
|
34b85b3560 | ||
|
|
7bb30efb50 | ||
|
|
7df2b6b252 | ||
|
|
017d13a7b0 | ||
|
|
513647b272 | ||
|
|
280b1576c3 | ||
|
|
2dfd449561 | ||
|
|
65b1b9256a | ||
|
|
7866f116df | ||
|
|
4544e1556a | ||
|
|
8c7d96ad63 | ||
|
|
bd23e1f7fc | ||
|
|
99187a2d22 | ||
|
|
8974caf162 | ||
|
|
f364c03964 | ||
|
|
730eb1f472 | ||
|
|
3760be946f | ||
|
|
7db74b84cf | ||
|
|
4c0a25db2a | ||
|
|
67af8c2bad | ||
|
|
92531929f3 | ||
|
|
0256a6332c | ||
|
|
bd4454d8ad | ||
|
|
4187581be5 | ||
|
|
2a07636623 | ||
|
|
8893344b76 | ||
|
|
f0ea65dc36 | ||
|
|
53756ee966 | ||
|
|
8a2ee1ed59 | ||
|
|
9bc9c10fb3 | ||
|
|
4407a17551 | ||
|
|
c7d6395aa6 | ||
|
|
649a65b8ee | ||
|
|
949b64ca53 | ||
|
|
cef906b24d | ||
|
|
040c2c3d1b | ||
|
|
91ed6a83c1 | ||
|
|
d8ac8a5f1c | ||
|
|
18954abf54 | ||
|
|
ed7ee12e7e | ||
|
|
42d99d2b2a | ||
|
|
d24f13cd73 | ||
|
|
e8fad11128 | ||
|
|
27a8d19f31 | ||
|
|
387a3eeba3 | ||
|
|
3a3578aecc | ||
|
|
a8784eff9f | ||
|
|
b26ae5886d | ||
|
|
e6696f8d23 | ||
|
|
2989afdf84 | ||
|
|
9c1b015689 | ||
|
|
3b1fbef95c | ||
|
|
2e6acc86e1 | ||
|
|
c6e981a363 | ||
|
|
43de5afcf6 | ||
|
|
fb40035957 | ||
|
|
93549259a0 | ||
|
|
f39d3ea43e | ||
|
|
7ad169c7a8 | ||
|
|
052bba4578 | ||
|
|
d1eb01e535 | ||
|
|
3e20a60c37 | ||
|
|
984c136349 | ||
|
|
81f92d8f62 | ||
|
|
427051d04c | ||
|
|
c1a14f93d8 | ||
|
|
f07ee85078 | ||
|
|
51b118d516 | ||
|
|
d5ec4692d3 | ||
|
|
a62336d433 | ||
|
|
abb2cbeeaa | ||
|
|
33381857ff | ||
|
|
f1abd95ed0 | ||
|
|
43b155e8b4 | ||
|
|
6ee5415ea4 | ||
|
|
886ae378c5 | ||
|
|
60d886c052 | ||
|
|
d700cc1f55 | ||
|
|
5c212e92c3 | ||
|
|
1dde4ee959 | ||
|
|
9fe450f2dc | ||
|
|
b84e5f25f2 | ||
|
|
b52ff061b4 | ||
|
|
b7ae79514f | ||
|
|
a90c7af708 | ||
|
|
176e092a6c | ||
|
|
94ccde160a | ||
|
|
d8746c6c70 | ||
|
|
4ff4ca72d3 | ||
|
|
47055f92df | ||
|
|
7a4a44292c | ||
|
|
98270a8601 | ||
|
|
182ca255f7 | ||
|
|
3d33713c2b | ||
|
|
ebf698fdb6 | ||
|
|
9d089f9b18 | ||
|
|
c976833f46 | ||
|
|
1819b7563a | ||
|
|
548a21a5ec | ||
|
|
ad1dce7fb1 | ||
|
|
302a358476 | ||
|
|
74dd9f2778 | ||
|
|
495262f902 | ||
|
|
d10a078473 | ||
|
|
8d9fd7cb0e | ||
|
|
8bd8a923ba | ||
|
|
764a0c31e5 | ||
|
|
1ea0382055 | ||
|
|
bd673dc791 | ||
|
|
4fa00ba283 | ||
|
|
deef011dbf | ||
|
|
afeecf9d9f | ||
|
|
e792f00363 | ||
|
|
f7d9dd4824 | ||
|
|
dfc60e8bf1 | ||
|
|
655e752c07 | ||
|
|
ebdbd1767a | ||
|
|
4eca49697a | ||
|
|
7fa2371bbd | ||
|
|
60c41cadba | ||
|
|
97769b63ad | ||
|
|
bc482e29b0 | ||
|
|
62695ceed4 | ||
|
|
605d5a29c0 | ||
|
|
fdc7e9d1e4 | ||
|
|
dcc7ad45bc | ||
|
|
265f153449 | ||
|
|
ba9aa3657c | ||
|
|
115d666fff | ||
|
|
42ce1a3b61 | ||
|
|
a7b912393c | ||
|
|
e82f17842e | ||
|
|
4838c86ca9 | ||
|
|
d6b9fd2860 | ||
|
|
60dac1aa29 | ||
|
|
8dd071bcfa | ||
|
|
d92d693df3 | ||
|
|
d16bd5104e | ||
|
|
d7e8da6321 | ||
|
|
aec3fd524a | ||
|
|
14b0323bf6 | ||
|
|
b482847779 | ||
|
|
8c5752de23 | ||
|
|
267bffb0ec | ||
|
|
0546216228 | ||
|
|
a46ea2c07f | ||
|
|
ed4e1ee0ba | ||
|
|
6ac3716594 | ||
|
|
42bad3ea6b | ||
|
|
f9c4eda1fc | ||
|
|
688665e730 | ||
|
|
a676255231 | ||
|
|
d227edeefd | ||
|
|
34c3e2dab3 | ||
|
|
2c0bbc06b7 | ||
|
|
299551428f | ||
|
|
d0ac9c2a5a | ||
|
|
a69368e855 | ||
|
|
84b0e2f113 | ||
|
|
eb695d5553 | ||
|
|
b5946f3752 | ||
|
|
371435afd0 | ||
|
|
0ba46403c6 | ||
|
|
cac43a1f5f | ||
|
|
7771a67abe | ||
|
|
9cd8812d8b | ||
|
|
4b0b3fc98a | ||
|
|
c6afd44c1c | ||
|
|
dbb84245a0 | ||
|
|
15a7c4d8dd | ||
|
|
a842938cfe | ||
|
|
3f83038061 | ||
|
|
01568f8fd3 | ||
|
|
1ee4d5aaf4 | ||
|
|
f9b74642a2 | ||
|
|
401e3a7282 | ||
|
|
32b2b388c8 | ||
|
|
013643782f | ||
|
|
cb064f9e5a | ||
|
|
52c97c47ab | ||
|
|
5f06d066e7 | ||
|
|
a7a211fc85 | ||
|
|
5540601918 | ||
|
|
22f99601d9 | ||
|
|
2fe2e52249 | ||
|
|
6caa598dd7 | ||
|
|
aeeb9b719a | ||
|
|
36f1808615 | ||
|
|
0ce5f34f8c | ||
|
|
579ae99d1b | ||
|
|
fa702c0240 | ||
|
|
34bc807bd5 | ||
|
|
71d49badcc | ||
|
|
3dfcc278e0 | ||
|
|
e312fa392d | ||
|
|
bda28e5882 | ||
|
|
68c2abc429 | ||
|
|
b0727d6f2b | ||
|
|
c66be063aa | ||
|
|
1f0165f895 | ||
|
|
b1ae5dc2b6 | ||
|
|
df228f8829 | ||
|
|
dc2d54edf2 | ||
|
|
d39c554541 | ||
|
|
314b2a5583 | ||
|
|
ce30c1179e | ||
|
|
cbb3126b28 | ||
|
|
a3413ba96d | ||
|
|
2b625e4aa5 | ||
|
|
df74626ca2 | ||
|
|
10373ca6fc | ||
|
|
3dcd08bd4a | ||
|
|
a945daf96d | ||
|
|
22116dabc3 | ||
|
|
5494d95b6b | ||
|
|
9ab686b3e0 | ||
|
|
5b24440e8c | ||
|
|
44deff987c | ||
|
|
7273ac0d34 | ||
|
|
ceb9834a27 | ||
|
|
4eebf25f1c | ||
|
|
865ef2ff6e | ||
|
|
8138ba6ecb | ||
|
|
f1c0b52677 | ||
|
|
a4cb62d6d6 | ||
|
|
e4062c6031 | ||
|
|
08844f31c9 | ||
|
|
4dfdba001b | ||
|
|
8dbf982ebe | ||
|
|
031255a946 | ||
|
|
8dfbe80b41 | ||
|
|
2bcc997e4b | ||
|
|
263e79be53 | ||
|
|
d031a8b423 | ||
|
|
7bec96e4b2 | ||
|
|
6bb1bacfba | ||
|
|
95a4aaf8fd | ||
|
|
387c64b74c | ||
|
|
4d068eee26 | ||
|
|
ece732ba41 | ||
|
|
8f40dc1a8c | ||
|
|
c9a6d4c05a | ||
|
|
a66b4e257a | ||
|
|
3796805d98 | ||
|
|
a3d09e95d5 | ||
|
|
626846c37b | ||
|
|
8bf1ac6577 | ||
|
|
58c0bce4cf | ||
|
|
3a82dc6aad | ||
|
|
e42b9e2866 | ||
|
|
8a85acff32 | ||
|
|
b450ea24a2 | ||
|
|
4fa92dc069 | ||
|
|
61a80c9b2d | ||
|
|
bcfd0f7ea3 | ||
|
|
c404b3e0ab | ||
|
|
b246133b3b | ||
|
|
5b28d7bc03 | ||
|
|
8adaefcdb9 | ||
|
|
e64b4d5c04 | ||
|
|
59caccfeae | ||
|
|
bbd3333b5f | ||
|
|
1ce7f32b5d | ||
|
|
95f18dbf15 | ||
|
|
9ed2e3bbf2 | ||
|
|
8b3cd23045 | ||
|
|
072241eb10 | ||
|
|
84a8500323 | ||
|
|
a8911fc979 | ||
|
|
04ba0b2f67 | ||
|
|
d1e5bc5c19 | ||
|
|
38364ef07f | ||
|
|
b25d8db994 | ||
|
|
989ed95891 | ||
|
|
d15ffc48a3 | ||
|
|
06df8c7bed | ||
|
|
950241d52f | ||
|
|
a147c12f72 | ||
|
|
874828c2ac | ||
|
|
3369e5e755 | ||
|
|
9b3930ea62 | ||
|
|
987d0db806 | ||
|
|
97530e4095 | ||
|
|
4c285d4d8a | ||
|
|
cd5fbc1492 | ||
|
|
2e379300a6 | ||
|
|
65c19d073c | ||
|
|
eb013f3492 | ||
|
|
b2fd651abe | ||
|
|
d4b02e6a3f | ||
|
|
537cb65f26 | ||
|
|
f61367fc9a | ||
|
|
46e0505336 | ||
|
|
75004d0b56 | ||
|
|
0dc5761ca6 | ||
|
|
df47fb5be8 | ||
|
|
0cedc70eb3 | ||
|
|
1612687acf | ||
|
|
67d587cd9b | ||
|
|
9e97e96b87 | ||
|
|
79c1ad1431 | ||
|
|
c0ebe09521 | ||
|
|
b568cc529e | ||
|
|
dc8e24c7b7 | ||
|
|
ba411303e9 | ||
|
|
8848bc2e7f | ||
|
|
f7798f361a | ||
|
|
6a25427cb6 | ||
|
|
a6c283f4ce | ||
|
|
48bb907d2d | ||
|
|
c2ce5d5557 | ||
|
|
0d30fe90f8 | ||
|
|
c434cef45e | ||
|
|
d01970f731 | ||
|
|
bb9beb75d1 | ||
|
|
ad3a9e6c55 | ||
|
|
9a30b65180 | ||
|
|
cb548fe1fa | ||
|
|
0a8f049ced | ||
|
|
890809069e | ||
|
|
ca9a6fe019 | ||
|
|
94ccae727b | ||
|
|
001e77952e | ||
|
|
ac6a453833 | ||
|
|
307915130c | ||
|
|
3d225ef908 | ||
|
|
1c9123637a | ||
|
|
f1f690552f | ||
|
|
57dcf3401c | ||
|
|
9e5df7957e | ||
|
|
ca63389ea3 | ||
|
|
7b7ee070b9 | ||
|
|
3aee16e9a0 | ||
|
|
06cb3624e2 | ||
|
|
a1f83418b9 | ||
|
|
e5a32ea129 | ||
|
|
eb209abe62 | ||
|
|
13551fd410 | ||
|
|
2493706315 | ||
|
|
b49273c079 | ||
|
|
7c1b161277 | ||
|
|
d8a1dcc1b4 | ||
|
|
f44d60c58f | ||
|
|
dc71840a5a | ||
|
|
07b17cd0f6 | ||
|
|
cf37e8ea83 | ||
|
|
5384489702 | ||
|
|
1ad69d785f | ||
|
|
ef3acd9f33 | ||
|
|
083b42fead | ||
|
|
c6814a6f97 | ||
|
|
9dbd7fc7e0 | ||
|
|
a79eff3b0d | ||
|
|
a89d7a2e2a | ||
|
|
0336f6a987 | ||
|
|
6d68975ba5 | ||
|
|
2b07fd7c6a | ||
|
|
f8cc423f3d | ||
|
|
f4667fa3cf | ||
|
|
d8f929755a | ||
|
|
031685e0a7 | ||
|
|
9f260eb86c | ||
|
|
75878b24cd | ||
|
|
fe0425eb80 | ||
|
|
453003da23 | ||
|
|
eec08973bf | ||
|
|
c65f8da90f | ||
|
|
2970ed5bfd | ||
|
|
bfebcba431 | ||
|
|
dde85b761b | ||
|
|
34809e48d8 | ||
|
|
6749c2d1a6 | ||
|
|
7eb24ff514 | ||
|
|
e367a2bcc9 | ||
|
|
a02283264a | ||
|
|
7a7e9ee9af | ||
|
|
b7f25a48c2 | ||
|
|
4477aa3159 | ||
|
|
4fd23c752c | ||
|
|
60b625bc0f | ||
|
|
d1703b9bc0 | ||
|
|
eb9da7417f | ||
|
|
782f497b20 | ||
|
|
003a83b40b | ||
|
|
2f8d28e7da | ||
|
|
fa591589c7 | ||
|
|
f0ea459c57 | ||
|
|
f3d733c3ff | ||
|
|
19ca78769f | ||
|
|
3e5784cbc5 | ||
|
|
98d9f36f9c | ||
|
|
22bc6872f4 | ||
|
|
f6fe84afad | ||
|
|
4744534fc9 | ||
|
|
af05d7439f | ||
|
|
6e22f4fd6d | ||
|
|
0e3d92148b | ||
|
|
06cf6d2ecc | ||
|
|
7b5654eea4 | ||
|
|
503eb41939 | ||
|
|
a77db3c6a5 | ||
|
|
4e0889469a | ||
|
|
7c5bf62fc0 | ||
|
|
b79f86b8d1 | ||
|
|
b9f5929439 | ||
|
|
3dc396a647 | ||
|
|
c358bf448f | ||
|
|
abd1d56d7f | ||
|
|
22b9c16351 | ||
|
|
0131958136 | ||
|
|
9f70767acf | ||
|
|
bdeb8d7ee2 | ||
|
|
de831ee5ac | ||
|
|
da1cb42f2a | ||
|
|
2c366ef4bd | ||
|
|
bc0f31407f | ||
|
|
0d755e610b | ||
|
|
55ee7fcc33 | ||
|
|
10200d7b55 | ||
|
|
1eab6a0c8e | ||
|
|
fc2d50c7d3 | ||
|
|
aaed0364bd | ||
|
|
9e0139f3c3 | ||
|
|
ec3c3b7eed | ||
|
|
c67632722b | ||
|
|
580fbf47b2 | ||
|
|
4bffdce8af | ||
|
|
f22e9bf1d2 | ||
|
|
95b516127a | ||
|
|
da7474b1de | ||
|
|
27aa9011ce | ||
|
|
d09a48fd03 | ||
|
|
b5c0a857ca | ||
|
|
ab9f848dcd | ||
|
|
1b3350437c | ||
|
|
03749788e8 | ||
|
|
9a571cfb72 | ||
|
|
39303611ef | ||
|
|
fcf0cf00d0 | ||
|
|
2ee846f48e | ||
|
|
9c846a3e40 | ||
|
|
712e8315f8 | ||
|
|
604ab22526 | ||
|
|
85d09df938 | ||
|
|
5ae93f8431 | ||
|
|
3aab8dd332 | ||
|
|
bf9d297dcd | ||
|
|
080cc77208 | ||
|
|
7ebd92be7d | ||
|
|
22b2f63917 | ||
|
|
5bcfa34bea | ||
|
|
48c47423a4 | ||
|
|
229cae16d1 | ||
|
|
9edb89fc22 | ||
|
|
3faabb478d | ||
|
|
2c127fe69c | ||
|
|
3765d9e6f7 | ||
|
|
8545d0505f | ||
|
|
28b101aaf7 | ||
|
|
24d1250e66 | ||
|
|
706ca3649e | ||
|
|
bb537e4dd5 | ||
|
|
eb59ff2ebd | ||
|
|
7842c9e34d | ||
|
|
3882a98755 | ||
|
|
14c9dc5bdb | ||
|
|
181457b69f | ||
|
|
0b6f543bbd | ||
|
|
01a386445c | ||
|
|
3fce669f6e | ||
|
|
8a701755d8 | ||
|
|
aead503f02 | ||
|
|
7ef2af2549 | ||
|
|
1e44a93c87 | ||
|
|
2e55dec949 | ||
|
|
c80a83485d | ||
|
|
8915484251 | ||
|
|
ed3450388b | ||
|
|
a2d580e926 | ||
|
|
47085bb9c9 | ||
|
|
73619f4d75 | ||
|
|
5228338f97 | ||
|
|
71c0aff78f | ||
|
|
4d7e106088 | ||
|
|
d7127ccc3d | ||
|
|
04e960b0da | ||
|
|
8d199cfc6c | ||
|
|
ffa58e23f1 | ||
|
|
289f94599d | ||
|
|
d0b51ae18f | ||
|
|
cea459d1e3 | ||
|
|
f6cd825ab9 | ||
|
|
f8fa438728 | ||
|
|
07aacc9b08 | ||
|
|
50325785f5 | ||
|
|
ef49b97c75 | ||
|
|
75110ac028 | ||
|
|
57bfa38328 | ||
|
|
2c00386e99 | ||
|
|
3b03b7aee6 | ||
|
|
1491270f1d | ||
|
|
46dfaab639 | ||
|
|
ff755facc0 | ||
|
|
d38f659f42 | ||
|
|
6d95a64412 | ||
|
|
21336c527a | ||
|
|
3db2362c86 | ||
|
|
99b7ef0c92 | ||
|
|
ff030fcbec | ||
|
|
ecf19029f5 | ||
|
|
9494801d0b | ||
|
|
1501592fa8 | ||
|
|
12467916a4 | ||
|
|
6f0eb56621 | ||
|
|
31dabf51ae | ||
|
|
22fd100b04 | ||
|
|
20092ef1ac | ||
|
|
aad6a16984 | ||
|
|
9b00df93c2 | ||
|
|
f1da71a8fe | ||
|
|
efd182971a | ||
|
|
40c5125a92 | ||
|
|
0f6654bf95 | ||
|
|
fa27ddecc5 | ||
|
|
e5be67b005 | ||
|
|
85458d1f20 | ||
|
|
5b5723c5a5 | ||
|
|
e148e89091 | ||
|
|
1d0614f0f3 | ||
|
|
2405e6c8e8 | ||
|
|
817408d247 | ||
|
|
8d77e39f4a | ||
|
|
0fe7e7a88d | ||
|
|
08bc57045a | ||
|
|
ee58b6a734 | ||
|
|
2907e5a0bd | ||
|
|
4f229629c0 | ||
|
|
f0fd2bc30c | ||
|
|
86e9a38384 | ||
|
|
322f97ddbc | ||
|
|
695865f408 | ||
|
|
1f9834dc6b | ||
|
|
d1555a4c78 | ||
|
|
5fc4477a94 | ||
|
|
a5753ec0b5 | ||
|
|
f256c48505 | ||
|
|
71c5447b8a | ||
|
|
a9a338ff42 | ||
|
|
06a21d490b | ||
|
|
ef0c9bd429 | ||
|
|
f619df2773 | ||
|
|
41ae74757e | ||
|
|
2304738336 | ||
|
|
e70a9ba485 | ||
|
|
61a759f802 | ||
|
|
3cb61ff840 | ||
|
|
b7a07c3816 | ||
|
|
ae386b3a7d | ||
|
|
2b8a8314c5 | ||
|
|
eb28edbe58 | ||
|
|
8d683fc19c | ||
|
|
0c50f724e6 | ||
|
|
d406946c2d | ||
|
|
1c7e620a86 | ||
|
|
c40096e128 | ||
|
|
43d2817407 | ||
|
|
ff14ccc0a5 | ||
|
|
1222fee0d0 | ||
|
|
b184a184c4 | ||
|
|
e5dcb3f100 | ||
|
|
411fe19ee5 | ||
|
|
1c040117ec | ||
|
|
856d2653bc | ||
|
|
2a79b60454 | ||
|
|
db32e49879 | ||
|
|
65d83bb6f4 | ||
|
|
17b7ec6358 | ||
|
|
73c3190c86 | ||
|
|
b6f58caf24 | ||
|
|
8c19c3a72c | ||
|
|
c017d3e894 | ||
|
|
35696508fb | ||
|
|
7e3996b0d9 | ||
|
|
a7ec8e7c55 | ||
|
|
dfaa6896c1 | ||
|
|
b64e6bdbba | ||
|
|
e0ef248943 | ||
|
|
cdcb0a46dc | ||
|
|
e82e1f9905 | ||
|
|
cb6616bba1 | ||
|
|
e0f0afdf91 | ||
|
|
5120e74b36 | ||
|
|
8f5fa863bf | ||
|
|
d4e32fdbc0 | ||
|
|
067cf75c65 | ||
|
|
7f16ddacf7 | ||
|
|
d936c072ea | ||
|
|
7dee075c10 | ||
|
|
b9ea2408c2 | ||
|
|
6ce570f4a5 | ||
|
|
b95b99b3c9 | ||
|
|
139197230d | ||
|
|
1d0e0307c4 | ||
|
|
f94ab1be6f | ||
|
|
05c7596acb | ||
|
|
b38d51ce37 | ||
|
|
5c0d765f59 | ||
|
|
db35542706 | ||
|
|
eda857cb10 | ||
|
|
b77c8fe5f1 | ||
|
|
0d864ed848 | ||
|
|
7c613198ce | ||
|
|
1ca68a58fd | ||
|
|
b96139274f | ||
|
|
d84faf57ab | ||
|
|
89f0c494e4 | ||
|
|
24f9263fa4 | ||
|
|
5f4f9337cd | ||
|
|
2a75d28386 | ||
|
|
3e41289167 | ||
|
|
9cf5373724 | ||
|
|
6c5d35df6b | ||
|
|
4d26021705 | ||
|
|
2e9b8eff59 | ||
|
|
a4142f68ce | ||
|
|
4a889e39ad | ||
|
|
d206d69b25 | ||
|
|
83e92d6298 | ||
|
|
e080551d54 | ||
|
|
b40195d26d | ||
|
|
316abec693 | ||
|
|
af685a263b | ||
|
|
31e8afa622 | ||
|
|
1d500ad965 | ||
|
|
a8866c3f41 | ||
|
|
f64eca5d9b | ||
|
|
bdd5e7018a | ||
|
|
3d211143e0 | ||
|
|
c1c11d8daa | ||
|
|
0505b19378 | ||
|
|
e18e532846 | ||
|
|
10cec3de2f | ||
|
|
76c0992d02 | ||
|
|
e32a78a944 | ||
|
|
68d710cd94 | ||
|
|
da64a3eeab | ||
|
|
912622bf1f | ||
|
|
70fec208d8 | ||
|
|
e1f69b9c61 | ||
|
|
81f25b219f | ||
|
|
d191b8c090 | ||
|
|
d53ff127ed | ||
|
|
50caca8fdc | ||
|
|
1dca97b4d3 | ||
|
|
14cf474167 | ||
|
|
47b1203805 | ||
|
|
81ca016581 | ||
|
|
cd8bda7a29 | ||
|
|
8115b47051 | ||
|
|
6384cc6e86 | ||
|
|
2f68df2b5f | ||
|
|
ed2697d6ad | ||
|
|
df928fd2d0 | ||
|
|
52c50a2fd4 | ||
|
|
666d051806 | ||
|
|
1e80316a7d | ||
|
|
65404cba33 | ||
|
|
ac0519a046 | ||
|
|
90a6306bbe | ||
|
|
a5a7d9382e | ||
|
|
bc770d908a | ||
|
|
20724ceb17 | ||
|
|
6ae6ac0272 | ||
|
|
5aa5015348 | ||
|
|
411aecde6f | ||
|
|
e89b93285e | ||
|
|
4e702cfeda | ||
|
|
33846405d8 | ||
|
|
378eb79ad3 | ||
|
|
da71b81d01 | ||
|
|
35d734e6ac | ||
|
|
3937fc4b71 | ||
|
|
5debac4c98 | ||
|
|
3737abe081 | ||
|
|
d0013c0700 | ||
|
|
460277289b | ||
|
|
35ed305718 | ||
|
|
d3c57eecbc | ||
|
|
ad75da8502 | ||
|
|
c7c6880a01 | ||
|
|
5ed3ef918d | ||
|
|
c0f78342e1 | ||
|
|
75494978ad | ||
|
|
602c015321 | ||
|
|
55c2c9ee59 | ||
|
|
8fef5f2c69 | ||
|
|
9a4a62ff2d | ||
|
|
4ebc462e23 | ||
|
|
08e93a0fe9 | ||
|
|
4096869c50 | ||
|
|
3cd87e68c7 | ||
|
|
7165ff7b84 | ||
|
|
81d906fd3b | ||
|
|
b51bdf3d5e | ||
|
|
c8ca7876c3 | ||
|
|
c181a6dcc8 | ||
|
|
b763c22ef4 | ||
|
|
5c83475c95 | ||
|
|
1d1670864b | ||
|
|
5e980767b9 | ||
|
|
2b3c9b95af | ||
|
|
09232ad0b6 | ||
|
|
2533197a3c | ||
|
|
71c43b0de7 | ||
|
|
6606b7b097 | ||
|
|
5c994ff222 | ||
|
|
9372b96e47 | ||
|
|
24e133e006 | ||
|
|
995fa013a6 | ||
|
|
4af1f56713 | ||
|
|
584b258241 | ||
|
|
fb13ce2baf | ||
|
|
f910a70c8a | ||
|
|
fedb8bd816 | ||
|
|
c3f97dd730 | ||
|
|
b1ebf9dc79 | ||
|
|
d07ea96570 | ||
|
|
dc3bdd89c1 | ||
|
|
7e92c912b2 | ||
|
|
5d5c3aec3c | ||
|
|
0ba63ea272 | ||
|
|
a242a8e277 | ||
|
|
cc86e94cd5 | ||
|
|
1c10ae443d | ||
|
|
d44f3d9bae | ||
|
|
d71e5f968a | ||
|
|
4aa9fba4fa | ||
|
|
8aaaddde03 | ||
|
|
d5176ba278 | ||
|
|
13a8108e1e | ||
|
|
82b19f6f69 | ||
|
|
9e37dd008d | ||
|
|
5b1057fe08 | ||
|
|
460fa3f3d7 | ||
|
|
61de3532c2 | ||
|
|
ddfc699809 | ||
|
|
d0edf2e8dd | ||
|
|
a159cb5efe | ||
|
|
26371bb9dd | ||
|
|
de4ffcc8bc | ||
|
|
ebaedca708 | ||
|
|
a86f597239 | ||
|
|
b72d3a77e9 | ||
|
|
64fdf54156 | ||
|
|
463e31251f | ||
|
|
9032f24a56 | ||
|
|
c5828803c6 | ||
|
|
9883c6464e | ||
|
|
67006f2809 | ||
|
|
e49728aa82 | ||
|
|
829c254b1f | ||
|
|
8bf54eda56 | ||
|
|
c58adce8f6 | ||
|
|
92532b0fd1 | ||
|
|
8cba5d55ce | ||
|
|
da1ac7beee | ||
|
|
28b79626d9 | ||
|
|
867059dfae | ||
|
|
50250bd2ca | ||
|
|
0e71c3a2ac | ||
|
|
db01a92edf | ||
|
|
6a9836912d | ||
|
|
bdcfd69795 | ||
|
|
dbe1bb0ec4 | ||
|
|
d76841bdc1 | ||
|
|
0251a29841 | ||
|
|
32b0c173f0 | ||
|
|
90167afc2b | ||
|
|
6a4a58185e | ||
|
|
6cffabacb3 | ||
|
|
d658c47cd0 | ||
|
|
21b06ace43 | ||
|
|
7a27b95df7 | ||
|
|
a730935e6e | ||
|
|
ef705ed494 | ||
|
|
fb6915b059 | ||
|
|
20d675ea48 | ||
|
|
900dbc2a47 | ||
|
|
d8affd8564 | ||
|
|
f3d4a1e1c3 | ||
|
|
d5ebea7928 | ||
|
|
bd95c7a366 | ||
|
|
20fc160230 | ||
|
|
c786e6d576 | ||
|
|
e9ce6a4f80 | ||
|
|
0024e4b970 | ||
|
|
cf8ea5953e | ||
|
|
65ddcdeabb | ||
|
|
6576686b36 | ||
|
|
13404ed090 | ||
|
|
ff6cc84482 | ||
|
|
02caee0c02 | ||
|
|
7260da63af | ||
|
|
ec0d333d81 | ||
|
|
d3eb6b8a11 | ||
|
|
cc0ce73d39 | ||
|
|
2eb92951af | ||
|
|
f8202096f1 | ||
|
|
f470d552cf | ||
|
|
be50bbc149 | ||
|
|
50c49a1692 | ||
|
|
70496c9bde | ||
|
|
f7f7c1c9af | ||
|
|
f02d5fc28f | ||
|
|
422a982917 | ||
|
|
ce60a8cfa2 | ||
|
|
f0026927e3 | ||
|
|
d1388dd7eb | ||
|
|
ffda782c3d | ||
|
|
3a6df996dc | ||
|
|
6141376977 | ||
|
|
3ec2ebabfc | ||
|
|
77dcb025fd | ||
|
|
bbaa01af79 | ||
|
|
d033f34a45 | ||
|
|
f2eb5326af | ||
|
|
f09b541ab7 | ||
|
|
e71df7eb67 | ||
|
|
9d1e6b9b96 | ||
|
|
0d43b16fd5 | ||
|
|
b179bd2415 | ||
|
|
64fbd3db46 | ||
|
|
ea096cd593 | ||
|
|
7934e3ad5c | ||
|
|
52a5335770 | ||
|
|
f3d1ffbe01 | ||
|
|
b40a17fc51 | ||
|
|
02fadef9e7 | ||
|
|
6e4d2470d2 | ||
|
|
8e4faa3de2 | ||
|
|
4f3b9f19a7 | ||
|
|
e562baf30b | ||
|
|
efefd13bf5 | ||
|
|
4314ef1ca8 | ||
|
|
477e531af9 | ||
|
|
47b8e2a983 | ||
|
|
cc01018223 | ||
|
|
7a28084b63 | ||
|
|
ea86b0e32f | ||
|
|
96169af71e | ||
|
|
4633817374 | ||
|
|
a190910cbf | ||
|
|
6170fc8e43 | ||
|
|
aa279c332d | ||
|
|
a79e1be034 | ||
|
|
5924a8eca1 | ||
|
|
fc920b0838 | ||
|
|
e33d51641f | ||
|
|
4b979bf206 | ||
|
|
bc5afbea89 | ||
|
|
65f75b0cc0 | ||
|
|
c50b0ef9e8 | ||
|
|
10c479034f | ||
|
|
3c95826c5c | ||
|
|
fa11368599 | ||
|
|
f4fd01c777 | ||
|
|
96941c9978 | ||
|
|
c5a6875de9 | ||
|
|
549e042e67 | ||
|
|
c70581abc9 | ||
|
|
5e6af37532 | ||
|
|
c0184f926d | ||
|
|
a69e81f034 | ||
|
|
5c01fbabac | ||
|
|
fed47bea4a | ||
|
|
213c063895 | ||
|
|
632af46137 | ||
|
|
b527ebbf5b | ||
|
|
ad55cfde7f | ||
|
|
44e77de620 | ||
|
|
40de8e16ec | ||
|
|
d36f9e4dbb | ||
|
|
a65f448856 | ||
|
|
8cba593882 | ||
|
|
0715dd145f | ||
|
|
5a20322251 | ||
|
|
89b5e1163d | ||
|
|
6a9dbe3d89 | ||
|
|
8e6ae3aa01 | ||
|
|
e46707750b | ||
|
|
b1f6ea8ae6 | ||
|
|
82ae65f477 | ||
|
|
4a3595133a | ||
|
|
4c9a6a5d98 | ||
|
|
a2e01c36ba | ||
|
|
774d872f41 | ||
|
|
fa19435d24 | ||
|
|
902186bdff | ||
|
|
6996c06909 | ||
|
|
315068b111 | ||
|
|
4047d1ba3c | ||
|
|
d74bee3596 | ||
|
|
aea1049223 | ||
|
|
3548195fbe | ||
|
|
8d0cc15eb0 | ||
|
|
ee2580a57f | ||
|
|
255d5c661e | ||
|
|
a60d945968 | ||
|
|
f8fa53aa3b | ||
|
|
1642327015 | ||
|
|
399478d635 | ||
|
|
608c13ebba | ||
|
|
99694d67ca | ||
|
|
bde279f2fa | ||
|
|
e4f56f0b23 | ||
|
|
3e8da0cc1a | ||
|
|
ca0e12d93f | ||
|
|
0c41d9810f | ||
|
|
165961f27e | ||
|
|
81386b7a56 | ||
|
|
5bf2a7d51b | ||
|
|
3fa527b45b | ||
|
|
121d986b11 | ||
|
|
f18f5c9b85 | ||
|
|
d5808f6be3 | ||
|
|
2984d30118 | ||
|
|
efbb5a2ae5 | ||
|
|
31aafe23b7 | ||
|
|
09779e294c | ||
|
|
2fe872de3d | ||
|
|
153d8d2cf0 | ||
|
|
1b07a10b5d | ||
|
|
d743c8235f | ||
|
|
7781bfcbac | ||
|
|
0fd81e067f | ||
|
|
acc2f2e3d5 | ||
|
|
a2be60cce8 | ||
|
|
1344b18379 | ||
|
|
1deec05f3d | ||
|
|
2ee5bcf933 | ||
|
|
5f57de017c | ||
|
|
508a153973 | ||
|
|
5d8b70cc0d | ||
|
|
d60ba04cf4 | ||
|
|
8b3949497a | ||
|
|
754b69f746 | ||
|
|
55c99e9ad7 | ||
|
|
aa2e212480 | ||
|
|
96c6abc889 | ||
|
|
74a73dfc97 | ||
|
|
d3b5553433 | ||
|
|
b8856af18c | ||
|
|
63428d0b2e | ||
|
|
22afd245a8 | ||
|
|
26fdf2275a | ||
|
|
1ad38124df | ||
|
|
aaa4fd1265 | ||
|
|
9793c3b142 | ||
|
|
5a753761dd | ||
|
|
37be26e539 | ||
|
|
96023f2274 | ||
|
|
30b83f4f9c | ||
|
|
265f969a44 | ||
|
|
d5b182cac0 | ||
|
|
ce296f0e32 | ||
|
|
6d5c3489c9 | ||
|
|
d48ab49437 | ||
|
|
8ee250e9ac | ||
|
|
e485fe1d18 | ||
|
|
35a32481c6 | ||
|
|
beaf543012 | ||
|
|
c40e31f374 | ||
|
|
f9c09293bf | ||
|
|
cdffe2388e | ||
|
|
6c0af2dbb9 | ||
|
|
eee428afe5 | ||
|
|
047815c764 | ||
|
|
3b8e0d69a3 | ||
|
|
56f2749da0 | ||
|
|
7d85753350 | ||
|
|
367363a8bd | ||
|
|
30d0836329 | ||
|
|
1680dc63d9 | ||
|
|
806298843f | ||
|
|
7cee4e2453 | ||
|
|
82f21de83e | ||
|
|
65c4f9d9c3 | ||
|
|
8043f53d7d | ||
|
|
124672b811 | ||
|
|
28ef6cdefc | ||
|
|
5e38ea28b6 | ||
|
|
1d0d7e9e09 | ||
|
|
aab6bc0869 | ||
|
|
77213bee1d | ||
|
|
90fc1d93ad | ||
|
|
e51f36c651 | ||
|
|
fc63442ded | ||
|
|
0ee5174e18 | ||
|
|
0004f19325 | ||
|
|
da724e3dd5 | ||
|
|
96ccf0dab9 | ||
|
|
aba3e4a460 | ||
|
|
bc852aebeb | ||
|
|
89da530898 | ||
|
|
2367e7df50 | ||
|
|
2ca85a4976 | ||
|
|
e3860cf09c | ||
|
|
07be405f48 | ||
|
|
92d5210e37 | ||
|
|
01bf7aa774 | ||
|
|
427ca732fe | ||
|
|
ca92a0b90a | ||
|
|
db4547115c | ||
|
|
3ad4a3ae3a | ||
|
|
7bef772488 | ||
|
|
e4c64073c5 | ||
|
|
0ff15e91d9 | ||
|
|
a584aa7df8 | ||
|
|
57ca9dfdbc | ||
|
|
3a2073f785 | ||
|
|
e963d99d5e | ||
|
|
bbe188d4f9 | ||
|
|
9df1ed0b3b | ||
|
|
742998b477 | ||
|
|
a577fac1c5 | ||
|
|
d08abf05ff | ||
|
|
cd6af18183 | ||
|
|
a425275108 | ||
|
|
92f7b6fd9e | ||
|
|
68c7586c4c | ||
|
|
9549a3599c | ||
|
|
b826049893 | ||
|
|
88d950bafb | ||
|
|
50242c6eaa | ||
|
|
e5649d90e7 | ||
|
|
d22e6f28a1 | ||
|
|
307acee9d3 | ||
|
|
184b2cc26b | ||
|
|
613781e6c0 | ||
|
|
92c3c1f829 | ||
|
|
6268367b22 | ||
|
|
4c174a42f8 | ||
|
|
71463476f6 | ||
|
|
20b388c1d2 | ||
|
|
3ab7648384 | ||
|
|
9fb84e3ef2 | ||
|
|
d6bfce9a5d | ||
|
|
328d5c6275 | ||
|
|
19be6b5e17 | ||
|
|
499f9633ba | ||
|
|
774ca6cd80 | ||
|
|
22b5cf3536 | ||
|
|
18fa8af728 | ||
|
|
0f01bdad13 | ||
|
|
d787f67ab8 | ||
|
|
16de80f46a | ||
|
|
294bc51f83 | ||
|
|
70987fc55f | ||
|
|
5b700cb6e6 | ||
|
|
dcb31fa783 | ||
|
|
411a52e16f | ||
|
|
41bfd757ad | ||
|
|
d94c6f2132 | ||
|
|
29052c7a90 | ||
|
|
48de41137d | ||
|
|
203d06831e | ||
|
|
3e9c435ed1 | ||
|
|
e65fda875a | ||
|
|
70c745dd84 | ||
|
|
870b71afec | ||
|
|
18e0af6b38 | ||
|
|
ed87cc1b1e | ||
|
|
5d6ff69e8d | ||
|
|
cbea2b5443 | ||
|
|
a891e1f85d | ||
|
|
ade0aa770a | ||
|
|
a5f2f3b3f1 | ||
|
|
077ba65f7e | ||
|
|
6f6a426424 | ||
|
|
163158cf12 | ||
|
|
e4821aa9e1 | ||
|
|
9b23c3272b | ||
|
|
3454afb3e4 | ||
|
|
ab99ae6951 | ||
|
|
a609452cfd | ||
|
|
ee1256a676 | ||
|
|
a9837a3aaf | ||
|
|
499492e10a | ||
|
|
6e77ce999a | ||
|
|
dd05eeb821 | ||
|
|
919f8faeee | ||
|
|
b0db8e1ae0 | ||
|
|
3e0f2bfc4a | ||
|
|
5e9e1faedc | ||
|
|
dba6a88341 | ||
|
|
ee0b86c0c2 | ||
|
|
7ea2e1bf51 | ||
|
|
c801f2d4a5 | ||
|
|
ae84f02bd0 | ||
|
|
a6c73e2840 | ||
|
|
e6bc1d7c22 | ||
|
|
e2abb6b6db | ||
|
|
cb63cdcd42 | ||
|
|
1f28b9f98d | ||
|
|
7fcc0ba8a4 | ||
|
|
6773ac88af | ||
|
|
46bee1d532 | ||
|
|
10062373d1 | ||
|
|
68e3c2be9b | ||
|
|
099df7a0ee | ||
|
|
21b6537215 | ||
|
|
eb70f6d18e | ||
|
|
4ee6ae5da1 | ||
|
|
2c8d2d8643 | ||
|
|
0582b45389 | ||
|
|
f7cbe71bd9 | ||
|
|
1b87600658 | ||
|
|
446fb9c99f | ||
|
|
c774cb0c27 | ||
|
|
8ff9427a04 | ||
|
|
b427e67619 | ||
|
|
6163f98020 | ||
|
|
316b2fc98a | ||
|
|
9c73204224 | ||
|
|
7da59d5a39 | ||
|
|
a34b63b80d | ||
|
|
5b335f0f26 | ||
|
|
28af18f36e | ||
|
|
10bb9f7079 | ||
|
|
ed7006bbf4 | ||
|
|
b272f6bf15 | ||
|
|
715ce5dbe9 | ||
|
|
7d0f807880 | ||
|
|
b66eccedc0 | ||
|
|
f79e725aa3 | ||
|
|
66c4b6815f | ||
|
|
f073da1d27 | ||
|
|
dad0d648a1 | ||
|
|
f20262c5c8 | ||
|
|
23b6617a3f | ||
|
|
ab5c02c2ae | ||
|
|
1005cee4bc | ||
|
|
95a1b12c07 | ||
|
|
23542bbfee | ||
|
|
ec65c26b3c | ||
|
|
837cc9dd93 | ||
|
|
88a8d1c209 | ||
|
|
f4b780b806 | ||
|
|
3a296d237f | ||
|
|
db64c02bee | ||
|
|
97023ce1dd | ||
|
|
3a87a2665d | ||
|
|
6a2f4fb30d | ||
|
|
49b9b70c29 | ||
|
|
356340ad09 | ||
|
|
986bff1c22 | ||
|
|
e42001b2bc | ||
|
|
9818f5b6a3 | ||
|
|
46e40fbb65 | ||
|
|
c141dbbd82 | ||
|
|
9d5d08fa6c | ||
|
|
7b9aa5b91a | ||
|
|
8c75f7659f | ||
|
|
d8c40c1662 | ||
|
|
7c0180c3b9 | ||
|
|
211fee2e4e | ||
|
|
9b7b91651d | ||
|
|
6ecfe5e141 | ||
|
|
e11291538c | ||
|
|
5b90d59877 | ||
|
|
85df885b90 | ||
|
|
4dd5b67bbf | ||
|
|
88575ebc5d | ||
|
|
d8a19e9832 | ||
|
|
99a938ef37 | ||
|
|
b07ea3460e | ||
|
|
f557a86ecc | ||
|
|
a5f8dd0788 | ||
|
|
effbd82d00 | ||
|
|
9d72c9db1b | ||
|
|
486df332dd | ||
|
|
8806c8ba8b | ||
|
|
0df1e38ded | ||
|
|
7344689ba6 | ||
|
|
0ddbb80ee3 | ||
|
|
48667b7dda | ||
|
|
5708bc6b49 | ||
|
|
9481df50b1 | ||
|
|
840c454c1c | ||
|
|
77143dc8cf | ||
|
|
e3e77a8234 | ||
|
|
c3e84e6daa | ||
|
|
c3f71c43e9 | ||
|
|
df2ad6b1ca | ||
|
|
1d462b7558 | ||
|
|
0a8c3ddd71 | ||
|
|
6ab86657ff | ||
|
|
aed66d81b3 | ||
|
|
e355280232 | ||
|
|
92fff0c903 | ||
|
|
06319911d4 | ||
|
|
98959e902b | ||
|
|
1e996410f8 | ||
|
|
548a8ac87b | ||
|
|
44494df9d3 | ||
|
|
60c698d381 | ||
|
|
df3e1ace61 | ||
|
|
6def5118bb | ||
|
|
7d3224e37f | ||
|
|
28a1581bb6 | ||
|
|
66b8e697ea | ||
|
|
c15f1c917a | ||
|
|
5b72444a6d | ||
|
|
94a37bb60a | ||
|
|
935113a53d | ||
|
|
d39ed15517 | ||
|
|
1dce5ef39f | ||
|
|
2c69b57617 | ||
|
|
06961d3db5 | ||
|
|
bdf2922f5d | ||
|
|
f52d13f86a | ||
|
|
1b7b361b30 | ||
|
|
151c40441f | ||
|
|
e26363dc0f | ||
|
|
5dbc8bf383 | ||
|
|
27e6cf0e31 | ||
|
|
24f241a1cd | ||
|
|
a8febc8638 | ||
|
|
c04dfb82bb | ||
|
|
08d189683d | ||
|
|
b67975a820 | ||
|
|
fa175e7d24 | ||
|
|
c2221e5304 | ||
|
|
104b5ec6d6 | ||
|
|
59b4780afa | ||
|
|
899405456b | ||
|
|
40a81173f3 | ||
|
|
19a6608619 | ||
|
|
558a52909d | ||
|
|
76eb623de6 | ||
|
|
9e45c05383 | ||
|
|
c0a1529468 | ||
|
|
f4a7a88167 | ||
|
|
44ecb62ce7 | ||
|
|
37a976831d | ||
|
|
dd1aeb7265 | ||
|
|
777c62c056 | ||
|
|
717cddcc3d | ||
|
|
d6f7f620fc | ||
|
|
1bd928a766 | ||
|
|
e493b0775d | ||
|
|
a966fa34ae | ||
|
|
8cd27fca4d | ||
|
|
3676ca15c8 | ||
|
|
616f7d3def | ||
|
|
ec4c6ec7a1 | ||
|
|
941fa6d520 | ||
|
|
ce5e561cf3 | ||
|
|
8e5a00db76 | ||
|
|
faaeffbd38 | ||
|
|
a070066b71 | ||
|
|
4e92269ae1 | ||
|
|
994971b08f | ||
|
|
019c0fabe1 | ||
|
|
8e5346be21 | ||
|
|
5f9d1f62cf | ||
|
|
d7bdf862bf | ||
|
|
6470442e08 | ||
|
|
6157f53aae | ||
|
|
3f2d4a5274 | ||
|
|
ae83035380 | ||
|
|
4566ff6d24 | ||
|
|
cbceca3b35 | ||
|
|
436de1c4f5 | ||
|
|
737d4a5506 | ||
|
|
e5b16e9ef1 | ||
|
|
ea64f8453f | ||
|
|
507eb1c786 | ||
|
|
04f8ab3871 | ||
|
|
6b390caef5 | ||
|
|
8cee527ad0 | ||
|
|
bdf7d47742 | ||
|
|
6ad9435b4d | ||
|
|
e853892282 | ||
|
|
4969b8c252 | ||
|
|
239ef8951d | ||
|
|
494510e2a8 | ||
|
|
6dd899df22 | ||
|
|
7c4b97961f | ||
|
|
5c0a82913f | ||
|
|
d7e64d3f11 | ||
|
|
ea8d725546 | ||
|
|
cfffbcc5be | ||
|
|
ba80b40e9e | ||
|
|
b0fe7ecf8c | ||
|
|
84a6cfd558 | ||
|
|
efbf692cca | ||
|
|
f81057416b | ||
|
|
168675d380 | ||
|
|
6327477695 | ||
|
|
4c7ac85ae8 | ||
|
|
afe6fbe3b3 | ||
|
|
39568bff2f | ||
|
|
d3b44f1c84 | ||
|
|
8e74746573 | ||
|
|
bb54f234bd | ||
|
|
572a84c19b | ||
|
|
8fe46092c0 | ||
|
|
02bad8bcd1 | ||
|
|
54be0c0dec | ||
|
|
20df2789b5 | ||
|
|
a8f902885d | ||
|
|
c17e37b6e0 | ||
|
|
df25986597 | ||
|
|
dc06ca51a6 | ||
|
|
d76ea27c54 | ||
|
|
90b606584d | ||
|
|
19a24c2171 | ||
|
|
f7d75ca641 | ||
|
|
5baa083386 | ||
|
|
6f7cb088b0 | ||
|
|
8901d1c37d | ||
|
|
ec9dedd75c | ||
|
|
3edf7ee978 | ||
|
|
9e35b66510 | ||
|
|
713458ac81 | ||
|
|
90e2f04c34 | ||
|
|
9896b02bd6 | ||
|
|
d39dd45ae4 | ||
|
|
d50ae52176 | ||
|
|
784be47702 | ||
|
|
4f1fa811d0 | ||
|
|
201cd065a9 | ||
|
|
d832ec8ab2 | ||
|
|
0c6c01d86a | ||
|
|
13612d4024 | ||
|
|
9daf8d6493 | ||
|
|
e071406829 | ||
|
|
ff85b03e3f | ||
|
|
590429d104 | ||
|
|
eb0b5bd3f8 | ||
|
|
b15a902f6d | ||
|
|
4468d63145 | ||
|
|
aba5c428e9 | ||
|
|
62966c2f64 | ||
|
|
dfd2a4ef0e | ||
|
|
7fcc6e010c | ||
|
|
5d2ae4aa1e | ||
|
|
4318172edd | ||
|
|
9201559b1d | ||
|
|
40f90dd8f3 | ||
|
|
308cc81a27 | ||
|
|
7e8f8cf415 | ||
|
|
62634c6e1e | ||
|
|
70e4bd4174 | ||
|
|
7e0e618222 | ||
|
|
cf6f013909 | ||
|
|
2ed8557ea6 | ||
|
|
da3373ae42 | ||
|
|
cd0173dae4 | ||
|
|
02e7400ef0 | ||
|
|
6d6f29b6e1 | ||
|
|
0260b3177e | ||
|
|
b82d9d15d4 | ||
|
|
3bc0495eb2 | ||
|
|
50c0b60c10 | ||
|
|
c2680fd0a7 | ||
|
|
85c74c6bf8 | ||
|
|
93f665eb9c | ||
|
|
113c879d7a | ||
|
|
f13ee05c6a | ||
|
|
90fd2ff6a3 | ||
|
|
3a40b9f3a3 | ||
|
|
d8805b6af7 | ||
|
|
675336dee5 | ||
|
|
3cd4ed8e63 | ||
|
|
9c7208b1fa | ||
|
|
48af038643 | ||
|
|
ca8ad5e554 | ||
|
|
ab146f5d23 | ||
|
|
13fdd31c67 | ||
|
|
28f69afe96 | ||
|
|
2827e9e253 | ||
|
|
46ba6fc561 | ||
|
|
b3997769c0 | ||
|
|
410f58b7c7 | ||
|
|
fbecdad199 | ||
|
|
9e6e3160ff | ||
|
|
ca8abae240 | ||
|
|
6f0d095364 | ||
|
|
cc661c7549 | ||
|
|
6982846f50 | ||
|
|
eb6ec17504 | ||
|
|
8c68e1108b | ||
|
|
9077fd7b51 | ||
|
|
f8b88418ed | ||
|
|
9c12016859 | ||
|
|
e6943c8a9d | ||
|
|
c6483b5cf8 | ||
|
|
60925658bb | ||
|
|
5ef9ea35d6 | ||
|
|
901bb48877 | ||
|
|
9fc37e6418 | ||
|
|
b34cce3f75 | ||
|
|
787646b3cc | ||
|
|
f0d5e9d01e | ||
|
|
be05309e51 | ||
|
|
52811e2ec2 | ||
|
|
107738f0f2 | ||
|
|
936fa20928 | ||
|
|
362a3fde10 | ||
|
|
5c13f8f10a | ||
|
|
20cf990bf7 | ||
|
|
00744bc0e5 | ||
|
|
cb2a623faa | ||
|
|
7e80e7ba86 | ||
|
|
c50c985c85 | ||
|
|
c3ee794d40 | ||
|
|
c8502fa20c | ||
|
|
a31c037165 | ||
|
|
c71035530a | ||
|
|
acaf23fcb8 | ||
|
|
15860f3245 | ||
|
|
8a1e4cdf30 | ||
|
|
e574dca373 | ||
|
|
32fc932813 | ||
|
|
8a471d4d11 | ||
|
|
81ca3cd06e | ||
|
|
f8d65a831e | ||
|
|
a1ac21af75 | ||
|
|
d3d5e4e7bc | ||
|
|
c11cd7f4af | ||
|
|
840f2dced7 | ||
|
|
f81d6cf262 | ||
|
|
fe378c938a | ||
|
|
d9a4fed2f8 | ||
|
|
2a4fe80399 | ||
|
|
8999713301 | ||
|
|
0900cc2f59 | ||
|
|
87bf751b11 | ||
|
|
12c40a5b80 | ||
|
|
e9a2f9ff62 | ||
|
|
1fc382f74f | ||
|
|
65fc95b614 | ||
|
|
4354e8c861 | ||
|
|
f1014bbbb6 | ||
|
|
72f232e776 | ||
|
|
b7ebc35193 | ||
|
|
671328aaf6 | ||
|
|
c7bd174d7c | ||
|
|
54f8d05105 | ||
|
|
892f102e4a | ||
|
|
f9b54dab31 | ||
|
|
b3daf55ec2 | ||
|
|
391cef8549 | ||
|
|
59b51cccfc | ||
|
|
a83091bc3b | ||
|
|
7372540fce | ||
|
|
ceaa4bcac6 | ||
|
|
862f31ef1c | ||
|
|
6643bf8695 | ||
|
|
3c0297fbdf | ||
|
|
479cdb4218 | ||
|
|
6389ccee8d | ||
|
|
d478f98a4c | ||
|
|
dba0058763 | ||
|
|
10b4782efb | ||
|
|
f82d8d647a | ||
|
|
1698c822a5 | ||
|
|
c9177ec259 | ||
|
|
0481589615 | ||
|
|
6ef2b22a3c | ||
|
|
da19b2008a | ||
|
|
5493ab345a | ||
|
|
2589f7db14 | ||
|
|
2e283b9d6d | ||
|
|
3cf27bb46e | ||
|
|
f67d0709b7 | ||
|
|
2e66d603d3 | ||
|
|
d51560211c | ||
|
|
1b620b31d5 | ||
|
|
b82b730bf9 | ||
|
|
9191c993b1 | ||
|
|
1a2245043d | ||
|
|
2df7b9f302 | ||
|
|
202cbc62db | ||
|
|
9209e57bd9 | ||
|
|
1e1ad7694b | ||
|
|
b920d37f4e | ||
|
|
3cb2bc31a8 | ||
|
|
be24eec9d0 | ||
|
|
60fed04cb7 | ||
|
|
6c956013a6 | ||
|
|
59289ae8f9 | ||
|
|
8310e9762b | ||
|
|
99483d2913 | ||
|
|
b77303931e | ||
|
|
5863dc6c7c | ||
|
|
2a3923a173 | ||
|
|
3e882f3fd9 | ||
|
|
0499c38466 | ||
|
|
3e18d5ea57 | ||
|
|
ae75a502f0 | ||
|
|
6ac200f597 | ||
|
|
d7f635586d | ||
|
|
e27156be58 | ||
|
|
cafe638d5a | ||
|
|
4d996f6273 | ||
|
|
86dfd2840f | ||
|
|
dd9c3a53bf | ||
|
|
57959a1e93 | ||
|
|
6cfd7a988b | ||
|
|
ef95ff3342 | ||
|
|
773c17496e | ||
|
|
6118dafd94 | ||
|
|
8befcbfacf | ||
|
|
b9ea4983f9 | ||
|
|
d8765f86dd | ||
|
|
3d9744362f | ||
|
|
b2162ba263 | ||
|
|
aba40a9360 | ||
|
|
1a9e076685 | ||
|
|
2d9a3c643a | ||
|
|
85d2a06f6f | ||
|
|
8a5719afe1 | ||
|
|
2ec01c9b60 | ||
|
|
5fa02ef1e3 | ||
|
|
cfe8f8f6e1 | ||
|
|
9d63f0ce9a | ||
|
|
afd8d305f3 | ||
|
|
83738a606d | ||
|
|
072311b256 | ||
|
|
c904a9af1c | ||
|
|
7c042a566a | ||
|
|
57b762eb29 | ||
|
|
a4eb0cbd74 | ||
|
|
e558912a36 | ||
|
|
00ea757e77 | ||
|
|
2f04934471 | ||
|
|
1e6f492852 | ||
|
|
582c7c762a | ||
|
|
3ad64aa6a4 | ||
|
|
1c680d3aaa | ||
|
|
eed9ea35f9 | ||
|
|
a724725fdf | ||
|
|
84a5929645 | ||
|
|
cb85a8f5cb | ||
|
|
23dd80ffd8 | ||
|
|
16393c499b | ||
|
|
684160f178 | ||
|
|
e3f193b382 | ||
|
|
37d9c4b480 | ||
|
|
b6633aa306 | ||
|
|
c8651fb1f3 | ||
|
|
83a5b0d223 | ||
|
|
d95ef48d22 | ||
|
|
b59ce0b95b | ||
|
|
c00cd1d627 | ||
|
|
ab65641eae | ||
|
|
6c0781c157 | ||
|
|
bf6c6498aa | ||
|
|
4b6cec8452 | ||
|
|
b77da2635b | ||
|
|
033ddf8cc8 | ||
|
|
5b3c67c692 | ||
|
|
86aa8b8b2e | ||
|
|
0329bbc55e | ||
|
|
c9549e8ab6 | ||
|
|
5903f02086 | ||
|
|
28dcd34624 | ||
|
|
13b7398b3a | ||
|
|
50cf9c0e67 | ||
|
|
71ad38d742 | ||
|
|
c086a1ff24 | ||
|
|
75958f1f31 | ||
|
|
be34e0221d | ||
|
|
0913c94e46 | ||
|
|
910a0ef8e1 | ||
|
|
7b0e8b47a2 | ||
|
|
14e799ebe5 | ||
|
|
5e52c735a6 | ||
|
|
9eb5883f77 | ||
|
|
7a783b867b | ||
|
|
83ec0bd751 | ||
|
|
aacff4a9b6 | ||
|
|
7ab8ad8b10 | ||
|
|
cf7ac30215 | ||
|
|
547944ac88 | ||
|
|
99d7b46e48 | ||
|
|
eca872c04d | ||
|
|
8947b735f9 | ||
|
|
e245dee90b | ||
|
|
edba2a2e96 | ||
|
|
81e8ce4952 | ||
|
|
afd5d3a1e3 | ||
|
|
d1e8bcd7a5 | ||
|
|
79c71bf5c1 | ||
|
|
2c7daa388b | ||
|
|
cc351402a1 | ||
|
|
90a7602e5a | ||
|
|
1e0b8e443b | ||
|
|
96025a1977 | ||
|
|
6e1bcc03a6 | ||
|
|
728ec2e769 | ||
|
|
25a064f3a8 | ||
|
|
8a25b91ad2 | ||
|
|
cacd7dd2eb | ||
|
|
acf6825603 | ||
|
|
1b8c48ee1d | ||
|
|
6a6b75b7b4 | ||
|
|
491cbda0d3 | ||
|
|
aadd5e8786 | ||
|
|
e155d43c4b | ||
|
|
683f5d64b9 | ||
|
|
d26469c6a4 | ||
|
|
57d497c801 | ||
|
|
eac105fe9e | ||
|
|
61c2a3ed7a | ||
|
|
46031c008e | ||
|
|
d2aadd66bf | ||
|
|
646770ff68 | ||
|
|
90ad165359 | ||
|
|
30eae8f513 | ||
|
|
2d37575f3d | ||
|
|
eb1e607b93 | ||
|
|
9d16aec99a | ||
|
|
a95099696f | ||
|
|
be4791f826 | ||
|
|
41d5fa16a7 | ||
|
|
d3635126b7 | ||
|
|
7cba83231a | ||
|
|
7f4145d67f | ||
|
|
103c804c8e | ||
|
|
c7db4470e4 | ||
|
|
2e55fc8c32 | ||
|
|
5d921acd7d | ||
|
|
aa051b662e | ||
|
|
5fabd602ae | ||
|
|
0393e15843 | ||
|
|
539fb8e214 | ||
|
|
7b1fa28b85 | ||
|
|
30475f0eda | ||
|
|
19771b307c | ||
|
|
7a992837a1 | ||
|
|
33d8fa7b23 | ||
|
|
62d55296c0 | ||
|
|
cd0aad731a | ||
|
|
8e7afcc5fb | ||
|
|
a62618ee47 | ||
|
|
4e9b7f27a9 | ||
|
|
7d7ea4405c | ||
|
|
45c4117a40 | ||
|
|
4bd00b0f91 | ||
|
|
9e7225be36 | ||
|
|
154acbef72 | ||
|
|
502611702e | ||
|
|
009b9f7f3d | ||
|
|
77161c8e4d | ||
|
|
b4cd6f27ba | ||
|
|
2bb42ae9a9 | ||
|
|
54ce282b8c | ||
|
|
47057f076a | ||
|
|
7f775b7662 | ||
|
|
48317e0788 | ||
|
|
6c77c8f1aa | ||
|
|
ca759d2c8f | ||
|
|
53a59f593e | ||
|
|
d621670735 | ||
|
|
6653cce464 | ||
|
|
acfbed72de | ||
|
|
c4e322a23a | ||
|
|
6b9d617fa6 | ||
|
|
607ac40ab3 | ||
|
|
69c7ca8bdc | ||
|
|
692eb90dcd | ||
|
|
eee1c62325 | ||
|
|
442c3fdb9b | ||
|
|
e2077c46ce | ||
|
|
e8972efca1 | ||
|
|
f86c856e3b | ||
|
|
6bb674420a | ||
|
|
ee0fdc4332 | ||
|
|
4006992f8d | ||
|
|
8d04940c91 | ||
|
|
4f1d3a75c2 | ||
|
|
24c8af0363 | ||
|
|
4474af2a9a | ||
|
|
a3765ec0f8 | ||
|
|
b04712898c | ||
|
|
adaafc2a6d | ||
|
|
3308cc60e9 | ||
|
|
e4b235378b | ||
|
|
4f5f6b25e8 | ||
|
|
4b40179bc3 | ||
|
|
0f7b23148f | ||
|
|
a46923e494 | ||
|
|
1e7b4b8450 | ||
|
|
0edf24ae97 | ||
|
|
82f60fee35 | ||
|
|
1333e37b71 | ||
|
|
7f3e0b8fe0 | ||
|
|
937863f4aa | ||
|
|
ff3a639c92 | ||
|
|
3eae7156dc | ||
|
|
e12589ea8b | ||
|
|
6b5ee5ecb5 | ||
|
|
f3a9224547 | ||
|
|
8ef326fdc5 | ||
|
|
fb0e8ee9c6 | ||
|
|
6a8cc8ace3 | ||
|
|
f5fadea30e | ||
|
|
bedfb82066 | ||
|
|
8a403d9126 | ||
|
|
aca4e6585c | ||
|
|
0928f50bc6 | ||
|
|
da098cc1f7 | ||
|
|
8da631a14d | ||
|
|
dafa5014a4 | ||
|
|
879c2f365e | ||
|
|
50032affcf | ||
|
|
784cc3ba9c | ||
|
|
1d5a88a319 | ||
|
|
392575ba04 | ||
|
|
83c808c42d | ||
|
|
9a61392cf9 | ||
|
|
b2c2f7bbd2 | ||
|
|
da6ad1a43d | ||
|
|
f9e4253cb7 | ||
|
|
1675ce83b6 | ||
|
|
9b585ef706 | ||
|
|
67c9378fb8 | ||
|
|
7ab299b246 | ||
|
|
0733a87279 | ||
|
|
28dc8e6751 | ||
|
|
51cbb7e1fb | ||
|
|
3a82317dd5 | ||
|
|
1f2ef09d87 | ||
|
|
5bf0f0215d | ||
|
|
8f968e4c9c | ||
|
|
a8ce60ed4a | ||
|
|
27d8911dee | ||
|
|
4bf909393c | ||
|
|
8fc0e1d384 | ||
|
|
60ae205bd4 | ||
|
|
65045c4897 | ||
|
|
e46133c850 | ||
|
|
37ef57f78f | ||
|
|
3c50d99aba | ||
|
|
508efcf51c | ||
|
|
36d11a4443 | ||
|
|
8590b0b4f3 | ||
|
|
7817d629f1 | ||
|
|
7607a87617 | ||
|
|
b2d37d4ddb | ||
|
|
0003c72fc7 | ||
|
|
915f7cbd54 | ||
|
|
0b3097cd0b | ||
|
|
c7e0ba82b4 | ||
|
|
6168fa4275 | ||
|
|
b61a788ce7 | ||
|
|
903ecd207d | ||
|
|
d62e9652fc | ||
|
|
41e3b2b1a1 | ||
|
|
3349757d0f | ||
|
|
066d7458ca | ||
|
|
88a59b4460 | ||
|
|
aaab83356d | ||
|
|
7c1637328a | ||
|
|
0224346ed8 | ||
|
|
35366b25a6 | ||
|
|
b4c951b66b | ||
|
|
b1c09acb0c | ||
|
|
a6b231ce56 | ||
|
|
0862e4995c | ||
|
|
94832fd7d7 | ||
|
|
7cd82d16ce | ||
|
|
dabbca767f | ||
|
|
ca9bc13619 | ||
|
|
3f573711aa | ||
|
|
55306b1d3d | ||
|
|
ab2d68ef45 | ||
|
|
b7a2d59a61 | ||
|
|
25c8453353 | ||
|
|
aa39a923ed | ||
|
|
57b7729ea7 | ||
|
|
0e750a7d0d | ||
|
|
5cd583f944 | ||
|
|
c7a93758cb | ||
|
|
a450806dd2 | ||
|
|
cf6048419b | ||
|
|
cd6487ab94 | ||
|
|
157a9cc651 | ||
|
|
509157a8b0 | ||
|
|
aa8b8184b3 | ||
|
|
1f65d3add7 | ||
|
|
3b97724717 | ||
|
|
144db5f07f | ||
|
|
dc0ab611c4 | ||
|
|
5ddc93cf0d | ||
|
|
ad5328e6c7 | ||
|
|
7e514ce4bd | ||
|
|
42dc36ad5a | ||
|
|
7689d0d568 | ||
|
|
f37265235e | ||
|
|
f83b192d70 | ||
|
|
910420af07 | ||
|
|
8f719b7fed | ||
|
|
0272446f2b | ||
|
|
735d7ab1b4 | ||
|
|
3c9b556ca8 | ||
|
|
4e2ccf13cb | ||
|
|
8d0a7d322e | ||
|
|
3880b7811b | ||
|
|
2604bb078c | ||
|
|
8670d622da | ||
|
|
1ca1c37a9c | ||
|
|
7e7db57369 | ||
|
|
deb6fe8d7a | ||
|
|
1e20ed7099 | ||
|
|
40d94c84e0 | ||
|
|
bfc9af16a1 | ||
|
|
770cba7e2b | ||
|
|
8aa98d3f53 | ||
|
|
4219af78f4 | ||
|
|
0352f2e6f0 | ||
|
|
9ea02922ee | ||
|
|
816cbc74f4 | ||
|
|
e8cd8ca8c0 | ||
|
|
179015a050 | ||
|
|
d34428d249 | ||
|
|
974df6190e | ||
|
|
294a18e680 | ||
|
|
47edda2c1b | ||
|
|
ebe758f741 | ||
|
|
2f42eb02d4 | ||
|
|
08e4823917 | ||
|
|
d67615c976 | ||
|
|
2ca9b70c84 | ||
|
|
bd8e532353 | ||
|
|
4f69f090e6 | ||
|
|
0077fbe916 | ||
|
|
b263d1a049 | ||
|
|
bb3c647f49 | ||
|
|
c9b7180bb3 | ||
|
|
aca28bcb79 | ||
|
|
410447b340 | ||
|
|
6b0a1d286a | ||
|
|
e78cd0d623 | ||
|
|
6eb72b71b1 | ||
|
|
0cef7f27ea | ||
|
|
9698844cc3 | ||
|
|
9ca5e13d7f | ||
|
|
e1825e0ff2 | ||
|
|
a55fc58e24 | ||
|
|
8e2889c2b5 | ||
|
|
95d21e61e4 | ||
|
|
ed09b87953 | ||
|
|
8c3fbe26ad | ||
|
|
af2699ec21 | ||
|
|
17364dc445 | ||
|
|
59dd97cb72 | ||
|
|
a0a98419f0 | ||
|
|
1b47fd952c | ||
|
|
bf9e5b8e6e | ||
|
|
7e282c9027 | ||
|
|
e0dc494e71 | ||
|
|
4110956dda | ||
|
|
d0acd59adc | ||
|
|
8ad6ffc93d | ||
|
|
56d0926bdf | ||
|
|
8d99e12723 | ||
|
|
8ee8301bd0 | ||
|
|
1d584fead4 | ||
|
|
cc56ebbb35 | ||
|
|
56b87146e7 | ||
|
|
a5b9cdf90f | ||
|
|
6cd3d0d977 | ||
|
|
361de53d86 | ||
|
|
4021f6d8c3 | ||
|
|
2949e5cd8d | ||
|
|
c8f3921c3d | ||
|
|
5254834d43 | ||
|
|
2b0ceaf417 | ||
|
|
a688abddc1 | ||
|
|
648678ba7d | ||
|
|
f4c8c29510 | ||
|
|
87be9fd1ad | ||
|
|
7cbb2bf435 | ||
|
|
4f1cefec30 | ||
|
|
5e19c8f142 | ||
|
|
a6737720f4 | ||
|
|
e028a67f4f | ||
|
|
c5e8aaff4a | ||
|
|
2017ef192f | ||
|
|
04d3915171 | ||
|
|
2bdf3088a6 | ||
|
|
9debf2678e | ||
|
|
e03c10142d | ||
|
|
6213e7c390 | ||
|
|
9264aa5e46 | ||
|
|
4c5e1d916a | ||
|
|
d1ac3f3c24 | ||
|
|
ec9447ad5f | ||
|
|
26b01d56f5 | ||
|
|
eb687748c5 | ||
|
|
4b81cfcb47 | ||
|
|
a7074f03f7 | ||
|
|
0b67bba121 | ||
|
|
a791677534 | ||
|
|
be17a6cbf0 | ||
|
|
d2547672f3 | ||
|
|
52d1a09b8a | ||
|
|
1d98aa54d5 | ||
|
|
f56181bdab | ||
|
|
bc40c86f10 | ||
|
|
d61f3e79e2 | ||
|
|
1d58879ae5 | ||
|
|
f115fe331b | ||
|
|
92ac8fed99 | ||
|
|
877d31fefb | ||
|
|
0d77c7f9a7 | ||
|
|
0037f9eccb | ||
|
|
ba51e24fd9 | ||
|
|
7b9e6a57af | ||
|
|
7e9cab2b7d | ||
|
|
dd74ade44d | ||
|
|
9de2aa55cd | ||
|
|
6ac2376aac | ||
|
|
4fadb26cf6 | ||
|
|
61f14ffbbc | ||
|
|
377a55f60f | ||
|
|
e32cb72c62 | ||
|
|
dbd408c6d1 | ||
|
|
6e7bacb3c3 | ||
|
|
91f7078953 | ||
|
|
7787cb59f0 | ||
|
|
dac27435b8 | ||
|
|
50cd5701ce | ||
|
|
adf4fb5ae0 | ||
|
|
1f4cc1cf88 | ||
|
|
92dd53177f | ||
|
|
fe9e5bf21d | ||
|
|
1ca4f6acf5 | ||
|
|
392463b9f0 | ||
|
|
4df1f85492 | ||
|
|
ad79f878eb | ||
|
|
04a7437158 | ||
|
|
1fbeb6bd34 | ||
|
|
54cce67156 | ||
|
|
7db5b33284 | ||
|
|
6607ddb15d | ||
|
|
f18c1b3998 | ||
|
|
bd75b34f5d | ||
|
|
057de8f9be | ||
|
|
404bfdc782 | ||
|
|
b74a1b5a32 | ||
|
|
9f38e81735 | ||
|
|
47ecde75ec | ||
|
|
07948ff6a7 | ||
|
|
381bccfd6a | ||
|
|
3221038bc6 | ||
|
|
0359a65a00 | ||
|
|
eb1b77ad01 | ||
|
|
45c7bab8e4 | ||
|
|
0a558652e3 | ||
|
|
30126c9288 | ||
|
|
39562edc45 | ||
|
|
c19e513efb | ||
|
|
cf22cbcab5 | ||
|
|
e444b277f8 | ||
|
|
49dfbee211 | ||
|
|
3fc3875e82 | ||
|
|
a9099ce2c1 | ||
|
|
ad9fc59d19 | ||
|
|
0e14d42dcf | ||
|
|
987ff861fd | ||
|
|
f3f36e323b | ||
|
|
f7326b0533 | ||
|
|
dbde650339 | ||
|
|
a338e3fae8 | ||
|
|
df59bf8811 | ||
|
|
99e669bb63 | ||
|
|
66b4dcf37a | ||
|
|
1462d5c6bd | ||
|
|
60d2efc74b | ||
|
|
144b44e838 | ||
|
|
3245ff59d3 | ||
|
|
3a4d58f114 | ||
|
|
494f054ef4 | ||
|
|
0079a08cb8 | ||
|
|
d31ff6a83f | ||
|
|
58abb54da5 | ||
|
|
2fb4dccff0 | ||
|
|
45a4fc34d1 | ||
|
|
dc65627453 | ||
|
|
d24cbaf556 | ||
|
|
cbf71f678a | ||
|
|
c983418cb3 | ||
|
|
240c44b338 | ||
|
|
505ac0021d | ||
|
|
c020154a2f | ||
|
|
aac1663d75 | ||
|
|
5b9d963d31 | ||
|
|
31a6f5c4e3 | ||
|
|
98535e572d | ||
|
|
ffcfaba2fa | ||
|
|
464d868af5 | ||
|
|
34a6e81f72 | ||
|
|
57a9b520b0 | ||
|
|
6952970895 | ||
|
|
14e20e6435 | ||
|
|
93abd016b4 | ||
|
|
2ebde976db | ||
|
|
dbaee7c49c | ||
|
|
b6be4f8dde | ||
|
|
68a31c902a | ||
|
|
78e6fbcf07 | ||
|
|
0403b684c4 | ||
|
|
ccf05c6d83 | ||
|
|
a6a62007dc | ||
|
|
549c42ac19 | ||
|
|
6bfeb15655 | ||
|
|
69eb071fab | ||
|
|
277a62a897 | ||
|
|
96da85d2c1 | ||
|
|
b53b71a8ad | ||
|
|
009ffd609d | ||
|
|
50044f2f13 | ||
|
|
0a2f4eb5be | ||
|
|
0ee25621d6 | ||
|
|
e64c542c6a | ||
|
|
97ef3cccef | ||
|
|
766049afbb | ||
|
|
4fff4f679f | ||
|
|
2123f284de | ||
|
|
fb9b8fa625 | ||
|
|
d9e645b63f | ||
|
|
c2545c6762 | ||
|
|
c846d827cc | ||
|
|
f75179134d | ||
|
|
a30b22505c | ||
|
|
bbf4082b1f | ||
|
|
84a9da2f06 | ||
|
|
4f457e945a | ||
|
|
64f081009d | ||
|
|
486bbae323 | ||
|
|
b49a1904df | ||
|
|
1a70b54129 | ||
|
|
70332c4f2b | ||
|
|
8789141d0f | ||
|
|
29e7497adc | ||
|
|
8ecf28de9b | ||
|
|
66abc05259 | ||
|
|
5b04c49e74 | ||
|
|
f26e9758d5 | ||
|
|
531cb89943 | ||
|
|
24ead2f125 | ||
|
|
225e50a32a | ||
|
|
d546877e7d | ||
|
|
9657bd51d0 | ||
|
|
fd47fc3d12 | ||
|
|
c74d8bb602 | ||
|
|
ec7844072f | ||
|
|
128390d52e | ||
|
|
f7d23a4b9f | ||
|
|
2dec48f8af | ||
|
|
3f8ec8d46e | ||
|
|
a607d1178f | ||
|
|
1a3d412669 | ||
|
|
ae08d21bf1 | ||
|
|
5f69e58f37 | ||
|
|
84b0ee2284 | ||
|
|
4e9005be14 | ||
|
|
f280c64980 | ||
|
|
d0ae6a9a7d | ||
|
|
9aca360fe5 | ||
|
|
5d92a3a891 | ||
|
|
70787b0a6d | ||
|
|
206b8bc899 | ||
|
|
a0ea94b531 | ||
|
|
790a7a37d2 | ||
|
|
c0eace067a | ||
|
|
9d6835737b | ||
|
|
1b4625cedd | ||
|
|
fba75e3122 | ||
|
|
91bf99d2a5 | ||
|
|
6f29d2a5d8 | ||
|
|
008ef41261 | ||
|
|
c61d341844 | ||
|
|
49e5a48e42 | ||
|
|
9a97898ea4 | ||
|
|
cce1fa8928 | ||
|
|
cddea1e4c1 | ||
|
|
2cbf5cbf7b | ||
|
|
e360565266 | ||
|
|
dce7be2775 | ||
|
|
922e5beb3f | ||
|
|
6c6b6f7f13 | ||
|
|
798546302d | ||
|
|
65c6945fe3 | ||
|
|
e5820feedd | ||
|
|
df15bf5c59 | ||
|
|
2ccd9da8e8 | ||
|
|
18b5d6f1ed | ||
|
|
a78fe12663 | ||
|
|
87fde19623 | ||
|
|
93a4201c66 | ||
|
|
88369e0366 | ||
|
|
e50094e10a | ||
|
|
4e74819bac | ||
|
|
084b54723a | ||
|
|
60e830b64c | ||
|
|
0d52bb291c | ||
|
|
9e37c04fb2 | ||
|
|
7870940532 | ||
|
|
3adf31c85b | ||
|
|
9b2c6caf22 | ||
|
|
87b48ee3e5 | ||
|
|
9880a488ac | ||
|
|
f59675e9bf | ||
|
|
dd3ea0b5e6 | ||
|
|
4dbb1f6101 | ||
|
|
ced38e86c4 | ||
|
|
927b804684 | ||
|
|
27de834abc | ||
|
|
7de8f63b2b | ||
|
|
f042fe4713 | ||
|
|
27f3ba941f | ||
|
|
9413d5deb4 | ||
|
|
8a903f1e2c | ||
|
|
9246f4925b | ||
|
|
128fb82c1c | ||
|
|
3bf4a93a44 | ||
|
|
6460447ae9 | ||
|
|
344683927f | ||
|
|
828f088b6c | ||
|
|
d9f4730d0b | ||
|
|
aa5d320707 | ||
|
|
69c77c0a24 | ||
|
|
5ceedab213 | ||
|
|
1c4f3cbf19 | ||
|
|
90bf55e645 | ||
|
|
e066e920d0 | ||
|
|
fceaac48a6 | ||
|
|
4330b61217 | ||
|
|
97410042bd | ||
|
|
75592bec01 | ||
|
|
e96b1c8106 | ||
|
|
fdb6908474 | ||
|
|
5d63071849 | ||
|
|
8c98c7b675 | ||
|
|
5eb54321e8 | ||
|
|
9ce44af204 | ||
|
|
51e840a150 | ||
|
|
f6b4ec0fdf | ||
|
|
8439a3add9 | ||
|
|
9b3511cc88 | ||
|
|
48f80ebc93 | ||
|
|
e1108c5e17 | ||
|
|
1d6eee3262 | ||
|
|
14bcdee7e2 | ||
|
|
ec12de89c8 | ||
|
|
57e858ccc4 | ||
|
|
2c44452dc6 | ||
|
|
24f2720df4 | ||
|
|
d9c30c8942 | ||
|
|
6f3d70c69f | ||
|
|
99948b601b | ||
|
|
24a374500c | ||
|
|
b9cd6d3505 | ||
|
|
d9e907535e | ||
|
|
d1426e85b3 | ||
|
|
efdd052674 | ||
|
|
9964a0d9e5 | ||
|
|
d3e1cff733 | ||
|
|
b5096ad65e | ||
|
|
56d0e03991 | ||
|
|
c765943fdf | ||
|
|
91898d1512 | ||
|
|
c4d9262abf | ||
|
|
9b40854d27 | ||
|
|
2092da2907 | ||
|
|
9b9e489b61 | ||
|
|
9f9831ac56 | ||
|
|
afe5148211 | ||
|
|
5ab1606c47 | ||
|
|
b83ab97a8a | ||
|
|
6255932e48 | ||
|
|
9ad09a0166 | ||
|
|
728a656df4 | ||
|
|
4933a70261 | ||
|
|
02c24dffdc | ||
|
|
aa7ee8e65d | ||
|
|
64a6a28c30 | ||
|
|
f8bdb8bd16 | ||
|
|
2417faa39b | ||
|
|
5c2f62657f | ||
|
|
ae34c7e1cc | ||
|
|
07a3a0e1c8 | ||
|
|
c43f4ea080 | ||
|
|
149414f233 | ||
|
|
14695faa43 | ||
|
|
1159c0530b | ||
|
|
053ecec70b | ||
|
|
42601d8451 | ||
|
|
49392992da | ||
|
|
545c303058 | ||
|
|
086daef494 | ||
|
|
6898df1c86 | ||
|
|
307a019cb8 | ||
|
|
4ca16188c2 | ||
|
|
53687387eb | ||
|
|
eff1cea890 | ||
|
|
7867c3d906 | ||
|
|
5b5f421786 | ||
|
|
77cc2a6b8e | ||
|
|
e58ff89044 | ||
|
|
57eae464a3 | ||
|
|
8ec00e90ba | ||
|
|
a0f078718a | ||
|
|
b3a2031484 | ||
|
|
abf6e4856c | ||
|
|
518e6782d8 | ||
|
|
2a346ef0b9 | ||
|
|
83a2b2080b | ||
|
|
f21ecb32bb | ||
|
|
f810fa262d | ||
|
|
a847f46edc | ||
|
|
e710bbcec8 | ||
|
|
52f8fa1d5b | ||
|
|
5661de58a8 | ||
|
|
a1d5cb0e69 | ||
|
|
89ca436e91 | ||
|
|
d5356bee99 | ||
|
|
0384294cbf | ||
|
|
0da1f7be27 | ||
|
|
b24f2f14f0 | ||
|
|
40a1fab5e0 | ||
|
|
9464cbcf87 | ||
|
|
4334a1985b | ||
|
|
ba03124720 | ||
|
|
27b1e28f63 | ||
|
|
4431ef7736 | ||
|
|
4c86c8c264 | ||
|
|
275550a9c3 | ||
|
|
38cf61209e | ||
|
|
8670e9e5aa | ||
|
|
260eeacbeb | ||
|
|
13b2aed936 | ||
|
|
88431b9286 | ||
|
|
a12c6b7bef | ||
|
|
f81d99289f | ||
|
|
97739f8852 | ||
|
|
bdc0309296 | ||
|
|
e1a5edefc1 | ||
|
|
373c400cc3 | ||
|
|
d93e53498d | ||
|
|
e82d526414 | ||
|
|
0f11b55ba3 | ||
|
|
a665d2f62c | ||
|
|
0baa5a82ad | ||
|
|
0ea1775084 | ||
|
|
2fda0bd12b | ||
|
|
3b5c9e7a84 | ||
|
|
c0d8e7e245 | ||
|
|
d73ff21b27 | ||
|
|
4a90199f63 | ||
|
|
0dab0b5969 | ||
|
|
8e9bdf4115 | ||
|
|
613cbb8601 | ||
|
|
8cf02324ce | ||
|
|
9f75f28e7a | ||
|
|
feb4a39457 | ||
|
|
cca1fd6f19 | ||
|
|
4fb126635c | ||
|
|
9f282c2898 | ||
|
|
be3b95db6b | ||
|
|
c02b350b3d | ||
|
|
85f6d8308a | ||
|
|
06f2750eef | ||
|
|
5f078848f1 | ||
|
|
6ff68849f8 | ||
|
|
2ea036e02c | ||
|
|
f58ac3e9bf | ||
|
|
56e161d1ff | ||
|
|
85da2b7e23 | ||
|
|
da7136ab7e | ||
|
|
73264b2e80 | ||
|
|
567d48f813 | ||
|
|
0c3d350865 | ||
|
|
65211c94c3 | ||
|
|
b3b84f8357 | ||
|
|
a49d12b887 | ||
|
|
b5cb7e5649 | ||
|
|
c27c2b3487 | ||
|
|
56e9805562 | ||
|
|
f197e750b6 | ||
|
|
206bc9afb6 | ||
|
|
ffcfa5b2cb | ||
|
|
afae5d80c7 | ||
|
|
5e680e0f66 | ||
|
|
45015d6106 | ||
|
|
c3223245e5 | ||
|
|
fdf43e5874 | ||
|
|
dcc1a5db52 | ||
|
|
46ed52032d | ||
|
|
345a52b153 | ||
|
|
2accb00adc | ||
|
|
65c672fa1c | ||
|
|
f430dafb30 | ||
|
|
44524c057d | ||
|
|
a42322be99 | ||
|
|
6d8de238a0 | ||
|
|
c0d3135e54 | ||
|
|
b8b5203d08 | ||
|
|
f087afd796 | ||
|
|
91a230b38d | ||
|
|
72dc25abd1 | ||
|
|
b85b3d9bbd | ||
|
|
b6188abeeb | ||
|
|
1cd9fac9fb | ||
|
|
f1a2a7cfe9 | ||
|
|
f7fdd0a63a | ||
|
|
79ec2ee8f7 | ||
|
|
5c4f0de1d0 | ||
|
|
b9c1b1a5ea | ||
|
|
75036c43b5 | ||
|
|
3656cd66ea | ||
|
|
da88b87279 | ||
|
|
900f38779d | ||
|
|
d369ac8bf5 | ||
|
|
244eca4b38 | ||
|
|
67690748bd | ||
|
|
218ceb8a2a | ||
|
|
39ec81117d | ||
|
|
70f91204b1 | ||
|
|
f4739ae147 | ||
|
|
518125b836 | ||
|
|
7d4b353780 | ||
|
|
dbede8d6df | ||
|
|
5c48c72b56 | ||
|
|
8f52a3a3cc | ||
|
|
61a6af1de7 | ||
|
|
77f8bea615 | ||
|
|
bb49bc7844 | ||
|
|
c56ad76d18 | ||
|
|
b5dd04aa12 | ||
|
|
788724a1ca | ||
|
|
d577eb338c | ||
|
|
639ce20ecc | ||
|
|
27b6715910 | ||
|
|
b8ef8565e8 | ||
|
|
6d2f855af2 | ||
|
|
ae81bbb441 | ||
|
|
7db570af13 | ||
|
|
6a21831894 | ||
|
|
ee49851de4 | ||
|
|
e1ca614f1c | ||
|
|
01d1ea0b90 | ||
|
|
59ada379e2 | ||
|
|
52715c9220 | ||
|
|
4409fb9b21 | ||
|
|
e845d02242 | ||
|
|
35ed5b3c9b | ||
|
|
2567088192 | ||
|
|
26a083e700 | ||
|
|
8c4c87112c | ||
|
|
d052603335 | ||
|
|
01395fc579 | ||
|
|
bbe15eab7e | ||
|
|
015842ed83 | ||
|
|
d76f346648 | ||
|
|
34a5ab7498 | ||
|
|
72e537e951 | ||
|
|
670c067891 | ||
|
|
5ec4616614 | ||
|
|
bae9ef77e5 | ||
|
|
b2484afe96 | ||
|
|
e2e7479b8e | ||
|
|
cad38fe6da | ||
|
|
f5bfb537da | ||
|
|
e7f8ebaf77 | ||
|
|
29eab14f79 | ||
|
|
febcc8995d | ||
|
|
72cc87b012 | ||
|
|
5705e471b7 | ||
|
|
d8e30eb793 | ||
|
|
2c903dcb67 | ||
|
|
2d3aafefe1 | ||
|
|
5b1f16d7e9 | ||
|
|
4b74a1be58 | ||
|
|
2aeb77736f | ||
|
|
4a9d2d92d3 | ||
|
|
15c051e3ad | ||
|
|
6ee2fbf88c | ||
|
|
5665653b7d | ||
|
|
e7c0480bc3 | ||
|
|
241cec6e43 | ||
|
|
d8328b6f6e | ||
|
|
9e91f6f8d9 | ||
|
|
69b381fb66 | ||
|
|
ffa74500e6 | ||
|
|
356c135cbe | ||
|
|
9e05a02bbf | ||
|
|
b63dcabca4 | ||
|
|
cc9191382f | ||
|
|
0e86633cde | ||
|
|
9212e832e6 | ||
|
|
848763bb5c | ||
|
|
076357a2c4 | ||
|
|
daea5487ba | ||
|
|
dbd1b977fc | ||
|
|
5d14667536 | ||
|
|
ab289f8392 | ||
|
|
fa4584555d | ||
|
|
4b2a340bc7 | ||
|
|
7cb9a5064a | ||
|
|
4b6ec02517 | ||
|
|
9ea3b34e7e | ||
|
|
440c6d2d9a | ||
|
|
e579450af6 | ||
|
|
50e463917c | ||
|
|
a3ad297f92 | ||
|
|
6707640fa3 | ||
|
|
50bc5c8398 | ||
|
|
281065b5d4 | ||
|
|
f64d21e8c2 | ||
|
|
d5284a5704 | ||
|
|
9b2b603c8d | ||
|
|
6f85a204a9 | ||
|
|
b5f3d2565a | ||
|
|
2fdf52afb8 | ||
|
|
a651cf33f4 | ||
|
|
9e15d771c8 | ||
|
|
c48a2252d0 | ||
|
|
978cd2ec51 | ||
|
|
79f3afc2eb | ||
|
|
602142dc45 | ||
|
|
a4b6e99858 | ||
|
|
8730f2b073 | ||
|
|
20a6e66e11 | ||
|
|
94d397b8c5 | ||
|
|
adceb9eabb | ||
|
|
19a06a8755 | ||
|
|
87790a8d7a | ||
|
|
a6d32f4a62 | ||
|
|
a5f9bda131 | ||
|
|
327b2355c1 | ||
|
|
20308faef1 | ||
|
|
170ab57f55 | ||
|
|
874054f3bb | ||
|
|
a08f3c4c9e | ||
|
|
c0f98bb0ec | ||
|
|
42b067dc39 | ||
|
|
089e3816a8 | ||
|
|
ae15532477 | ||
|
|
b8ee806a80 | ||
|
|
9186f5eeeb | ||
|
|
216e70756c | ||
|
|
5a52922cd2 | ||
|
|
55edf30ecf | ||
|
|
d231539504 | ||
|
|
262ec3ed3c | ||
|
|
38a5e55745 | ||
|
|
8a4562c0a9 | ||
|
|
760c313f65 | ||
|
|
706ebc39eb | ||
|
|
46dfbf826d | ||
|
|
60c6858916 | ||
|
|
c5e085bc96 | ||
|
|
8dc669bc33 | ||
|
|
8aed75a338 | ||
|
|
e486e2ce8d | ||
|
|
a1705da6da | ||
|
|
0092a029c4 | ||
|
|
176ef90258 | ||
|
|
f82a6b7b41 | ||
|
|
c79c42b62d | ||
|
|
91dd7adbfa | ||
|
|
de82f07277 | ||
|
|
0c8e0b6708 | ||
|
|
c71a840e74 | ||
|
|
2b5c25ef17 | ||
|
|
da34156267 | ||
|
|
113ef45c6c | ||
|
|
67dd40dc08 | ||
|
|
1e0fee739e | ||
|
|
d59a98ffe6 | ||
|
|
5e9429afe8 | ||
|
|
31fd0451d0 | ||
|
|
b56be08f95 | ||
|
|
b1923cadb5 | ||
|
|
0a955c1020 | ||
|
|
791efc9e79 | ||
|
|
f9bc94bfb8 | ||
|
|
72119ddfa4 | ||
|
|
d4afca9b5a | ||
|
|
219ac40a7d | ||
|
|
b9378fe4c1 | ||
|
|
3c05822011 | ||
|
|
02cad7b5fe | ||
|
|
1a85ec5fdb | ||
|
|
3e19cfe58e | ||
|
|
3d3c7437be | ||
|
|
c4b57774f0 | ||
|
|
f7acded7a1 | ||
|
|
cabcca2e31 | ||
|
|
cc3237a77d | ||
|
|
b65e02420f | ||
|
|
5a7761c294 | ||
|
|
ad332494d0 | ||
|
|
eb212cd27e | ||
|
|
b604dd0bcc | ||
|
|
c0b879c998 | ||
|
|
e473af1635 | ||
|
|
8d9c6b2d01 | ||
|
|
7cdcb6c4ef | ||
|
|
ca44d84e55 | ||
|
|
e73a3c3376 | ||
|
|
1f9973e623 | ||
|
|
9077f3d675 | ||
|
|
ce61d27d8d | ||
|
|
5c1dbc0104 | ||
|
|
aa55f67ee3 | ||
|
|
9516694c35 | ||
|
|
c6a9f239c4 | ||
|
|
a922acc4dd | ||
|
|
bfef8c9bbe | ||
|
|
3fe2843bb3 | ||
|
|
42b8378988 | ||
|
|
c6bd721d2e | ||
|
|
83eedef999 | ||
|
|
1411e7f9f6 | ||
|
|
5d42d9212f | ||
|
|
4a1e05524a | ||
|
|
fb5ac9c4cd | ||
|
|
ed4e33d888 | ||
|
|
c6dd73065d | ||
|
|
9ef48de1a8 | ||
|
|
692ad43285 | ||
|
|
d06ff478d1 | ||
|
|
83db04cdce | ||
|
|
d0a724bb08 | ||
|
|
8e9ac1b9ac | ||
|
|
272d4efd4b | ||
|
|
4610f451e9 | ||
|
|
0810859c21 | ||
|
|
93c447051c | ||
|
|
60b3f042a8 | ||
|
|
c5632360d6 | ||
|
|
a379b4aab8 | ||
|
|
3b8d6ef208 | ||
|
|
9705d5e38b | ||
|
|
2e59b56f16 | ||
|
|
d9f9e8e57a | ||
|
|
33a8befbcf | ||
|
|
4f66a419e3 | ||
|
|
65992746d3 | ||
|
|
cbd4c64084 | ||
|
|
081be61f88 | ||
|
|
b89ca87280 | ||
|
|
ca84f10921 | ||
|
|
2200c4af6b | ||
|
|
838dfa453c | ||
|
|
6f3d636226 | ||
|
|
f03792619a | ||
|
|
21b3292fff | ||
|
|
39ebeb2401 | ||
|
|
8f4e8ed1e7 | ||
|
|
0e10ead81a | ||
|
|
476612d8f8 | ||
|
|
bd769c9261 | ||
|
|
831f78a389 | ||
|
|
920edce73e | ||
|
|
7dc7b002c5 | ||
|
|
c74c9bd693 | ||
|
|
1daf15c525 | ||
|
|
108949345f | ||
|
|
69eb309031 | ||
|
|
e7f0c8cbe1 | ||
|
|
9c8b663d5b | ||
|
|
8309b63fb1 | ||
|
|
6d6de880eb | ||
|
|
a65bf79ad9 | ||
|
|
c192188b42 | ||
|
|
a3516ce655 | ||
|
|
8481db4735 | ||
|
|
b6390c3dbd | ||
|
|
0f914cf747 | ||
|
|
5fab7d2993 | ||
|
|
faee142876 | ||
|
|
215c63233a | ||
|
|
e5afcd14a9 | ||
|
|
96a7d1e7ec | ||
|
|
2d2a65b616 | ||
|
|
b5d32fe271 | ||
|
|
8a5a69818e | ||
|
|
56701220e9 | ||
|
|
6bf434a7ab | ||
|
|
d1e767d30c | ||
|
|
4874df25a2 | ||
|
|
f43868e4dc | ||
|
|
bc8227d2bd | ||
|
|
09e748d6c9 | ||
|
|
4038ad5ce5 | ||
|
|
973864e045 | ||
|
|
af694b57a2 | ||
|
|
07be0c6ef4 | ||
|
|
78a336c092 | ||
|
|
649c0f8055 | ||
|
|
87b66b8db8 | ||
|
|
a4ffa3de7a | ||
|
|
dd111f55f6 | ||
|
|
5db6264d8f | ||
|
|
4ce63c8caf | ||
|
|
727f8b1d9b | ||
|
|
35f2bcf296 | ||
|
|
7ebfe84489 | ||
|
|
4e645debaa | ||
|
|
821ab99bf7 | ||
|
|
282e242f5e | ||
|
|
13deb8d8d7 | ||
|
|
389992c330 | ||
|
|
0753c52bed | ||
|
|
24ce9b0f8d | ||
|
|
6e6f8412a5 | ||
|
|
853cdcdd31 | ||
|
|
f24ec20623 | ||
|
|
cdc7d695e9 | ||
|
|
d1cf754c6e | ||
|
|
d1f63fe260 | ||
|
|
53eee70c03 | ||
|
|
7b73ba551e | ||
|
|
af1176274a | ||
|
|
4c2ef9947a | ||
|
|
db7c9e96ea | ||
|
|
ee5398b3be | ||
|
|
3d3ab0fedc | ||
|
|
d21efb51ce | ||
|
|
bd4c742212 | ||
|
|
c821fd938c | ||
|
|
977caba4ca | ||
|
|
8b167a70b8 | ||
|
|
ecca96c03e | ||
|
|
49231a593a | ||
|
|
0338899804 | ||
|
|
810c2250c4 | ||
|
|
5ed210f0f3 | ||
|
|
7508390747 | ||
|
|
67620b7948 | ||
|
|
6c0500d1b6 | ||
|
|
7144efff4e | ||
|
|
3ae31c34f6 | ||
|
|
bc5072ed54 | ||
|
|
2aa7c45ca2 | ||
|
|
73467dc523 | ||
|
|
4ff744ef89 | ||
|
|
b8722b3537 | ||
|
|
caed2ae757 | ||
|
|
5ffdb8eeb4 | ||
|
|
90445f7f1d | ||
|
|
5a298c165e | ||
|
|
63ba377f6f | ||
|
|
a15cdb4c1d | ||
|
|
dff14a868f | ||
|
|
4304301701 | ||
|
|
2dd31b0a44 | ||
|
|
23e01808a2 | ||
|
|
b8300add62 | ||
|
|
97cb1e2080 | ||
|
|
e9d6735e52 | ||
|
|
9d8381041d | ||
|
|
5cf4226c13 | ||
|
|
5bb3d8a24d | ||
|
|
1de683efa4 | ||
|
|
3e705be6c8 | ||
|
|
6548ec1b43 | ||
|
|
e739a74705 | ||
|
|
c0d401fbfc | ||
|
|
7b813d03b9 | ||
|
|
93d06e8680 | ||
|
|
7f22b33f5a | ||
|
|
ceaacba1c2 | ||
|
|
6bee1dcecd | ||
|
|
3c28048038 | ||
|
|
fb02ae0e9a | ||
|
|
ffb293fe0a | ||
|
|
f46522572e | ||
|
|
2ecb87ddc3 | ||
|
|
a34530ebb7 | ||
|
|
0973e7009e | ||
|
|
d0d18441cf | ||
|
|
3f1c37aa76 | ||
|
|
8165342670 | ||
|
|
686c68a90d | ||
|
|
86dbf089cc | ||
|
|
9f3ea84b57 | ||
|
|
3f007d2dbb | ||
|
|
cde68af79a | ||
|
|
574e70642b | ||
|
|
ae156d9326 | ||
|
|
c08268d0ae | ||
|
|
0e4d031054 | ||
|
|
de15ee057a | ||
|
|
1d873cc701 | ||
|
|
bcde60b9e8 | ||
|
|
d6d2b2e756 | ||
|
|
4276573f67 | ||
|
|
fa3481ea8e | ||
|
|
ac54eceea5 | ||
|
|
e1c29bf2af | ||
|
|
0fe560ed7f | ||
|
|
23269040a6 | ||
|
|
b03649748a | ||
|
|
06851f8b98 | ||
|
|
893fc7c940 | ||
|
|
3819aecf07 | ||
|
|
a186b22d6e | ||
|
|
a43186d137 | ||
|
|
554f4889bc | ||
|
|
b584832e75 | ||
|
|
299c911330 | ||
|
|
6318b592a3 | ||
|
|
2b7e7fe6f6 | ||
|
|
bb8983b48a | ||
|
|
666861419d | ||
|
|
52d6c5ac88 | ||
|
|
5b89a2375a | ||
|
|
c0d19de08d | ||
|
|
27d85a737c | ||
|
|
277f542304 | ||
|
|
517a5b6844 | ||
|
|
d4f98902a0 | ||
|
|
eb289e8542 | ||
|
|
06754daf87 | ||
|
|
ee509f6350 | ||
|
|
6a7c6cba12 | ||
|
|
129f5e93fa | ||
|
|
629312b382 | ||
|
|
d31524691b | ||
|
|
ff6ec86f1c | ||
|
|
0c55facdd9 | ||
|
|
d9e1f91735 | ||
|
|
9f037fef60 | ||
|
|
0bc7100ea8 | ||
|
|
8698a58a60 | ||
|
|
a8151de2cb | ||
|
|
7a9005dae6 | ||
|
|
a77f8bf203 | ||
|
|
efc7877ffd | ||
|
|
3cb7632dc8 | ||
|
|
cde8e54b51 | ||
|
|
8ce1a2d605 | ||
|
|
d09379990b | ||
|
|
136318f98a | ||
|
|
1775844f45 | ||
|
|
987a663094 | ||
|
|
107dbd5645 | ||
|
|
bebd8f3c1a | ||
|
|
3be1e33339 | ||
|
|
91348f22be | ||
|
|
c9279061fa | ||
|
|
5bfe397c63 | ||
|
|
a202640da4 | ||
|
|
08fcdfa0fb | ||
|
|
51fb706781 | ||
|
|
92ed70f029 | ||
|
|
067b28be41 | ||
|
|
81b7fc519c | ||
|
|
24cc0c8422 | ||
|
|
8459ea0d31 | ||
|
|
494c245b59 | ||
|
|
d87f0ea728 | ||
|
|
dbdfc13a23 | ||
|
|
c19730f5e2 | ||
|
|
446e735825 | ||
|
|
0e47d1269c | ||
|
|
7dc5359c2b | ||
|
|
e394903ccf | ||
|
|
98bb78ae3a | ||
|
|
defe5ce594 | ||
|
|
713e3fa89d | ||
|
|
73f813279a | ||
|
|
0063cad60d | ||
|
|
3bb3f618b9 | ||
|
|
53195e3a25 | ||
|
|
09103aa52e | ||
|
|
ee63a9f368 | ||
|
|
9a73c15b84 | ||
|
|
b50dec9d92 | ||
|
|
9f8feb622e | ||
|
|
db156b41fb | ||
|
|
374583bb48 | ||
|
|
5d3c218b1b | ||
|
|
f34427e772 | ||
|
|
a1666986c6 | ||
|
|
b669177c83 | ||
|
|
1678d2b97a | ||
|
|
3564f41c48 | ||
|
|
72314a33ab | ||
|
|
9289b29504 | ||
|
|
de115b87df | ||
|
|
cfeb0626cc | ||
|
|
3f2c4ed794 | ||
|
|
978256179b | ||
|
|
742af765ba | ||
|
|
035d0aebc1 | ||
|
|
a5dbd58200 | ||
|
|
9073e1d47e | ||
|
|
ed1078dadf | ||
|
|
83dbd728ef | ||
|
|
31a6149b0f | ||
|
|
3d274fdfd9 | ||
|
|
8f3ec680c7 | ||
|
|
612e94be9d | ||
|
|
7a95c78ba0 | ||
|
|
5a2a546090 | ||
|
|
baf6fc8987 | ||
|
|
bf75d6496f | ||
|
|
fb7f134c06 | ||
|
|
067dcbc0f7 | ||
|
|
280bc969ce | ||
|
|
010b8a79cb | ||
|
|
4ec39ae323 | ||
|
|
ec7c654451 | ||
|
|
6022a61b3c | ||
|
|
975b489007 | ||
|
|
f8f1859a05 | ||
|
|
92f2a44b28 | ||
|
|
7585a984b2 | ||
|
|
789bf9c220 | ||
|
|
2e9bc93e1f | ||
|
|
e2a993a425 | ||
|
|
d0b5c79b81 | ||
|
|
95622ca964 | ||
|
|
76b63de754 | ||
|
|
58cdb1bda2 | ||
|
|
a530f56511 | ||
|
|
bf6e74ad8e | ||
|
|
c2253dafc0 | ||
|
|
389d159c7a | ||
|
|
21161ae38e | ||
|
|
aa074d7121 | ||
|
|
99d04e93a2 | ||
|
|
d6b9df6ca2 | ||
|
|
4fbeca0aa3 | ||
|
|
f19b89b263 | ||
|
|
0a908d78ca | ||
|
|
f2b8b06280 | ||
|
|
0cc04e5253 | ||
|
|
5e9a9b9867 | ||
|
|
68826baf3b | ||
|
|
cc26096c28 | ||
|
|
1c110080a8 | ||
|
|
7b67bbe698 | ||
|
|
7692371ccb | ||
|
|
534eb4ce88 | ||
|
|
c88b936233 | ||
|
|
32c229215a | ||
|
|
9c5cc38c9a | ||
|
|
12795ea491 | ||
|
|
c0b143043f | ||
|
|
40b849da23 | ||
|
|
4f18bd6293 | ||
|
|
702e92d4f4 | ||
|
|
40fa336829 | ||
|
|
fa93803b45 | ||
|
|
7201dbd477 | ||
|
|
40248c3e13 | ||
|
|
f2a0a1b62d | ||
|
|
dcb4bbb3e6 | ||
|
|
21c56e7898 | ||
|
|
7c74e7be35 | ||
|
|
bf5ec1eb57 | ||
|
|
342241a24d | ||
|
|
d047dcb983 | ||
|
|
0fc310f1c4 | ||
|
|
c6e14a562b | ||
|
|
a3f6a7ddbc | ||
|
|
c8c09d7e09 | ||
|
|
411163c73f | ||
|
|
b25aa07e11 | ||
|
|
bc72a506c1 | ||
|
|
8451c62b44 | ||
|
|
1f3729822a | ||
|
|
a27283aa9b | ||
|
|
1eb1bd6800 | ||
|
|
cda4af3403 | ||
|
|
93ea5bacb7 | ||
|
|
841c5c22e0 | ||
|
|
511446846f | ||
|
|
a79bf97b48 | ||
|
|
a78d5e2636 | ||
|
|
b6d2e3fb55 | ||
|
|
43850ac856 | ||
|
|
532b1697a6 | ||
|
|
a3f63a12f9 | ||
|
|
b2dfe64cea | ||
|
|
ff7dc072d1 | ||
|
|
b185afa29f | ||
|
|
742742fd48 | ||
|
|
5f6104a9d3 | ||
|
|
787198b30e | ||
|
|
3490c63259 | ||
|
|
8077d7bb0b | ||
|
|
b2c8c227ec | ||
|
|
ca8ff5fda9 | ||
|
|
a6f2d96557 | ||
|
|
948205e6f9 | ||
|
|
d90b6b7e51 | ||
|
|
e3e1ee313b | ||
|
|
dc5c049ed9 | ||
|
|
642260bdb6 | ||
|
|
bafa85e772 | ||
|
|
4f102a43fa | ||
|
|
2ac265d529 | ||
|
|
e261270eb8 | ||
|
|
d08bd0c619 | ||
|
|
cc833341e4 | ||
|
|
add0081b50 | ||
|
|
46fb9d6df1 | ||
|
|
e324942a07 | ||
|
|
b853012cb6 | ||
|
|
d64d7db5f5 | ||
|
|
d19a076f1e | ||
|
|
5ad314ba5a | ||
|
|
c7473dd7c9 | ||
|
|
abb9ab1bb6 | ||
|
|
8bc9baefd6 | ||
|
|
0fe835e087 | ||
|
|
e8ed41c763 | ||
|
|
d9cd0604cc | ||
|
|
afb2cc4a99 | ||
|
|
a72751914d | ||
|
|
9e3c5b1bf2 | ||
|
|
bf77789076 | ||
|
|
1b0d063cff | ||
|
|
24f8f47f76 | ||
|
|
7745457f9b | ||
|
|
660bbae9a8 | ||
|
|
c071e9b051 | ||
|
|
1c1bab8d6b | ||
|
|
8beb818100 | ||
|
|
1ff0a7c4e7 | ||
|
|
49991a3341 | ||
|
|
88af5ea07c | ||
|
|
63fbd64eb8 | ||
|
|
8337fd306a | ||
|
|
7df6dbeafb | ||
|
|
bf2d6b8999 | ||
|
|
5528cb9f16 | ||
|
|
d8bc6dcc1b | ||
|
|
c0ebc4cbb0 | ||
|
|
e3b6d6e6b2 | ||
|
|
a50b10b869 | ||
|
|
183704ab95 | ||
|
|
e654ed980a | ||
|
|
a4eb35371f | ||
|
|
0931f95e65 | ||
|
|
83997e1125 | ||
|
|
555a1184e4 | ||
|
|
f6b31f65ac | ||
|
|
fc67b208ad | ||
|
|
b6f83007eb | ||
|
|
6e82268704 | ||
|
|
4142cc296b | ||
|
|
e98b1e6716 | ||
|
|
fda8b96063 | ||
|
|
bb8e11e08d | ||
|
|
aee1fe1004 | ||
|
|
fbcd77a1a7 | ||
|
|
90f58dbcbe | ||
|
|
729d19ab24 | ||
|
|
ca9a1b6666 | ||
|
|
08aa003335 | ||
|
|
b0a56e2790 | ||
|
|
01f589885f | ||
|
|
038c940e8e | ||
|
|
20067c02bc | ||
|
|
efa3fa3aed | ||
|
|
e0908ced14 | ||
|
|
3068ca8908 | ||
|
|
88406332d2 | ||
|
|
6cb9561d96 | ||
|
|
3135ba57cd | ||
|
|
96420b959a | ||
|
|
15bda0af27 | ||
|
|
a076e9b0a8 | ||
|
|
0cb4fa67f1 | ||
|
|
bf79be222c | ||
|
|
1bb27f2b80 | ||
|
|
96dae29f4d | ||
|
|
4e0df627df | ||
|
|
15411c7c9e | ||
|
|
b4c389c374 | ||
|
|
44aeead296 | ||
|
|
5e0d4800d9 | ||
|
|
e1a8e8d82d | ||
|
|
4ae714089d | ||
|
|
3894da6242 | ||
|
|
2f74e6ebf8 | ||
|
|
c1aeb2244c | ||
|
|
d231851734 | ||
|
|
c4a68bcd43 | ||
|
|
1add5dac3e | ||
|
|
ec3786f862 | ||
|
|
0e761801de | ||
|
|
39f70c0956 | ||
|
|
0674636243 | ||
|
|
ea89d85845 | ||
|
|
0f3884afde | ||
|
|
7b3d4c6359 | ||
|
|
f9a8fa3854 | ||
|
|
575c86551e | ||
|
|
57bbac4923 | ||
|
|
7f8167e4e2 | ||
|
|
ebce5998de | ||
|
|
672a41a79c | ||
|
|
48b881f491 | ||
|
|
a6f0525a4c | ||
|
|
d9707926fa | ||
|
|
e38c663dea | ||
|
|
b1873b21b6 | ||
|
|
4c4d3dc9e7 | ||
|
|
c7e6777cc1 | ||
|
|
5336524129 | ||
|
|
de30d37ba9 | ||
|
|
e2b6e32fe9 | ||
|
|
f2573a5c02 | ||
|
|
96f8873f2c | ||
|
|
b3919fe819 | ||
|
|
9eeaaf0a03 | ||
|
|
9328ba79d1 | ||
|
|
0c7168648f | ||
|
|
26f8a756cb | ||
|
|
4174442558 | ||
|
|
452a390325 | ||
|
|
9fcb6e1f38 | ||
|
|
826f9cf2f3 | ||
|
|
c18fbfa106 | ||
|
|
cd695f735b | ||
|
|
0e3cd11a55 | ||
|
|
1236c16c83 | ||
|
|
66a47329db | ||
|
|
322f18926e | ||
|
|
5bbc241168 | ||
|
|
83925633e0 | ||
|
|
42943eab95 | ||
|
|
66bf32bafa | ||
|
|
aa42913ece | ||
|
|
e4e8a46424 | ||
|
|
dfe894a39b | ||
|
|
c80feac629 | ||
|
|
71c1ca3eb6 | ||
|
|
ffc99aa52e | ||
|
|
4b10506691 | ||
|
|
57f1f82d76 | ||
|
|
53f84817ba | ||
|
|
221527e0e1 | ||
|
|
501ab2bbe8 | ||
|
|
f78c5a2b18 | ||
|
|
962c3c25b6 | ||
|
|
ae6d6d753a | ||
|
|
3e764fdc45 | ||
|
|
f52ee794db | ||
|
|
34ece330f3 | ||
|
|
7adaf39f1a | ||
|
|
6392550208 | ||
|
|
98d705ed9b | ||
|
|
a356eb7abf | ||
|
|
e950872ec9 | ||
|
|
ab1fdbfead | ||
|
|
7ac8d7de22 | ||
|
|
f012e02b35 | ||
|
|
1ffbb7bf6b | ||
|
|
72927195fd | ||
|
|
e29326d8d0 | ||
|
|
b7bf1955b7 | ||
|
|
1057b88ba7 | ||
|
|
de21088bc4 | ||
|
|
d8698cdc84 | ||
|
|
1ae1906637 | ||
|
|
5a0fc820d4 | ||
|
|
a1f51ad7dc | ||
|
|
fbb89dcf10 | ||
|
|
736552a559 | ||
|
|
162abb0a32 | ||
|
|
a2cd8b72dc | ||
|
|
11aca3f0aa | ||
|
|
c312ca45bd | ||
|
|
f1dc84afef | ||
|
|
7cafe8311e | ||
|
|
9513053f74 | ||
|
|
bfea73d5d8 | ||
|
|
2ae1713ac1 | ||
|
|
fb2047853c | ||
|
|
3dec81b9eb | ||
|
|
b0fa2f5ec0 | ||
|
|
6c367f4a29 | ||
|
|
c8d4d3b69e | ||
|
|
a0234eed48 | ||
|
|
8cc3b54bcd | ||
|
|
d8630d5bdc | ||
|
|
82118c854c | ||
|
|
b1b558d244 | ||
|
|
6ef734960a | ||
|
|
244e3eafdf | ||
|
|
59e367a88e | ||
|
|
681f0ef111 | ||
|
|
098317ed29 | ||
|
|
30cc36abca | ||
|
|
58090c2c32 | ||
|
|
008f5913e9 | ||
|
|
349736b0a5 | ||
|
|
42e926e27c | ||
|
|
80be548b64 | ||
|
|
bb22be4f4f | ||
|
|
fab4c72285 | ||
|
|
9bb42fc5bf | ||
|
|
5d93fc58b3 | ||
|
|
ab633484cd | ||
|
|
5e69a69b8d | ||
|
|
50a9aef179 | ||
|
|
13bc7d17bf | ||
|
|
d8c328ec09 | ||
|
|
2a4c1d0aac | ||
|
|
6c4b88123a | ||
|
|
b78f3a8216 | ||
|
|
8f93b18469 | ||
|
|
a66725adc4 | ||
|
|
8d9d5f3fc3 | ||
|
|
9699198bcc | ||
|
|
aa163b5010 | ||
|
|
aacc392049 | ||
|
|
74b99b52ee | ||
|
|
c7b573dcff | ||
|
|
5b03a1e218 | ||
|
|
77db70f9b5 | ||
|
|
0379d02d8c |
No files matched your search
@@ -0,0 +1,18 @@
|
||||
---
|
||||
BasedOnStyle: WebKit
|
||||
AlignTrailingComments: true
|
||||
AllowShortBlocksOnASingleLine: true
|
||||
AllowShortCaseLabelsOnASingleLine: true
|
||||
AllowShortFunctionsOnASingleLine: true
|
||||
AllowShortIfStatementsOnASingleLine: true
|
||||
ColumnLimit: 0
|
||||
IndentWidth: 4
|
||||
SortIncludes: false
|
||||
MaxEmptyLinesToKeep: 2
|
||||
IndentCaseLabels: true
|
||||
AlignConsecutiveMacros: true
|
||||
WhitespaceSensitiveMacros: ['QUOTE']
|
||||
IfMacros: ['IFX', 'IFXORNAT', 'IFX2', 'IFXA', 'IFX_PENDOR0', 'IFXX', 'IFX2X', 'IFXN', 'UFLAG_IF', 'PASS2IF', 'IF_UNALIGNED', 'IF_ALIGNED']
|
||||
UseTab: Never
|
||||
IndentPPDirectives: None
|
||||
---
|
||||
@@ -13,12 +13,16 @@ on:
|
||||
- X64
|
||||
- GENERIC_ARM
|
||||
- PHYTIUM
|
||||
- RK3288
|
||||
- RK3326
|
||||
- RK3399
|
||||
- RK3588
|
||||
- RPI4ARM64
|
||||
- RPI5ARM64
|
||||
- SD845
|
||||
- SD888
|
||||
- ADLINK
|
||||
- TEGRAX1
|
||||
- ARM64
|
||||
build_type:
|
||||
description: 'Build type'
|
||||
required: true
|
||||
@@ -45,7 +49,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "Checkout Box64 Repository"
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: "Environment preparation"
|
||||
run: |
|
||||
@@ -86,7 +90,7 @@ jobs:
|
||||
make -j$(nproc) VERBOSE=1
|
||||
|
||||
- name: "Upload Artifact"
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: box64-${{ github.event.inputs.platform }}-${{ github.event.inputs.build_type }}
|
||||
path: build/box64
|
||||
|
||||
+403
-20
@@ -1,6 +1,9 @@
|
||||
### Auto build Box64 and release its binary with Github Action
|
||||
name: Build and Release Box64
|
||||
|
||||
permissions:
|
||||
actions: 'write'
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
release:
|
||||
@@ -22,75 +25,455 @@ on:
|
||||
- "CMakeLists.txt"
|
||||
- "**/*.yml"
|
||||
|
||||
defaults:
|
||||
run:
|
||||
# needed on container images which could default to sh
|
||||
shell: bash
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [X64, OTHER_ARM, RISCV, RPI4ARM64, RK3326, RK3399, RK3288, TEGRAX1, PHYTIUM, SD845]
|
||||
type: [Release, Trace]
|
||||
platform: [X64, RISCV, RK3588, ARM64, ANDROID, TERMUX, LARCH64, ANDROID_GLIBC, WOW64, ARM64-GCC-8]
|
||||
type: [Release, Trace, StaticBuild, Box32]
|
||||
exclude:
|
||||
- platform: ANDROID
|
||||
type: StaticBuild
|
||||
- platform: TERMUX
|
||||
type: StaticBuild
|
||||
- platform: X64
|
||||
type: StaticBuild
|
||||
- platform: ANDROID
|
||||
type: Box32
|
||||
- platform: TERMUX
|
||||
type: Box32
|
||||
- platform: WOW64
|
||||
type: Trace
|
||||
- platform: WOW64
|
||||
type: StaticBuild
|
||||
- platform: WOW64
|
||||
type: Box32
|
||||
- platform: ARM64-GCC-8
|
||||
type: Trace
|
||||
- platform: ARM64-GCC-8
|
||||
type: StaticBuild
|
||||
- platform: ANDROID
|
||||
type: Trace
|
||||
- platform: TERMUX
|
||||
type: Trace
|
||||
- platform: LARCH64
|
||||
type: Trace
|
||||
include:
|
||||
- platform: X64
|
||||
os: ubuntu-latest
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
- platform: RISCV
|
||||
os: ubuntu-latest
|
||||
|
||||
- platform: RK3588
|
||||
os: ubuntu-22.04-arm
|
||||
|
||||
- platform: ARM64
|
||||
os: ubuntu-22.04-arm
|
||||
|
||||
- platform: ANDROID
|
||||
os: ubuntu-latest
|
||||
|
||||
- platform: TERMUX
|
||||
os: ubuntu-latest
|
||||
|
||||
- platform: LARCH64
|
||||
os: ubuntu-latest
|
||||
|
||||
- platform: ANDROID_GLIBC
|
||||
os: ubuntu-22.04-arm
|
||||
|
||||
- platform: WOW64
|
||||
os: ubuntu-22.04-arm
|
||||
|
||||
- platform: ARM64-GCC-8
|
||||
os: ubuntu-22.04-arm
|
||||
image: arm64v8/ubuntu:18.04
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
container:
|
||||
image: ${{ matrix.image || '' }}
|
||||
steps:
|
||||
- name: "Checkout Box64 Repository"
|
||||
uses: actions/checkout@v2
|
||||
if: ${{ matrix.platform != 'ARM64-GCC-8' }}
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: "Checkout Box64 Repository (No NodeJS)"
|
||||
if: ${{ matrix.platform == 'ARM64-GCC-8' }}
|
||||
uses: taiki-e/checkout-action@v1
|
||||
|
||||
- name: Get all the unique changed directory names
|
||||
id: changed-files-dir-names
|
||||
if: ${{ matrix.platform != 'ARM64-GCC-8' }}
|
||||
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46
|
||||
with:
|
||||
dir_names: "true"
|
||||
|
||||
- name: Early exit other jobs if this is a ARM64-only change
|
||||
id: early-exit-arm64
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/arm64'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
if [[ ${{ matrix.platform }} != 'RISCV' && ${{ matrix.platform }} != 'LARCH64' && ${{ matrix.platform }} != 'X64' ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Early exit other jobs if this is a LA64-only change
|
||||
id: early-exit-la64
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/la64'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
if [[ ${{ matrix.platform }} == 'LARCH64' ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Early exit other jobs if this is a RV64-only change
|
||||
id: early-exit-rv64
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
if: steps.changed-files-dir-names.outputs.all_modified_files == 'src/dynarec/rv64'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
if [[ ${{ matrix.platform }} == 'RISCV' ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Do not early exit otherwise
|
||||
id: early-exit-never
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
DIRS: ${{ steps.changed-files-dir-names.outputs.all_modified_files }}
|
||||
if: env.DIRS != 'src/dynarec/arm64' && env.DIRS != 'src/dynarec/la64' && env.DIRS != 'src/dynarec/rv64'
|
||||
continue-on-error: true
|
||||
run: exit 1
|
||||
|
||||
- name: Merge early exit conditions
|
||||
id: early-exit
|
||||
if: steps.early-exit-arm64.outcome == 'failure' || steps.early-exit-la64.outcome == 'failure' || steps.early-exit-rv64.outcome == 'failure' || steps.early-exit-never.outcome == 'failure'
|
||||
continue-on-error: true
|
||||
run: exit 1
|
||||
|
||||
# Use `steps.early-exit.outcome == 'failure'` to check whether the current step should be processed.
|
||||
|
||||
- name: "Environment preparation"
|
||||
if: steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
if [[ ${{ matrix.platform }} != 'X64' && ${{ matrix.platform }} != 'OTHER_ARM' && ${{ matrix.platform }} != 'RISCV' ]]; then
|
||||
echo "BOX64_PLATFORM_MARCRO=-D${{ matrix.platform }}=1" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
|
||||
if [[ ${{ matrix.platform }} == 'ARM64-GCC-8' ]]; then
|
||||
apt-get update
|
||||
apt install -y sudo
|
||||
else
|
||||
sudo apt-get update
|
||||
zydis_package=libzydis-dev
|
||||
fi
|
||||
if [[ ${{ matrix.platform }} != 'X64' && ${{ matrix.platform }} != 'RISCV' && ${{ matrix.platform }} != 'LARCH64' ]]; then
|
||||
sudo apt-get -y install git cmake make python3 patchelf $zydis_package
|
||||
if [[ ${{ matrix.platform }} == 'ANDROID' || ${{ matrix.platform }} == 'TERMUX' ]]; then
|
||||
sudo apt-get -y install p7zip
|
||||
wget -q https://dl.google.com/android/repository/android-ndk-r26b-linux.zip
|
||||
unzip -qq android-ndk-r26b-linux.zip
|
||||
echo "BOX64_COMPILER=$PWD/android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android31-clang" >> $GITHUB_ENV
|
||||
echo "BOX64_PLATFORM_MARCRO=-DANDROID=1 -DARM_DYNAREC=1 -DBAD_SIGNAL=1" >> $GITHUB_ENV
|
||||
git clone https://github.com/termux/termux-docker.git
|
||||
sudo cp -rf termux-docker/system/arm /system
|
||||
sudo chown -R $(whoami):$(whoami) /system
|
||||
sudo chmod 755 -R /system
|
||||
elif [[ ${{ matrix.platform }} == 'ANDROID_GLIBC' ]]; then
|
||||
sudo apt-get -y install git gcc-aarch64-linux-gnu
|
||||
echo "BOX64_PLATFORM_MARCRO=-DARM64=1 -DWINLATOR_GLIBC=1 -DARM_DYNAREC=1 -DBAD_SIGNAL=1" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
elif [[ ${{ matrix.platform }} == 'WOW64' ]]; then
|
||||
sudo apt-get -y install git gcc-aarch64-linux-gnu
|
||||
echo "BOX64_PLATFORM_MARCRO=-DWOW64=1 -DARM_DYNAREC=1" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
export LLVM_MINGW_VERSION=20250430
|
||||
wget -q https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VERSION}/llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-aarch64.tar.xz
|
||||
tar -xf llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-aarch64.tar.xz
|
||||
echo "MINGW_COMPILER_PATH=$PWD/llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-aarch64/bin" >> $GITHUB_ENV
|
||||
elif [[ ${{ matrix.platform }} == 'ARM64-GCC-8' ]]; then
|
||||
# some of these dependencies may be unnecessary to explicitly install depending on the image
|
||||
sudo apt-get -y install git software-properties-common lsb-release \
|
||||
wget curl build-essential autoconf automake \
|
||||
pkg-config ca-certificates \
|
||||
python3 make gettext zstd \
|
||||
gcc-8 g++-8
|
||||
sudo add-apt-repository ppa:theofficialgman/cmake-bionic -y
|
||||
sudo apt update
|
||||
sudo apt install -y cmake
|
||||
echo "BOX64_PLATFORM_MARCRO=-DARM64=1" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc-8" >> $GITHUB_ENV
|
||||
else
|
||||
sudo apt-get -y install git gcc-aarch64-linux-gnu
|
||||
echo "BOX64_PLATFORM_MARCRO=-D${{ matrix.platform }}=1" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
fi
|
||||
if [[ ${{ matrix.platform }} == 'TERMUX' ]]; then
|
||||
wget https://packages.termux.dev/apt/termux-main/pool/main/liba/libandroid-sysv-semaphore/libandroid-sysv-semaphore_0.1-1_aarch64.deb
|
||||
7z x libandroid-sysv-semaphore_0.1-1_aarch64.deb
|
||||
tar -xf data.tar.xz
|
||||
sudo cp -rf data /
|
||||
sudo chmod 755 -R /data
|
||||
sudo chown -R $(whoami):$(whoami) /data
|
||||
echo "CFLAGS=-L/data/data/com.termux/files/usr/lib" >> $GITHUB_ENV
|
||||
echo "IS_TERMUX=1" >> $GITHUB_ENV
|
||||
echo "QEMU_SET_ENV=LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib" >> $GITHUB_ENV
|
||||
else
|
||||
echo "IS_TERMUX=0" >> $GITHUB_ENV
|
||||
fi
|
||||
else
|
||||
if [[ ${{ matrix.platform }} == 'X64' ]]; then
|
||||
echo "BOX64_PLATFORM_MARCRO=-DLD80BITS=1 -DNOALIGN=1" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=gcc" >> $GITHUB_ENV
|
||||
sudo apt-get -y install git cmake make python3
|
||||
sudo apt-get -y install git cmake make python3 libzydis-dev
|
||||
elif [[ ${{ matrix.platform }} == 'RISCV' ]]; then
|
||||
echo BOX64_PLATFORM_MARCRO="-DRV64=ON" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=riscv64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
sudo apt-get -y install git gcc-riscv64-linux-gnu cmake make python3
|
||||
echo "BOX64_COMPILER=riscv64-linux-gnu-gcc-14" >> $GITHUB_ENV
|
||||
sudo apt-get -y install git gcc-14-riscv64-linux-gnu cmake make python3 ninja-build libglib2.0-dev libzydis-dev
|
||||
elif [[ ${{ matrix.platform }} == 'LARCH64' ]]; then
|
||||
sudo mkdir /usr/local/larch
|
||||
wget -O- -q https://github.com/loongson/build-tools/releases/download/2025.02.21/x86_64-cross-tools-loongarch64-binutils_2.44-gcc_14.2.0-glibc_2.41.tar.xz | sudo tar -C /usr/local/larch --strip-components=1 --xz -xf -
|
||||
sudo ln -sf /usr/local/larch/target /usr/loongarch64-linux-gnu
|
||||
sudo cp -r /usr/local/larch/loongarch64-unknown-linux-gnu/lib/* /usr/loongarch64-linux-gnu/lib64/
|
||||
for i in objdump objcopy strip; do
|
||||
sudo ln -sf /usr/local/larch/bin/loongarch64-unknown-linux-gnu-$i /usr/bin/loongarch64-linux-gnu-$i
|
||||
done
|
||||
echo '/usr/local/larch/bin/loongarch64-unknown-linux-gnu-gcc -L/usr/local/larch/loongarch64-unknown-linux-gnu "$@"' | sudo tee /usr/bin/loongarch64-linux-gnu-gcc
|
||||
echo '/usr/local/larch/bin/loongarch64-unknown-linux-gnu-g++ -L/usr/local/larch/loongarch64-unknown-linux-gnu "$@"' | sudo tee /usr/bin/loongarch64-linux-gnu-g++
|
||||
sudo chmod 755 /usr/bin/loongarch64-linux-gnu-{gcc,g++}
|
||||
|
||||
echo BOX64_PLATFORM_MARCRO="-DLARCH64=ON" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=loongarch64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
sudo apt-get -y install git cmake make python3 libzydis-dev
|
||||
else
|
||||
echo BOX64_PLATFORM_MARCRO="-DARM_DYNAREC=ON" >> $GITHUB_ENV
|
||||
echo "BOX64_COMPILER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
|
||||
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3
|
||||
sudo apt-get -y install git gcc-aarch64-linux-gnu cmake make python3 libzydis-dev
|
||||
fi
|
||||
fi
|
||||
if [[ ${{ matrix.type }} == 'Release' ]]; then
|
||||
echo BOX64_BUILD_TYPE=Release >> $GITHUB_ENV
|
||||
echo BOX64_HAVE_TRACE=0 >> $GITHUB_ENV
|
||||
echo BOX64_STATICBUILD=0 >> $GITHUB_ENV
|
||||
echo BOX64_BOX32=0 >> $GITHUB_ENV
|
||||
elif [[ ${{ matrix.type }} == 'StaticBuild' ]]; then
|
||||
echo BOX64_BUILD_TYPE=Release >> $GITHUB_ENV
|
||||
echo BOX64_HAVE_TRACE=0 >> $GITHUB_ENV
|
||||
echo BOX64_STATICBUILD=1 >> $GITHUB_ENV
|
||||
echo BOX64_BOX32=0 >> $GITHUB_ENV
|
||||
elif [[ ${{ matrix.type }} == 'Box32' ]]; then
|
||||
echo BOX64_BUILD_TYPE=Release >> $GITHUB_ENV
|
||||
echo BOX64_HAVE_TRACE=0 >> $GITHUB_ENV
|
||||
echo BOX64_STATICBUILD=0 >> $GITHUB_ENV
|
||||
echo BOX64_BOX32=1 >> $GITHUB_ENV
|
||||
else
|
||||
echo BOX64_BUILD_TYPE=RelWithDebInfo >> $GITHUB_ENV
|
||||
echo BOX64_HAVE_TRACE=1 >> $GITHUB_ENV
|
||||
echo BOX64_STATICBUILD=0 >> $GITHUB_ENV
|
||||
echo BOX64_BOX32=0 >> $GITHUB_ENV
|
||||
fi
|
||||
if [[ ${{ matrix.os }} == 'ubuntu-22.04-arm' ]]; then
|
||||
echo "BOX64_ZYDIS3=1" >> $GITHUB_ENV
|
||||
else
|
||||
echo "BOX64_ZYDIS3=0" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: "Get XuanTie QEMU Cache Key"
|
||||
if: matrix.platform == 'RISCV' && steps.early-exit.outcome == 'failure'
|
||||
id: get-xuantie-qemu-cache-key
|
||||
run: |
|
||||
echo "key=f2dfdd13014d51f957c7172acc2e791cb42dc400" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: "Cache XuanTie QEMU"
|
||||
if: matrix.platform == 'RISCV' && steps.early-exit.outcome == 'failure'
|
||||
id: cache-xuantie-qemu
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ${{ github.workspace }}/xuantie_qemu_install
|
||||
key: ${{ runner.os }}-${{ steps.get-xuantie-qemu-cache-key.outputs.key }}-xuantie-qemu
|
||||
|
||||
- name: "Checkout XuanTie QEMU"
|
||||
if: matrix.platform == 'RISCV' && steps.cache-xuantie-qemu.outputs.cache-hit != 'true' && steps.early-exit.outcome == 'failure'
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: revyos/qemu
|
||||
path: xuantie_qemu
|
||||
ref: f2dfdd13014d51f957c7172acc2e791cb42dc400
|
||||
|
||||
- name: "Build XuanTie QEMU for XTheadVector"
|
||||
if: matrix.platform == 'RISCV' && steps.cache-xuantie-qemu.outputs.cache-hit != 'true' && steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
cd xuantie_qemu
|
||||
./configure --prefix=$GITHUB_WORKSPACE/xuantie_qemu_install --target-list=riscv64-linux-user --disable-system
|
||||
make -j$(nproc)
|
||||
make install
|
||||
|
||||
- name: "Display Build info"
|
||||
if: steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
echo "CMake Platform Macro: ${{ env.BOX64_PLATFORM_MARCRO }}"
|
||||
echo "CMake C Compiler: ${{ env.BOX64_COMPILER }}"
|
||||
echo "Build type: ${{ env.BOX64_BUILD_TYPE }}"
|
||||
echo "Trace Enabled: ${{ env.BOX64_HAVE_TRACE }}"
|
||||
echo "StaticBuild Enabled: ${{ env.BOX64_STATICBUILD }}"
|
||||
echo "Box32 Enabled: ${{ env.BOX64_BOX32 }}"
|
||||
|
||||
- name: "Build Box64"
|
||||
if: steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
export PATH=$PATH:${{ env.MINGW_COMPILER_PATH }}
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DCMAKE_C_COMPILER=${{ env.BOX64_COMPILER }}\
|
||||
-DTERMUX=${{ env.IS_TERMUX }}\
|
||||
${{ env.BOX64_PLATFORM_MARCRO }}\
|
||||
-DCMAKE_BUILD_TYPE=${{ env.BOX64_BUILD_TYPE }}\
|
||||
-DHAVE_TRACE=${{ env.BOX64_HAVE_TRACE }}\
|
||||
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON
|
||||
-DZYDIS3=${{ env.BOX64_ZYDIS3 }}\
|
||||
-DSTATICBUILD=${{ env.BOX64_STATICBUILD }}\
|
||||
-DBOX32=${{ env.BOX64_BOX32 }}\
|
||||
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON\
|
||||
-DCI=${{ matrix.platform != 'ANDROID' }}
|
||||
make -j$(nproc) VERBOSE=1
|
||||
|
||||
- name: "Test Box64"
|
||||
if: ${{ matrix.platform == 'X64' }}
|
||||
if: steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
if [[ ${{ matrix.platform }} != 'X64' ]]; then
|
||||
mkdir qemu10
|
||||
wget -O- -q https://archive.archlinux.org/packages/q/qemu-user-static/qemu-user-static-10.0.0-7-x86_64.pkg.tar.zst | tar -I zstd -C qemu10 -xf -
|
||||
sudo cp qemu10/usr/bin/* /usr/bin/
|
||||
fi
|
||||
|
||||
cd build
|
||||
export CTEST_OPTIONS="-j$(nproc) --timeout 300 --output-on-failure --repeat until-pass:20"
|
||||
if [[ ${{ matrix.platform }} == 'RISCV' ]]; then
|
||||
export INTERPRETER=qemu-riscv64-static
|
||||
export QEMU_LD_PREFIX=/usr/riscv64-linux-gnu/
|
||||
|
||||
if [[ ${{ env.BOX64_BOX32 }} == '1' ]]; then
|
||||
export BOX32_PERSONA32BITS=1 # hack to disable personality setting
|
||||
fi
|
||||
ctest $CTEST_OPTIONS
|
||||
QEMU_CPU=rv64,v=false BOX64_DYNAREC=0 ctest $CTEST_OPTIONS
|
||||
QEMU_CPU=rv64,v=false,zba=true,zbb=true,zbc=true,zbs=true ctest $CTEST_OPTIONS
|
||||
QEMU_CPU=rv64,v=true,vlen=128,vext_spec=v1.0 ctest $CTEST_OPTIONS
|
||||
QEMU_CPU=rv64,v=true,vlen=256,vext_spec=v1.0 ctest $CTEST_OPTIONS
|
||||
QEMU_CPU=thead-c906 ctest $CTEST_OPTIONS
|
||||
|
||||
BOX64_DYNAREC_TEST=1 ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC_TEST=1 QEMU_CPU=rv64,v=false,zba=true,zbb=true,zbc=true,zbs=true ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC_TEST=1 QEMU_CPU=rv64,v=true,vlen=128,vext_spec=v1.0 ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC_TEST=1 QEMU_CPU=rv64,v=true,vlen=256,vext_spec=v1.0 ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC_TEST=1 QEMU_CPU=thead-c906 ctest $CTEST_OPTIONS -E nocosim
|
||||
|
||||
export INTERPRETER=$GITHUB_WORKSPACE/xuantie_qemu_install/bin/qemu-riscv64
|
||||
QEMU_CPU=c910v ctest $CTEST_OPTIONS
|
||||
BOX64_DYNAREC_TEST=1 QEMU_CPU=c910v ctest $CTEST_OPTIONS -E nocosim
|
||||
elif [[ ${{ matrix.platform }} == 'LARCH64' ]]; then
|
||||
export INTERPRETER=qemu-loongarch64-static
|
||||
export QEMU_LD_PREFIX=/usr/loongarch64-linux-gnu/
|
||||
|
||||
if [[ ${{ env.BOX64_BOX32 }} == '1' ]]; then
|
||||
export BOX32_PERSONA32BITS=1 # hack to disable personality setting
|
||||
fi
|
||||
ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC_LA64NOEXT=1 ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS -E nocosim
|
||||
|
||||
BOX64_DYNAREC_TEST=1 ctest $CTEST_OPTIONS -E nocosim
|
||||
BOX64_DYNAREC_TEST=1 BOX64_DYNAREC_LA64NOEXT=1 ctest $CTEST_OPTIONS -E nocosim
|
||||
elif [[ ${{ matrix.platform }} == 'ANDROID' ]]; then
|
||||
export INTERPRETER=qemu-aarch64-static
|
||||
export QEMU_LD_PREFIX=/system/lib64
|
||||
|
||||
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS
|
||||
ctest $CTEST_OPTIONS
|
||||
elif [[ ${{ matrix.platform }} == 'TERMUX' ]]; then
|
||||
export INTERPRETER=qemu-aarch64-static
|
||||
export QEMU_SET_ENV=LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib
|
||||
export QEMU_LD_PREFIX=/system/lib64:/data/data/com.termux/files/usr/lib
|
||||
|
||||
BOX64_DYNAREC=0 ctest $CTEST_OPTIONS
|
||||
ctest $CTEST_OPTIONS
|
||||
elif [[ ${{matrix.type}} == 'Box32' ]]; then
|
||||
ctest $CTEST_OPTIONS
|
||||
else
|
||||
ctest -j$(nproc)
|
||||
fi
|
||||
|
||||
- name: "Get short Git commit"
|
||||
id: git-info
|
||||
if: steps.early-exit.outcome == 'failure'
|
||||
run: echo "SHORT_COMMIT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
||||
|
||||
- name: "Get Box64 Version"
|
||||
if: steps.early-exit.outcome == 'failure'
|
||||
run: echo "BOX64_VERSION=$(cat src/box64version.h | grep BOX64_MAJOR | cut -d " " -f 3).$(cat src/box64version.h | grep BOX64_MINOR | cut -d " " -f 3).$(cat src/box64version.h | grep BOX64_REVISION | cut -d " " -f 3)" >> $GITHUB_ENV
|
||||
|
||||
- name: "Packaging WCP file for Winlator"
|
||||
if: matrix.platform == 'ANDROID_GLIBC' && matrix.type != 'StaticBuild' && steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
cd build
|
||||
ctest -j$(nproc)
|
||||
cat <<EOF > profile.json
|
||||
{
|
||||
"type": "Box64",
|
||||
"versionName": "latest-${SHORT_COMMIT}",
|
||||
"versionCode": 1,
|
||||
"description": "Box64-latest-${SHORT_COMMIT}. Built from [https://github.com/ptitSeb/box64].",
|
||||
"files": [
|
||||
{
|
||||
"source": "box64",
|
||||
"target": "\${localbin}/box64"
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
patchelf --set-interpreter /data/data/com.winlator/files/imagefs/usr/lib/ld-linux-aarch64.so.1 ./box64
|
||||
tar --zstd -cf box64-latest.wcp box64 profile.json
|
||||
|
||||
- name: "Upload Artifact"
|
||||
uses: actions/upload-artifact@v2
|
||||
- name: "Package Rat File for MiceWine"
|
||||
if: matrix.platform == 'ANDROID' && matrix.type != 'StaticBuild' && steps.early-exit.outcome == 'failure'
|
||||
run: |
|
||||
cd build
|
||||
|
||||
mkdir -p files/usr/bin
|
||||
|
||||
cp box64 files/usr/bin
|
||||
|
||||
echo "name=Box64 (CI Build)" > pkg-header
|
||||
echo "category=Box64" >> pkg-header
|
||||
echo "version=${BOX64_VERSION}-${SHORT_COMMIT}" >> pkg-header
|
||||
echo "architecture=aarch64" >> pkg-header
|
||||
echo "vkDriverLib=" >> pkg-header
|
||||
|
||||
7z -tzip -mx=5 a box64-latest.rat files pkg-header
|
||||
|
||||
- name: "Upload WCP file"
|
||||
if: matrix.platform == 'ANDROID_GLIBC' && matrix.type == 'Release' && steps.early-exit.outcome == 'failure'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: box64-${{ matrix.platform }}-${{ matrix.type }}
|
||||
path: build/box64
|
||||
name: box64-latest-${{ matrix.type }}-wcp
|
||||
path: build/box64-latest.wcp
|
||||
|
||||
- name: "Upload Rat File"
|
||||
if: matrix.platform == 'ANDROID' && matrix.type == 'Release' && steps.early-exit.outcome == 'failure'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: box64-MiceWine-${{ matrix.type }}
|
||||
path: build/box64-latest.rat
|
||||
|
||||
- name: "Upload WowBox64 file"
|
||||
if: matrix.platform == 'WOW64' && matrix.type == 'Release' && steps.early-exit.outcome == 'failure'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: wowbox64-${{ matrix.type }}
|
||||
path: build/wowbox64-prefix/src/wowbox64-build/wowbox64.dll
|
||||
+28
-5
@@ -55,12 +55,35 @@ dkms.conf
|
||||
build/
|
||||
build*/
|
||||
.vscode
|
||||
.cache
|
||||
.gdb_history
|
||||
src/git_head.h
|
||||
backup/
|
||||
|
||||
# LLVMprivateGenerator
|
||||
/LLVMprivateGenerator/*
|
||||
!/LLVMprivateGenerator/Makefile
|
||||
!/LLVMprivateGenerator/main.cpp
|
||||
!/LLVMprivateGenerator/registered_structs.cpp
|
||||
# Wrapper helper
|
||||
/wrapperhelper/bin
|
||||
/wrapperhelper/makedir
|
||||
/wrapperhelper/obj
|
||||
/wrapperhelper/sanaddress
|
||||
/wrapperhelper/sanleak
|
||||
/wrapperhelper/sanundefined
|
||||
/wrapperhelper/src/machine.gen
|
||||
/wrapperhelper/*.h
|
||||
!/wrapperhelper/example-libc.h
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
|
||||
# Archives
|
||||
*.7z
|
||||
*.deb
|
||||
*.eopkg
|
||||
*.gz
|
||||
*.rar
|
||||
*.rpm
|
||||
*.tar*
|
||||
*.xbps
|
||||
*.xz
|
||||
*.zip
|
||||
*.zst
|
||||
*.zstd
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
language: c
|
||||
arch:
|
||||
- amd64
|
||||
- arm64-graviton2
|
||||
os: linux
|
||||
dist: focal
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- python3
|
||||
|
||||
#Build steps
|
||||
before_script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- if [ "$TRAVIS_CPU_ARCH" = "arm64" ]; then cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ; else cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo ; fi
|
||||
|
||||
script:
|
||||
- make
|
||||
- ctest --output-on-failure
|
||||
Executable → Regular
+1346
-148
File diff suppressed because it is too large.
Load diff
@@ -1,12 +0,0 @@
|
||||
all: dumpSigs
|
||||
|
||||
dumpSigs: main.o registered_structs.o
|
||||
g++ -g3 -std=gnu++17 -fno-rtti main.o registered_structs.o -o dumpSigs "-L$(LLVM_install_dir)/lib" -lclang-cpp -lclangTooling -Wl,-rpath "-Wl,$(LLVM_install_dir)/lib"
|
||||
|
||||
main.o: main.cpp
|
||||
g++ -g3 -std=gnu++17 -fno-rtti -c main.cpp -Wfatal-errors "-I$(LLVM_install_dir)/include" -o main.o
|
||||
registered_structs.o: registered_structs.cpp
|
||||
g++ -g3 -std=gnu++17 -fno-rtti -c registered_structs.cpp -Wfatal-errors -o registered_structs.o
|
||||
|
||||
clean:
|
||||
$(RM) dumpSigs main.o registered_structs.o
|
||||
@@ -1,458 +0,0 @@
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <numeric>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include <llvm/Support/raw_ostream.h>
|
||||
#include <clang/AST/ASTConsumer.h>
|
||||
#include <clang/AST/Decl.h>
|
||||
#include <clang/AST/Mangle.h>
|
||||
#include <clang/AST/PrettyPrinter.h>
|
||||
#include <clang/AST/RecursiveASTVisitor.h>
|
||||
#include <clang/Frontend/CompilerInstance.h>
|
||||
#include <clang/Frontend/FrontendActions.h>
|
||||
#include <clang/Tooling/CommonOptionsParser.h>
|
||||
#include <clang/Tooling/Tooling.h>
|
||||
|
||||
clang::MangleContext *mangler = nullptr;
|
||||
|
||||
std::unordered_map<std::string, std::pair<std::string, bool>> funMap;
|
||||
std::vector<std::string> funList;
|
||||
|
||||
bool isTypeTrivial(const clang::QualType &q, const clang::QualType *qorig);
|
||||
clang::QualType getPointedType(const clang::QualType q) {
|
||||
if (const clang::PointerType *p = q->getAs<clang::PointerType>())
|
||||
return getPointedType(p->getPointeeType());
|
||||
else if (const clang::ReferenceType *r = q->getAs<clang::ReferenceType>())
|
||||
return getPointedType(r->getPointeeType());
|
||||
else
|
||||
return q;
|
||||
}
|
||||
|
||||
std::string record2name(const clang::RecordDecl &q, const clang::QualType *qorig) {
|
||||
std::string s = q.getNameAsString();
|
||||
if (s == "") {
|
||||
if (!qorig) return "????.!";
|
||||
if (const clang::TypedefType *tt = (*qorig)->getAs<clang::TypedefType>()) {
|
||||
// Typedef
|
||||
if (clang::TypedefNameDecl *td = tt->getDecl()) {
|
||||
return td->getNameAsString();
|
||||
} else {
|
||||
return "<typedef with no declaration>";
|
||||
}
|
||||
} else {
|
||||
return std::string("<unknown type ") + (*qorig)->getTypeClassName() + ">";
|
||||
}
|
||||
} else {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
char ptr2char(const std::string &str) __attribute__((const));
|
||||
const char *ptr2str(const std::string &str) __attribute__((const));
|
||||
char type2char(const clang::QualType &qual /* Canonical */, const clang::QualType *qorig) {
|
||||
if (qual->isBuiltinType()) {
|
||||
switch (static_cast<const clang::BuiltinType&>(*qual).getKind()) {
|
||||
case clang::BuiltinType::Kind::Void:
|
||||
return 'v';
|
||||
case clang::BuiltinType::Kind::Bool:
|
||||
return 'i';
|
||||
case clang::BuiltinType::Kind::Char_U:
|
||||
return 'C';
|
||||
case clang::BuiltinType::Kind::Char_S:
|
||||
return 'c';
|
||||
case clang::BuiltinType::Kind::Char8:
|
||||
return 'c';
|
||||
case clang::BuiltinType::Kind::UChar:
|
||||
return 'C';
|
||||
case clang::BuiltinType::Kind::SChar:
|
||||
return 'c';
|
||||
case clang::BuiltinType::Kind::WChar_U:
|
||||
return 'W';
|
||||
case clang::BuiltinType::Kind::UShort:
|
||||
return 'W';
|
||||
case clang::BuiltinType::Kind::WChar_S:
|
||||
return 'w';
|
||||
case clang::BuiltinType::Kind::Char16:
|
||||
return 'w';
|
||||
case clang::BuiltinType::Kind::Short:
|
||||
return 'w';
|
||||
case clang::BuiltinType::Kind::UInt:
|
||||
return 'u';
|
||||
case clang::BuiltinType::Kind::Char32:
|
||||
return 'i';
|
||||
case clang::BuiltinType::Kind::Int:
|
||||
return 'i';
|
||||
case clang::BuiltinType::Kind::ULong:
|
||||
return 'L';
|
||||
case clang::BuiltinType::Kind::Long:
|
||||
return 'l';
|
||||
case clang::BuiltinType::Kind::ULongLong:
|
||||
return 'U';
|
||||
case clang::BuiltinType::Kind::LongLong:
|
||||
return 'I';
|
||||
case clang::BuiltinType::Kind::UInt128:
|
||||
return 'H';
|
||||
case clang::BuiltinType::Kind::Int128:
|
||||
return 'H';
|
||||
case clang::BuiltinType::Kind::Float:
|
||||
return 'f';
|
||||
case clang::BuiltinType::Kind::Double:
|
||||
return 'd';
|
||||
case clang::BuiltinType::Kind::LongDouble:
|
||||
return 'D';
|
||||
case clang::BuiltinType::Kind::NullPtr:
|
||||
return 'p'; // nullptr_t
|
||||
|
||||
case clang::BuiltinType::Kind::Half:
|
||||
case clang::BuiltinType::Kind::BFloat16:
|
||||
case clang::BuiltinType::Kind::ShortAccum:
|
||||
case clang::BuiltinType::Kind::Accum:
|
||||
case clang::BuiltinType::Kind::LongAccum:
|
||||
case clang::BuiltinType::Kind::UShortAccum:
|
||||
case clang::BuiltinType::Kind::UAccum:
|
||||
case clang::BuiltinType::Kind::ULongAccum:
|
||||
case clang::BuiltinType::Kind::ShortFract:
|
||||
case clang::BuiltinType::Kind::Fract:
|
||||
case clang::BuiltinType::Kind::LongFract:
|
||||
case clang::BuiltinType::Kind::UShortFract:
|
||||
case clang::BuiltinType::Kind::UFract:
|
||||
case clang::BuiltinType::Kind::ULongFract:
|
||||
case clang::BuiltinType::Kind::SatShortAccum:
|
||||
case clang::BuiltinType::Kind::SatAccum:
|
||||
case clang::BuiltinType::Kind::SatLongAccum:
|
||||
case clang::BuiltinType::Kind::SatUShortAccum:
|
||||
case clang::BuiltinType::Kind::SatUAccum:
|
||||
case clang::BuiltinType::Kind::SatULongAccum:
|
||||
case clang::BuiltinType::Kind::SatShortFract:
|
||||
case clang::BuiltinType::Kind::SatFract:
|
||||
case clang::BuiltinType::Kind::SatLongFract:
|
||||
case clang::BuiltinType::Kind::SatUShortFract:
|
||||
case clang::BuiltinType::Kind::SatUFract:
|
||||
case clang::BuiltinType::Kind::SatULongFract:
|
||||
case clang::BuiltinType::Kind::Float16:
|
||||
case clang::BuiltinType::Kind::Float128:
|
||||
case clang::BuiltinType::Kind::Overload:
|
||||
case clang::BuiltinType::Kind::BoundMember:
|
||||
case clang::BuiltinType::Kind::PseudoObject:
|
||||
case clang::BuiltinType::Kind::Dependent:
|
||||
case clang::BuiltinType::Kind::UnknownAny:
|
||||
case clang::BuiltinType::Kind::ARCUnbridgedCast:
|
||||
case clang::BuiltinType::Kind::BuiltinFn:
|
||||
case clang::BuiltinType::Kind::ObjCId:
|
||||
case clang::BuiltinType::Kind::ObjCClass:
|
||||
case clang::BuiltinType::Kind::ObjCSel:
|
||||
#define IMAGE_TYPE(it, id, si, a, s) case clang::BuiltinType::Kind::id:
|
||||
#include <clang/Basic/OpenCLImageTypes.def>
|
||||
#undef IMAGE_TYPE
|
||||
case clang::BuiltinType::Kind::OCLSampler:
|
||||
case clang::BuiltinType::Kind::OCLEvent:
|
||||
case clang::BuiltinType::Kind::OCLClkEvent:
|
||||
case clang::BuiltinType::Kind::OCLQueue:
|
||||
case clang::BuiltinType::Kind::OCLReserveID:
|
||||
case clang::BuiltinType::Kind::IncompleteMatrixIdx:
|
||||
case clang::BuiltinType::Kind::OMPArraySection:
|
||||
case clang::BuiltinType::Kind::OMPArrayShaping:
|
||||
case clang::BuiltinType::Kind::OMPIterator:
|
||||
#define EXT_OPAQUE_TYPE(et, id, e) case clang::BuiltinType::Kind::id:
|
||||
#include <clang/Basic/OpenCLExtensionTypes.def>
|
||||
#define SVE_TYPE(n, id, si) case clang::BuiltinType::Kind::id:
|
||||
#include <clang/Basic/AArch64SVEACLETypes.def>
|
||||
#define PPC_VECTOR_TYPE(n, id, s) case clang::BuiltinType::Kind::id:
|
||||
#include <clang/Basic/PPCTypes.def>
|
||||
#undef EXT_OPAQUE_TYPE
|
||||
#undef SVE_TYPE
|
||||
#undef PPC_VECTOR_TYPE
|
||||
return '!';
|
||||
default:
|
||||
return ':';
|
||||
}
|
||||
} else if (qual->isEnumeralType()) {
|
||||
const clang::EnumDecl *ed = qual->getAs<clang::EnumType>()->getDecl();
|
||||
if (!ed) {
|
||||
return 'i';
|
||||
} else {
|
||||
return type2char(ed->getIntegerType().getCanonicalType(), qorig);
|
||||
}
|
||||
} else if (qual->isFunctionPointerType()) {
|
||||
return '@';
|
||||
} else if (qual->isAnyPointerType() || qual->isReferenceType()) {
|
||||
const clang::QualType &pointed = getPointedType(qual);
|
||||
if (isTypeTrivial(pointed, qorig)) {
|
||||
return 'p';
|
||||
} else if (const clang::RecordType *rct = pointed->getAs<clang::RecordType>()) {
|
||||
clang::RecordDecl *rc = rct->getDecl();
|
||||
if (!rc) {
|
||||
return '!';
|
||||
} else if (!rc->isCompleteDefinition()) {
|
||||
return 'p';
|
||||
} else {
|
||||
std::string str;
|
||||
if (qorig) {
|
||||
const clang::QualType qpted = getPointedType(*qorig);
|
||||
str = record2name(*rc, &qpted);
|
||||
} else {
|
||||
str = record2name(*rc, nullptr);
|
||||
}
|
||||
char ret = ptr2char(str);
|
||||
if (ret) return ret;
|
||||
else {
|
||||
return '!';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return '!';
|
||||
}
|
||||
} else if (const clang::RecordType *rct = qual->getAs<clang::RecordType>()) {
|
||||
clang::RecordDecl *rc = rct->getDecl();
|
||||
if (!rc) {
|
||||
return '?';
|
||||
} else if (rc->getNameAsString() == "__builtin_va_list") {
|
||||
// va_list
|
||||
return 'A';
|
||||
} else {
|
||||
return '?';
|
||||
}
|
||||
} else {
|
||||
return '?';
|
||||
}
|
||||
}
|
||||
bool isTypeTrivial(const clang::QualType &q, const clang::QualType *qorig) {
|
||||
const char c = type2char(q, qorig);
|
||||
#define GO(chr) || (c == chr)
|
||||
return (c == 'v')
|
||||
GO('i') GO('u')
|
||||
GO('I') GO('U')
|
||||
GO('l') GO('L')
|
||||
GO('f') GO('d')
|
||||
GO('D') GO('K')
|
||||
GO('0') GO('1')
|
||||
GO('C') GO('c')
|
||||
GO('W') GO('w')
|
||||
GO('H')
|
||||
GO('p');
|
||||
#undef GO
|
||||
}
|
||||
bool isTypeValid(const clang::QualType &q, const clang::QualType *qorig) {
|
||||
const char c = type2char(q, qorig);
|
||||
if (c == 'A') return false;
|
||||
if (c == 'V') return false;
|
||||
return ((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'));
|
||||
}
|
||||
|
||||
const std::string type2string(const clang::QualType &qual, const clang::QualType *qorig) {
|
||||
if (qual->isBuiltinType()) {
|
||||
return std::string("(builtin) ") + static_cast<const clang::BuiltinType&>(*qual).getName(clang::PrintingPolicy{{}}).data();
|
||||
} else if (qual->isFunctionPointerType()) {
|
||||
return "Callback (function pointer)";
|
||||
} else if (qual->isAnyPointerType() || qual->isReferenceType()) {
|
||||
std::string prefix = qual->isAnyPointerType() ? "Pointer to " : "Reference to ";
|
||||
const clang::QualType &pointed = getPointedType(qual);
|
||||
if (isTypeTrivial(pointed, qorig)) {
|
||||
return prefix + "trivial object " + type2string(pointed, qorig) + " (" + type2char(pointed, qorig) + ")";
|
||||
} else if (const clang::RecordType *rct = pointed->getAs<clang::RecordType>()) {
|
||||
clang::RecordDecl *rc = rct->getDecl();
|
||||
if (!rc) {
|
||||
return prefix + "unknown record";
|
||||
} else if (!rc->isCompleteDefinition()) {
|
||||
return prefix + "incomplete record " + rc->getNameAsString();
|
||||
} else {
|
||||
std::string str;
|
||||
if (qorig) {
|
||||
const clang::QualType qpted = getPointedType(*qorig);
|
||||
str = record2name(*rc, &qpted);
|
||||
} else {
|
||||
str = record2name(*rc, nullptr);
|
||||
}
|
||||
const char *ret = ptr2str(str);
|
||||
if (ret[0] != '\0') {
|
||||
return prefix + ret;
|
||||
} else {
|
||||
if (mangler && mangler->shouldMangleDeclName(rc)) {
|
||||
std::string mangled;
|
||||
{
|
||||
llvm::raw_string_ostream strstr{mangled};
|
||||
mangler->mangleName(rc, strstr);
|
||||
}
|
||||
return prefix + "unknown record " + str + " (=== " + mangled + ")";
|
||||
} else {
|
||||
return prefix + "unknown record " + str;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return prefix + "non-trivial or typedef'ed object " + type2string(pointed, qorig) + " (" + type2char(pointed, qorig) + ")";
|
||||
//return "Pointer (maybe to callback)";
|
||||
}
|
||||
} else if (qual->isEnumeralType()) {
|
||||
const clang::EnumDecl *ed = qual->getAs<clang::EnumType>()->getDecl();
|
||||
if (!ed) {
|
||||
return "Enumeration with unknown underlying integer type (assuming int)";
|
||||
} else {
|
||||
return "Enumeration with underlying type " + type2string(ed->getIntegerType().getCanonicalType(), nullptr);
|
||||
}
|
||||
} else if (const clang::RecordType *rct = qual->getAs<clang::RecordType>()) {
|
||||
clang::RecordDecl *rc = rct->getDecl();
|
||||
if (!rc) {
|
||||
return "Unknown record";
|
||||
} else if (rc->getNameAsString() == "__builtin_va_list") {
|
||||
return "va_list";
|
||||
} else {
|
||||
return "Unknown record " + std::string(rc->getName().data());
|
||||
}
|
||||
} else {
|
||||
return std::string("??? ") + qual->getTypeClassName();
|
||||
}
|
||||
}
|
||||
|
||||
class Visitor : public clang::RecursiveASTVisitor<Visitor> {
|
||||
public:
|
||||
clang::ASTContext &context;
|
||||
|
||||
bool shouldVisitTemplateInstantiations() const /* override */ { return true; }
|
||||
|
||||
Visitor(clang::CompilerInstance &ci) : context(ci.getASTContext()) {
|
||||
if (!mangler) {
|
||||
mangler = clang::ItaniumMangleContext::create(context, ci.getDiagnostics());
|
||||
}
|
||||
}
|
||||
|
||||
~Visitor() {
|
||||
if (mangler) {
|
||||
delete mangler;
|
||||
mangler = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
bool VisitDecl(clang::Decl *decl) /* override */ {
|
||||
std::cerr << std::flush;
|
||||
if (!decl) return true;
|
||||
|
||||
if ((decl->getKind() >= clang::Decl::Kind::firstFunction) && (decl->getKind() <= clang::Decl::Kind::lastFunction)) {
|
||||
clang::DeclaratorDecl *ddecl = static_cast<clang::DeclaratorDecl*>(decl);
|
||||
std::cout << "Function detected!\n";
|
||||
|
||||
std::string funName{ddecl->getName()};
|
||||
|
||||
auto niceprint = [](const std::string &infotype, const auto &dat){ std::cout << " " << infotype << ": " << dat << "\n"; };
|
||||
niceprint("Function name", funName);
|
||||
if (mangler && mangler->shouldMangleDeclName(ddecl)) {
|
||||
std::string mangled;
|
||||
{
|
||||
llvm::raw_string_ostream strstr{mangled};
|
||||
mangler->mangleName(ddecl, strstr);
|
||||
}
|
||||
niceprint("Function mangled name", mangled);
|
||||
funName = std::move(mangled);
|
||||
}
|
||||
|
||||
bool valid;
|
||||
std::string funTypeStr{""};
|
||||
if (ddecl->getFunctionType()->isFunctionNoProtoType()) {
|
||||
const clang::FunctionNoProtoType *funType = static_cast<const clang::FunctionNoProtoType*>(ddecl->getFunctionType());
|
||||
const auto &retType = funType->getReturnType();
|
||||
|
||||
niceprint("Function return type", type2string(retType, &retType));
|
||||
niceprint("Canonical function return type",
|
||||
type2string(retType.getCanonicalType(), &retType) +
|
||||
" (" + type2char(retType.getCanonicalType(), &retType) + ")");
|
||||
niceprint("Is sugared", funType->isSugared());
|
||||
if (funType->isSugared()) {
|
||||
clang::QualType qft{funType, 0};
|
||||
niceprint("Desugared", type2string(funType->desugar(), &qft));
|
||||
}
|
||||
|
||||
funTypeStr = type2char(retType.getCanonicalType(), &retType) + std::string("Fv");
|
||||
valid = isTypeValid(retType.getCanonicalType(), &retType);
|
||||
} else {
|
||||
const clang::FunctionProtoType *funType = static_cast<const clang::FunctionProtoType*>(ddecl->getFunctionType());
|
||||
const auto &retType = funType->getReturnType();
|
||||
|
||||
niceprint("Function return type", type2string(retType, &retType));
|
||||
niceprint("Canonical function return type",
|
||||
type2string(retType.getCanonicalType(), &retType)
|
||||
+ " (" + type2char(retType.getCanonicalType(), &retType) + ")");
|
||||
niceprint("Parameter count", funType->getNumParams());
|
||||
for (const clang::QualType &type : funType->getParamTypes()) {
|
||||
niceprint(" " + type2string(type, &type),
|
||||
type2string(type.getCanonicalType(), &type) + " (" + type2char(type.getCanonicalType(), &type) + ")");
|
||||
}
|
||||
niceprint("Variadic function", funType->isVariadic() ? "yes" : "no");
|
||||
|
||||
funTypeStr =
|
||||
type2char(retType.getCanonicalType(), &retType) +
|
||||
((funType->getNumParams() == 0)
|
||||
? std::string("Fv") : std::accumulate(funType->getParamTypes().begin(), funType->getParamTypes().end(), std::string("F"),
|
||||
[](const std::string &acc, const clang::QualType &qual){ return acc + type2char(qual.getCanonicalType(), &qual); }));
|
||||
if (funType->isVariadic()) funTypeStr += "V";
|
||||
valid = !funType->isVariadic() &&
|
||||
std::accumulate(funType->getParamTypes().begin(), funType->getParamTypes().end(), isTypeValid(retType.getCanonicalType(), &retType),
|
||||
[](bool acc, const clang::QualType &qual){ return acc && isTypeValid(qual.getCanonicalType(), &qual); });
|
||||
}
|
||||
|
||||
niceprint("Conclusion", "");
|
||||
niceprint("Function final name", funName);
|
||||
niceprint("Function type", funTypeStr);
|
||||
niceprint("Valid function type", valid ? "yes" : "no");
|
||||
std::cout << "\n";
|
||||
|
||||
funMap[funName] = std::make_pair(funTypeStr, valid);
|
||||
funList.push_back(funName);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class Consumer : public clang::ASTConsumer {
|
||||
public:
|
||||
Visitor visitor;
|
||||
|
||||
Consumer(clang::CompilerInstance &ci) : visitor(ci) {
|
||||
}
|
||||
|
||||
void HandleTranslationUnit(clang::ASTContext &context) override {
|
||||
visitor.TraverseDecl(context.getTranslationUnitDecl());
|
||||
}
|
||||
};
|
||||
|
||||
class Action : public clang::ASTFrontendAction {
|
||||
public:
|
||||
virtual std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(clang::CompilerInstance &ci, llvm::StringRef inFile) override {
|
||||
return std::make_unique<Consumer>(ci);
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, const char **argv) {
|
||||
if (argc < 2) {
|
||||
std::cerr << "Usage: " << argv[0] << " (filenames) -- [-I...]" << std::endl;
|
||||
return 2;
|
||||
}
|
||||
|
||||
/*int fakeargc = argc + 1;
|
||||
const char **fakeargv = new const char*[fakeargc];
|
||||
memcpy(fakeargv, argv, argc * sizeof(char*));
|
||||
fakeargv[fakeargc - 1] = "--";*/
|
||||
llvm::cl::OptionCategory opcat{""};
|
||||
clang::tooling::CommonOptionsParser op{argc, argv, opcat};
|
||||
std::vector<std::string> paths; for (int i = 1; i < argc; ++i) paths.push_back(argv[i]);
|
||||
|
||||
clang::tooling::ClangTool tool{op.getCompilations(), paths};
|
||||
|
||||
tool.run(clang::tooling::newFrontendActionFactory<Action>().get());
|
||||
|
||||
std::cout << "Done, outputing output.h" << std::endl;
|
||||
std::sort(funList.begin(), funList.end());
|
||||
std::fstream file{"output.h", std::ios_base::out};
|
||||
for (const std::string &funName : funList) {
|
||||
if (!funMap[funName].second) {
|
||||
file << "//";
|
||||
}
|
||||
file << "GO(" << funName << ", " << funMap[funName].first << ")\n";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,267 +0,0 @@
|
||||
#include <string>
|
||||
|
||||
#define ALL START() \
|
||||
/* libc */ \
|
||||
STRUCT("_IO_FILE", "a FILE") \
|
||||
STRUCT("_G_fpos_t", "a file position") \
|
||||
STRUCT("sockaddr", "a socket address") \
|
||||
STRUCT("itimerspec", "an itimerspec") \
|
||||
STRUCT("timespec", "a timespec") \
|
||||
STRUCT("itimerval", "an itimerval") \
|
||||
STRUCT("timeval", "a timeval") \
|
||||
STRUCT("timex", "a timex") \
|
||||
STRUCT("timezone", "a timezone") \
|
||||
STRUCT("dirent", "a dirent") \
|
||||
STRUCT("dirent64", "a dirent64") \
|
||||
STRUCT("__dirstream", "a dir stream") \
|
||||
STRUCT("tm", "a time structure (tm)") \
|
||||
STRUCT("cmsghdr", "a cmsghdr") \
|
||||
STRUCT("msghdr", "a msghdr") \
|
||||
STRUCT("rpcent", "an rpcent") \
|
||||
STRUCT("random_data", "a random_data structure") \
|
||||
STRUCT("drand48_data", "a drand48_data structure") \
|
||||
STRUCT("termios", "a termios") \
|
||||
STRUCT("iovec", "an iovec") \
|
||||
STRUCT("file_handle", "a file handle") \
|
||||
STRUCT("lconv", "an lconv") \
|
||||
STRUCT("__locale_struct", "a locale structure") \
|
||||
STRUCT("aliasent", "an alias") \
|
||||
STRUCT("fstab", "an fstab") \
|
||||
STRUCT("group", "a group") \
|
||||
STRUCT("hostent", "a hostent") \
|
||||
STRUCT("protoent", "a protoent") \
|
||||
STRUCT("passwd", "a password") \
|
||||
STRUCT("spwd", "an spwd") \
|
||||
STRUCT("ttyent", "a ttyent") \
|
||||
STRUCT("utmp", "an utmp structure") \
|
||||
STRUCT("utmpx", "an utmpx structure") \
|
||||
STRUCT("ifaddrs", "an ifaddrs structure") \
|
||||
STRUCT("statfs", "a statfs structure") \
|
||||
STRUCT("statfs64", "a statfs64 structure") \
|
||||
STRUCT("statvfs", "a statvfs structure") \
|
||||
STRUCT("statvfs64", "a statvfs64 structure") \
|
||||
STRUCT("timeb", "a timeb structure") \
|
||||
STRUCT("_ftsent", "an _ftsent structure") \
|
||||
STRUCT("sysinfo", "a sysinfo structure") \
|
||||
STRUCT("rlimit", "an rlimit structure") \
|
||||
STRUCT("rlimit64", "an rlimit64 structure") \
|
||||
STRUCT("rusage", "an rusage structure") \
|
||||
STRUCT("entry", "an entry structure") \
|
||||
STRUCT("pollfd", "a pollfd structure") \
|
||||
STRUCT("re_pattern_buffer", "a re_pattern_buffer structure") \
|
||||
STRUCT("sembuf", "a sembuf structure") \
|
||||
STRUCT("tms", "a tms structure") \
|
||||
STRUCT("utsname", "an utsname structure") \
|
||||
STRUCT("utimbuf", "an utimbuf structure") \
|
||||
STRUCT2("__va_list_tag", "__va_list_tag (aka, a va_list)", 'A') \
|
||||
/* ncurses */ \
|
||||
STRUCT("_win_st", "a _win_st structure") \
|
||||
STRUCT("MEVENT", "an MEVENT structure") \
|
||||
TYPEDEF("cchar_t", "a cchar_t") \
|
||||
/* zlib */ \
|
||||
STRUCT("gz_header_s", "a gz_header_s structure") \
|
||||
STRUCT("gzFile_s", "a gzFile_s structure") \
|
||||
STRUCT("z_stream_s", "a z_stream_s structure") \
|
||||
\
|
||||
END()
|
||||
|
||||
#define START()
|
||||
#define STRUCT(s, ret) if (str == s) { return 'p'; } else
|
||||
#define STRUCT2(s, ret, c) if (str == s) { return c; } else
|
||||
#define TYPEDEF(s, ret) if (str == s) { return 'p'; } else
|
||||
#define END() { return 0; }
|
||||
char ptr2char(const std::string &str) {
|
||||
/*if ((str == "_IO_FILE")
|
||||
|| (str == "_G_fpos_t")
|
||||
|| (str == "sockaddr")
|
||||
|| (str == "itimerspec")
|
||||
|| (str == "timespec")
|
||||
|| (str == "itimerval")
|
||||
|| (str == "timeval")
|
||||
|| (str == "timex")
|
||||
|| (str == "timezone")
|
||||
|| (str == "dirent")
|
||||
|| (str == "dirent64")
|
||||
|| (str == "__dirstream")
|
||||
|| (str == "tm")
|
||||
|| (str == "cmsghdr")
|
||||
|| (str == "msghdr")
|
||||
|| (str == "rpcent")
|
||||
|| (str == "random_data")
|
||||
|| (str == "drand48_data")
|
||||
|| (str == "termios")
|
||||
|| (str == "iovec")
|
||||
|| (str == "file_handle")
|
||||
|| (str == "lconv")
|
||||
|| (str == "__locale_struct")
|
||||
|| (str == "aliasent")
|
||||
|| (str == "fstab")
|
||||
|| (str == "group")
|
||||
|| (str == "hostent")
|
||||
|| (str == "protoent")
|
||||
|| (str == "passwd")
|
||||
|| (str == "spwd")
|
||||
|| (str == "ttyent")
|
||||
|| (str == "utmp")
|
||||
|| (str == "utmpx")
|
||||
|| (str == "ifaddrs")
|
||||
|| (str == "statfs")
|
||||
|| (str == "statfs64")
|
||||
|| (str == "statvfs")
|
||||
|| (str == "timeb")
|
||||
|| (str == "_ftsent")
|
||||
|| (str == "sysinfo")
|
||||
|| (str == "rlimit")
|
||||
|| (str == "rlimit64")
|
||||
|| (str == "rusage")
|
||||
|| (str == "entry")
|
||||
|| (str == "pollfd")
|
||||
|| (str == "re_pattern_buffer")
|
||||
|| (str == "sembuf")
|
||||
|| (str == "tms")
|
||||
|| (str == "utsname")
|
||||
|| (str == "utimbuf")
|
||||
// ncurses
|
||||
|| (str == "_win_st")
|
||||
|
||||
|| (str == "cchar_t")
|
||||
) {
|
||||
// FILE*, fpos_t*, ...
|
||||
return 'p';
|
||||
} else if (str == "__va_list_tag") {
|
||||
return 'A';
|
||||
} else {
|
||||
return 0;
|
||||
}*/
|
||||
ALL
|
||||
}
|
||||
#undef END
|
||||
#undef TYPEDEF
|
||||
#undef STRUCT2
|
||||
#undef STRUCT
|
||||
#undef START
|
||||
|
||||
#define START()
|
||||
#define STRUCT(s, ret) if (str == s) { return ret; } else
|
||||
#define STRUCT2(s, ret, c) if (str == s) { return ret; } else
|
||||
#define TYPEDEF(s, ret) if (str == s) { return ret; } else
|
||||
#define END() return "";
|
||||
const char *ptr2str(const std::string &str) {
|
||||
/*if (str == "_IO_FILE") {
|
||||
return "a FILE";
|
||||
} else if (str == "_G_fpos_t") {
|
||||
return "a file position";
|
||||
} else if (str == "sockaddr") {
|
||||
return "a socket address";
|
||||
} else if (str == "itimerspec") {
|
||||
return "an itimerspec";
|
||||
} else if (str == "timespec") {
|
||||
return "a timespec";
|
||||
} else if (str == "itimerval") {
|
||||
return "an itimerval";
|
||||
} else if (str == "timeval") {
|
||||
return "a timeval";
|
||||
} else if (str == "timex") {
|
||||
return "a timex";
|
||||
} else if (str == "timezone") {
|
||||
return "a timezone";
|
||||
} else if (str == "dirent") {
|
||||
return "a dirent";
|
||||
} else if (str == "dirent64") {
|
||||
return "a dirent64";
|
||||
} else if (str == "__dirstream") {
|
||||
return "a dir stream";
|
||||
} else if (str == "tm") {
|
||||
return "a time structure (tm)";
|
||||
} else if (str == "cmsghdr") {
|
||||
return "a cmsghdr";
|
||||
} else if (str == "msghdr") {
|
||||
return "a msghdr";
|
||||
} else if (str == "rpcent") {
|
||||
return "an rpcent";
|
||||
} else if (str == "random_data") {
|
||||
return "a random_data structure";
|
||||
} else if (str == "drand48_data") {
|
||||
return "a drand48_data structure";
|
||||
} else if (str == "termios") {
|
||||
return "a termios";
|
||||
} else if (str == "iovec") {
|
||||
return "an iovec";
|
||||
} else if (str == "file_handle") {
|
||||
return "a file handle";
|
||||
} else if (str == "lconv") {
|
||||
return "an lconv";
|
||||
} else if (str == "__locale_struct") {
|
||||
return "a locale structure";
|
||||
} else if (str == "aliasent") {
|
||||
return "an alias";
|
||||
} else if (str == "fstab") {
|
||||
return "an fstab";
|
||||
} else if (str == "group") {
|
||||
return "a group";
|
||||
} else if (str == "hostent") {
|
||||
return "a hostent";
|
||||
} else if (str == "protoent") {
|
||||
return "a protoent";
|
||||
} else if (str == "passwd") {
|
||||
return "a password";
|
||||
} else if (str == "spwd") {
|
||||
return "an spwd";
|
||||
} else if (str == "ttyent") {
|
||||
return "a ttyent";
|
||||
} else if (str == "utmp") {
|
||||
return "an utmp structure";
|
||||
} else if (str == "utmpx") {
|
||||
return "an utmpx structure";
|
||||
} else if (str == "ifaddrs") {
|
||||
return "an ifaddrs structure";
|
||||
} else if (str == "statfs") {
|
||||
return "a statfs structure";
|
||||
} else if (str == "statfs64") {
|
||||
return "a statfs64 structure";
|
||||
} else if (str == "statvfs") {
|
||||
return "a statvfs structure";
|
||||
} else if (str == "statvfs64") {
|
||||
return "a statvfs64 structure";
|
||||
} else if (str == "timeb") {
|
||||
return "a timeb structure";
|
||||
} else if (str == "_ftsent") {
|
||||
return "an _ftsent structure";
|
||||
} else if (str == "sysinfo") {
|
||||
return "a sysinfo structure";
|
||||
} else if (str == "rlimit") {
|
||||
return "an rlimit structure";
|
||||
} else if (str == "rlimit64") {
|
||||
return "an rlimit64 structure";
|
||||
} else if (str == "rusage") {
|
||||
return "an rusage structure";
|
||||
} else if (str == "entry") {
|
||||
return "an entry structure";
|
||||
} else if (str == "pollfd") {
|
||||
return "a pollfd structure";
|
||||
} else if (str == "re_pattern_buffer") {
|
||||
return "a re_pattern_buffer structure";
|
||||
} else if (str == "sembuf") {
|
||||
return "a sembuf structure";
|
||||
} else if (str == "tms") {
|
||||
return "a tms structure";
|
||||
} else if (str == "utsname") {
|
||||
return "an utsname structure";
|
||||
} else if (str == "utimbuf") {
|
||||
return "an utimbuf structure";
|
||||
} else if (str == "__va_list_tag") {
|
||||
return "__va_list_tag (aka, a va_list)";
|
||||
// ncurses
|
||||
} else if (str == "_win_st") {
|
||||
return "a _win_st structure";
|
||||
|
||||
} else if (str == "cchar_t") {
|
||||
return "a cchar_t";
|
||||
} else return "";*/
|
||||
ALL
|
||||
}
|
||||
#undef END
|
||||
#undef TYPEDEF
|
||||
#undef STRUCT2
|
||||
#undef STRUCT
|
||||
#undef START
|
||||
@@ -0,0 +1,118 @@
|
||||

|
||||
|
||||
# Box64: Linux Userspace x86-64 Emulator with a Twist
|
||||
|
||||
[Website](https://box86.org/) | [Changelog](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box64/blob/main/README_CN.md) | [Українська](https://github.com/ptitSeb/box64/blob/main/README_UK.md) | [Report an Error](https://github.com/ptitSeb/box64/issues/new)
|
||||
|
||||
     
|
||||
|
||||
---
|
||||
|
||||
Box64 enables running x86_64 Linux programs, including games, on non-x86_64 Linux systems such as Arm (64-bit little-endian host system required).
|
||||
|
||||
Check out Box64 in action on YouTube:
|
||||
- [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)
|
||||
- [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)
|
||||
- [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)
|
||||
|
||||
Box64 leverages native system libraries (libc, libm, SDL, OpenGL), offering ease of integration and surprising performance in many applications. For performance benchmarks, check [this analysis](https://box86.org/index.php/2021/06/game-performances/).
|
||||
|
||||
With DynaRec for ARM64, RV64 and LA64 platforms, Box64 achieves a speed boost 5-10x faster than the interpreter alone. For a deeper look at DynaRec, see [Inner workings](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
|
||||
|
||||
<img src="docs/img/Box64Icon.png" width="96" height="96" alt="Box64 Icon">
|
||||
|
||||
_Logo and icon by @grayduck - Thank you!_
|
||||
|
||||
---
|
||||
|
||||
## 📖 Usage
|
||||
|
||||
- `$ box64 ./program [args]` to run Linux x86_64 programs.
|
||||
- `$ box64 -k` to kill all the emulated processes.
|
||||
- `$ box64-bash` to have a x86_64 bash environment.
|
||||
- Want to use wine? see [Wine Documentation](docs/WINE.md).
|
||||
|
||||
Box64 also offers environment variables and rcfile to control its behavior. For details, see [Usage Documentation](docs/USAGE.md).
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Compiling and Installation
|
||||
|
||||
- [Compilation Instructions](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md)
|
||||
- [Bundle x86 Libraries](https://github.com/ptitSeb/box64/blob/main/docs/BUNDLE-X86-LIBS.md)
|
||||
- [Wine Installation for Box64](https://github.com/ptitSeb/box64/blob/main/docs/WINE.md)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Version History
|
||||
|
||||
See the [Changelog](docs/CHANGELOG.md) for version updates.
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ Platform Compatibility Notes
|
||||
|
||||
Box64 requires 64-bit libraries on the host system, as it directly translates x86_64 function calls. For 32-bit binaries, use Box86 or Box32.
|
||||
|
||||
**Notes**
|
||||
|
||||
1. Box32 mode is in the making, which aims to support 32-bit binaries on Box64, you can enable it at build time, but do not expect everything to work. There is actually a few things that work, many that don't. It's a known issue, no need to create tickets about it for now.
|
||||
2. Some installers may default to x86 on 64-bit host OSes, causing compatibility issues. Workaround: Use a fake `uname` that returns "x86_64" for `-m`.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
Box64 has configuration files located in `/etc/box64.box64rc` and `~/.box64rc`, both formatted as `.ini` files. If you don’t want to use the default `/etc/box64.box64rc` file, copy it to `~/.box64rc` to ensure compatibility.
|
||||
|
||||
Settings priority: `~/.box64rc` > `/etc/box64.box64rc` > Command line.
|
||||
|
||||
For more information, check [Usage Documentation](docs/USAGE.md).
|
||||
|
||||
---
|
||||
|
||||
## 📄 Additional Platform-Specific Notes
|
||||
|
||||
### Unity Game Emulation
|
||||
|
||||
- Many Unity games require OpenGL 3+, which may be challenging on ARM/RISC-V SBCs.
|
||||
- **Tip for Pi4 and Pi5 Users**: Set `MESA_GL_VERSION_OVERRIDE=3.2` with `BOX64_DYNAREC_STRONGMEM=1` to prevent freezes and enable strong memory mode.
|
||||
- **Using Panfrost**: For better compatibility on ARM, enable `PAN_MESA_DEBUG=gl3` to force higher OpenGL profiles. This can help if a game starts but quits unexpectedly before showing any content.
|
||||
|
||||
### GTK Programs
|
||||
|
||||
Box64 wraps GTK libraries, supporting both gtk2 and gtk3.
|
||||
|
||||
### Steam
|
||||
|
||||
See [Steam Documentation](docs/STEAM.md).
|
||||
|
||||
### Wine
|
||||
|
||||
Box64 supports Wine64 and Proton. For 32-bit components, Box86 is required. Systems with both Box64 and Box86 can run 32- and 64-bit Windows programs.
|
||||
|
||||
**Note**: You can use Wine WOW64 build to run x86 Windows programs in Box64-only environments, this is still experimental, but it works in most cases.
|
||||
|
||||
For more information, check [Wine Documentation](docs/WINE.md).
|
||||
|
||||
### Vulkan
|
||||
|
||||
Box64 wraps Vulkan libraries.
|
||||
|
||||
----
|
||||
Final word
|
||||
----
|
||||
|
||||
I want to thank everyone who has contributed to box64 development.
|
||||
There are many ways to contribute: code contribution, financial, hardware and advertisement!
|
||||
So, in no particular order, I want to thank:
|
||||
* For their major code contribution: rajdakin, mogery, ksco, xctan
|
||||
* For their major financial contribution: [Playtron](https://playtron.one), tohodakilla, FlyingFathead, stormchaser3000, dennis1248, sll00, [libre-computer-project](https://libre.computer/), [CubeCoders Limited](http://cubecoders.com/)
|
||||
* For hardware contribution and LoongArch migration: [xiaoji](https://www.linuxgame.cn/), Deepin Beijing Develop Team
|
||||
* For their hardware contribution: [ADLINK](https://www.adlinktech.com/Products/Computer_on_Modules/COM-HPC-Server-Carrier-and-Starter-Kit/Ampere_Altra_Developer_Platform?lang=en) with [Ampere](https://amperecomputing.com/home/edge), [SOPHGO](https://www.sophon.ai/), [Radxa](https://rockpi.org/), [StarFive](https://rvspace.org/), [Pine64](https://www.pine64.org/), [AYN](https://www.ayntec.com/), [AYANEO](https://ayaneo.com/), [jiangcuo](https://github.com/jiangcuo)
|
||||
* For their continuous advertisements for the box64 project: salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/[TwisterOS](https://twisteros.com/) team, [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
|
||||
|
||||
And I also thank the many other people who participated even once in this project.
|
||||
|
||||
(If you use Box64 in your project, please don't forget to mention it!)
|
||||
|
||||
+119
@@ -0,0 +1,119 @@
|
||||

|
||||
|
||||
# Box64:Linux 用户空间 x86-64 模拟器(支持原生库)
|
||||
|
||||
[官网](https://box86.org/) | [更新日志](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [English](https://github.com/ptitSeb/box64/blob/main/README.md) | [Українська](https://github.com/ptitSeb/box64/blob/main/README_UK.md) | [Report an Error](https://github.com/ptitSeb/box64/issues/new)
|
||||
|
||||
     
|
||||
|
||||
---
|
||||
|
||||
Box64 可以在非 x86_64 Linux 主机系统(比如 Arm)上运行 x86_64 Linux 程序(比如游戏),目前仅支持 64 位小端主机系统。
|
||||
|
||||
在 YouTube 上查看 Box64 的运行效果:
|
||||
- [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)
|
||||
- [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)
|
||||
- [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)
|
||||
|
||||
Box64 可以使用本机原生的系统库(libc、libm、SDL、OpenGL),有着易于集成的特性和令人惊讶的性能。如需性能基准测试,请查看[此分析](https://box86.org/index.php/2021/06/game-performances/)。
|
||||
|
||||
借助适用于 ARM64,RV64 以及 LA64 平台的 DynaRec,Box64 的速度比单独使用解释器快 5-10 倍。如需深入了解 DynaRec,请参考[此文章](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/)。
|
||||
|
||||
<img src="docs/img/Box64Icon.png" width="96" height="96" alt="Box64 Icon">
|
||||
|
||||
_Logo 由 @grayduck 制作,感谢!_
|
||||
|
||||
---
|
||||
|
||||
## 📖 使用方法
|
||||
|
||||
- `$ box64 ./program [args]` 运行 Linux x86_64 程序。
|
||||
- `$ box64 -k` 杀死所有模拟的进程。
|
||||
- `$ box64-bash` 进入 x86_64 bash 环境。
|
||||
- 想要使用 wine?请参阅 [Wine 使用说明](docs/WINE.md)。
|
||||
|
||||
Box64 还提供了环境变量和 Rc 文件来控制其行为。有关详细信息请参阅[使用文档](docs/USAGE.md)。
|
||||
|
||||
---
|
||||
|
||||
## 🚀 编译和安装
|
||||
|
||||
- [编译说明](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md)
|
||||
- [安装 Wine](https://github.com/ptitSeb/box64/blob/main/docs/WINE.md)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 版本历史
|
||||
|
||||
请参阅[变更日志](docs/CHANGELOG.md)了解版本更新说明。
|
||||
|
||||
---
|
||||
|
||||
## 🖥️ 平台兼容性说明
|
||||
|
||||
Box64 直接转换 x86_64 函数调用到本机原生库,因此需要主机系统上的 64 位库。对于 32 位二进制文件,请使用 Box86 或 Box32。
|
||||
|
||||
**注意事项**
|
||||
|
||||
1. Box32 模式正在制作中,旨在支持 Box64 上运行 32 位二进制文件,敬请期待!
|
||||
2. 某些安装程序可能会将 64 位的主机操作系统判定为 x86 导致兼容性问题。解决方法:使用假的 `uname` ,并使它在运行参数为 `-m` 时返回 `x86_64`。
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 配置
|
||||
|
||||
Box64 的配置文件位于 `/etc/box64.box64rc` 和 `~/.box64rc`,均为 `.ini` 格式的文件。如果您不想使用默认的 `/etc/box64.box64rc` 文件,请将其复制到 `~/.box64rc` 以确保兼容性。
|
||||
|
||||
配置项的优先级:`~/.box64rc` > `/etc/box64.box64rc` > 命令行。
|
||||
|
||||
更多信息,请参阅[使用文档](docs/USAGE.md)。
|
||||
|
||||
---
|
||||
|
||||
## 📄 特定平台的其他说明
|
||||
|
||||
### Unity 游戏
|
||||
- 许多 Unity 游戏需要 OpenGL 3+,这对 ARM/RISC-V SBC 来说可能具有挑战性。
|
||||
- **对 Pi4 和 Pi5 用户的提示**:设置 `MESA_GL_VERSION_OVERRIDE=3.2` 和 `BOX64_DYNAREC_STRONGMEM=1` 以防止卡死并启用强内存模式。
|
||||
- **Panfrost**:为了在 ARM 上实现更好的兼容性,启用 `PAN_MESA_DEBUG=gl3` 以强制更高的 OpenGL Profile。如果游戏可以启动但在显示任何内容之前意外退出,这个设置可能会有所帮助。
|
||||
|
||||
### GTK 程序
|
||||
|
||||
Box64 包装了 GTK 库,支持 gtk2 和 gtk3。
|
||||
|
||||
### Steam
|
||||
|
||||
Box64 支持 Linux Steam 和 Windows Steam,更多细节请参考[Steam 文档](docs/STEAM.md)。
|
||||
|
||||
> 由于 Linux Steam 客户端应用是 32 位的,需要使用 Box86 或 Box32,但其本地服务器是 64 位的二进制文件。对于内存少于 6GB 的系统,可能需要使用交换文件以获得最佳性能。
|
||||
|
||||
### Wine
|
||||
|
||||
Box64 支持 Wine64 和 Proton。对于 32 位组件,需要 Box86。配备 Box64 和 Box86 的系统可以运行 32 位和 64 位的 Windows 程序。
|
||||
|
||||
**提示**:您可以使用 Wine WOW64 版本在仅限 Box64 的环境中运行 x86 Windows 程序,这项支持仍处于实验阶段,但在大多数情况下都可以工作。
|
||||
|
||||
有关更多信息,请参阅 [Wine 使用说明](docs/WINE.md)。
|
||||
|
||||
### Vulkan
|
||||
|
||||
Box64 包装了 Vulkan 库。
|
||||
|
||||
----
|
||||
|
||||
结语
|
||||
----
|
||||
|
||||
我要感谢所有为 box64 开发做出贡献的人。
|
||||
贡献方式有很多种:代码贡献、财务帮助、捐赠捐赠和广告合作!
|
||||
以下感谢不分先后:
|
||||
|
||||
* 代码贡献:rajdakin, mogery, ksco, xctan
|
||||
* 财务支持:[Playtron](https://playtron.one), tohodakilla, FlyingFathead, stormchaser3000, dennis1248, sll00, [libre-computer-project](https://libre.computer/), [CubeCoders Limited](http://cubecoders.com/)
|
||||
* 硬件捐赠和 LoongArch 迁移:[xiaoji](https://www.linuxgame.cn/), Deepin Beijing Develop Team
|
||||
* 硬件捐赠:[ADLINK](https://www.adlinktech.com/Products/Computer_on_Modules/COM-HPC-Server-Carrier-and-Starter-Kit/Ampere_Altra_Developer_Platform?lang=en) with [Ampere](https://amperecomputing.com/home/edge), [SOPHGO](https://www.sophon.ai/), [Radxa](https://rockpi.org/), [StarFive](https://rvspace.org/), [Pine64](https://www.pine64.org/), [AYN](https://www.ayntec.com/), [AYANEO](https://ayaneo.com/), [jiangcuo](https://github.com/jiangcuo)
|
||||
* 为本项目持续的宣传:salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/[TwisterOS](https://twisteros.com/) team, [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
|
||||
|
||||
我还要感谢很多人,即使他们只参与了一次本项目。
|
||||
|
||||
(如果你的项目中使用了Box64,请不要忘记提及!)
|
||||
+117
@@ -0,0 +1,117 @@
|
||||

|
||||
|
||||
Емулятор простіра користувача x86_64 із родзинкою
|
||||
|
||||
[Дивитись журнал змін](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box64/blob/main/README_CN.md) | [English](https://github.com/ptitSeb/box64/blob/main/README.md) | [Повідомити про помилку](https://github.com/ptitSeb/box64/issues/new)
|
||||
|
||||
     
|
||||
|
||||
----
|
||||
|
||||
Box64 дозволяє запускати x86_64 Linux програми (наприклад, ігри) на системах Linux відмінних від x86_64, наприклад ARM (хост-система має мати 64-розрядний порядок редагування).
|
||||
|
||||
Ви можете знайти багато відео про Box64 в YouTube каналах [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ), [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g) або [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)
|
||||
|
||||
Оскільки Box64 використовує рідні версії деяких «системних» бібліотек, таких як libc, libm, SDL і OpenGL, його легко інтегрувати та використовувати з більшістю програм, а продуктивність у багатьох випадках може бути напрочуд високою. Подивіться на цей стендовий аналіз для прикладу [тут](https://box86.org/index.php/2021/06/game-performances/).
|
||||
|
||||
Box64 інтегрується з DynaRec (динамічний рекомпілятор) для платформ ARM64 і RV64 забезпечуючи підвищення швидкості в 5-10 разів, ніж використання лише інтерпретатора. Деякі високорівневі відомості про те, як працює DynaRec, можна знайти [тут](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
|
||||
|
||||
Деякі внутрішні коди операцій x64 використовують частини «Бібліотеки емулятора Realmode X86», дивіться [x64primop.c](src/emu/x64primop.c) для детальної інформації про авторські права.
|
||||
|
||||
<img src="docs/img/Box64Icon.png" width="96" height="96">
|
||||
|
||||
Логотип і піктограма зроблені @grayduck, дякую!
|
||||
|
||||
----
|
||||
|
||||
Використання
|
||||
----
|
||||
|
||||
Є кілька змінних середовища для керування поведінкою Box64.
|
||||
|
||||
Дивіться [тут](docs/USAGE.md) для перегляду всіх змінних середовища та того, що вони роблять.
|
||||
|
||||
Примітка: Dynarec від Box64 використовує механізм із захистом пам’яті та обробником сигналу помилки сегментів для обробки JIT коду. Простіше кажучи, якщо ви хочете використовувати GDB для налагодження запущеної програми, яка використовує JIT-код (наприклад, mono/Unity3D), ви все одно матимете багато «звичайних» помилок сегментів. Пропонується використовувати щось на зразок `handle SIGSEGV nostop` в GDB, щоб не зупинятися на кожній помилці сегмента, і, можливо, поставити точку зупину всередині `my_memprotectionhandler` в `signals.c`, якщо ви хочете перехопити помилки сегментів.
|
||||
|
||||
----
|
||||
Компіляція/Встановлення
|
||||
----
|
||||
> Інструкцію зі складання Box64 можна знайти [тут](docs/COMPILE.md).\
|
||||
> Інструкцію з встановлення Wine для Box64 можна знайти [тут](docs/WINE.md).
|
||||
|
||||
----
|
||||
Історія версій/Журнал змін
|
||||
----
|
||||
|
||||
Історія версій доступна [тут](docs/CHANGELOG.md).
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо 32 бітних платформ
|
||||
----
|
||||
Оскільки Box64 працює шляхом прямого перекладу викликів функцій з x86_64 на хост-систему, хост-система (та, на якій працює Box64) повинна мати 64-розрядні бібліотеки. Box64 не містить 64-біт <-> 32-біт перекладу.
|
||||
|
||||
Також розумійте що Box64 запускатиме лише 64-розрядні двійкові Linux файли. Для 32-розрядних двійкових файлів вам потрібен Box86 (з усіма хитрощами з мультиархітектурною системою або корінними правами). Зауважте, що багато інсталяторів (на основі mojo) повертаються до "x86" при виявленні ОС ARM64, і тому намагатимуться використовувати Box86 для налаштування, навіть якщо існує версія x86_64. Ви можете зламати свій шлях за допомогою фальшивого "uname", який повертає "x86_64", коли аргумент "-m"
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо конфігурації Box64
|
||||
----
|
||||
|
||||
Обидва файли мають однаковий синтаксис і в основному є файлами ini. Розділ у квадратних дужках визначає назву процесу, а решта — встановлють змінну середовища. Подивіться [використання](USAGE.md), щоб дізнатися, які параметри можна завдати. Box64 поставляється з файлом за замовчуванням, який слід встановити для кращої стабільності. Файл знаходиться в `system/box64.box64rc` і має бути встановлен в `/etc/box64.box64rc`. Якщо з певних причин ви не хочете встановлювати цей файл у `/etc`, принаймні скопіюйте його в `~/.box64rc` або гра може не працювати належним чином. Зауважте, що пріоритетом є: `~/.bashrc` > `/etc/box64.box64rc` > командний рядок
|
||||
Таким чином, ваші налаштування в `~/.bashrc` можуть замінити налаштування з вашого командного рядка...
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо емуляції ігор Unity
|
||||
----
|
||||
|
||||
Запуск ігор Unity має працювати, але ви також повинні зауважити, що для багатьох ігор Unity3D потрібен OpenGL 3+, який може бути складно забезпечити на ARM SBC (одноплатних комп’ютерах). Крім того, багато нових ігор Unity3D (наприклад, KSP) використовують стиснуті текстури BC7, які не підтримуються багатьма інтегрованими GPU ARM.
|
||||
Підказка: на Pi4 і Pi5 використовуйте `MESA_GL_VERSION_OVERRIDE=3.2` з `BOX64_DYNAREC_STRONGMEM=1`, щоб запобігти зависанням і ввімкнути режим сильної пам’яті, і використовуйте Panfrost `PAN_MESA_DEBUG=gl3`, щоб використовувати вищий профіль, якщо гра починається, а потім завершується, перш ніж щось показати.
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо програм GTK
|
||||
----
|
||||
|
||||
Бібліотеки GTK2 і GTK3 тепер використовуються в Box64.
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо Steam
|
||||
----
|
||||
|
||||
Зауважте, що Steam є гібридом 32-біт / 64-біт. Вам ПОТРІБЕН box86, щоб запустити Steam, оскільки клієнта є 32-розрядною двійковою програмою. Він також використовує 64-розрядні двійкові файли локального сервера, і цей процес steamwebhelper тепер є обов’язковим навіть у «малому режимі». І цей процес з’їсть багато оперативної пам’яті, таким чином машині з 6 Гб оперативної пам’яті знадобиться файл підкачки для використання Steam.
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо Wine
|
||||
----
|
||||
|
||||
Wine64 підтримується Box64, Proton теж. Майте на увазі, що 64-розрядний Wine також містить 32-розрядні компоненти щоб мати можливість запускати 32-розрядні програми Windows. Для 32-розрядних програм потрібен Box86, і вони не працюватимуть без нього. У системі, де присутні і працюють Box64, і Box86, 64-розрядне встановлення Wine може запускати як 32-розрядні, так і 64-розрядні програми Windows (просто використовуйте `wine` і `wine64` відповідно).
|
||||
Зауважте, що новий 32-бітний PE в 64-бітному процесі, який Wine зараз реалізує у Wine 7+ тепер підтримується, але підтримка є досить молодою тому можуть виникнути деякі проблеми.
|
||||
|
||||
----
|
||||
|
||||
Примітки щодо Vulkan
|
||||
----
|
||||
|
||||
Box64 використовує бібліотеки Vulkan, але зауважте що він тестувався з картою AMD Radeon RX550 і драйвером Freedreno, тому деякі розширення можуть бути відсутні залежно від вашої відеокарти.
|
||||
|
||||
----
|
||||
|
||||
Останнє слово
|
||||
----
|
||||
|
||||
Я хочу подякувати всім, хто зробив внесок у розвиток box64.
|
||||
Є багато способів зробити внесок: внесок коду, фінансовий внесок, апаратне забезпечення та реклама!
|
||||
Отже, без особливого порядку, я хочу подякувати:
|
||||
* За основний внесок у код: rajdakin, mogery, ksco, xctan
|
||||
* За великий фінансовий внесок: [Playtron](https://playtron.one), tohodakilla, FlyingFathead, stormchaser3000, dennis1248, sll00, [libre-computer-project](https://libre.computer/)
|
||||
* За апаратне забезпечення та міграцію LoongArch: [xiaoji](https://www.linuxgame.cn/), команда розробників Deepin Beijing
|
||||
* За внесок у апаратне забезпечення: [ADLINK](https://www.adlinktech.com/Products/Computer_on_Modules/COM-HPC-Server-Carrier-and-Starter-Kit/Ampere_Altra_Developer_Platform?lang=en) with [Ampere](https://amperecomputing.com/home/edge), [SOPHGO](https://www.sophon.ai/), [Radxa](https://rockpi.org/), [StarFive](https://rvspace.org/), [Pine64](https://www.pine64.org/), [AYN](https://www.ayntec.com/), [AYANEO](https://ayaneo.com/), [jiangcuo](https://github.com/jiangcuo)
|
||||
* За безперервну рекламу Box64: salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/Команда [TwisterOS](https://twisteros.com/), [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
|
||||
|
||||
І я також дякую багатьом іншим людям, які хоч раз брали участь у цьому проекті.
|
||||
|
||||
(Якщо ви використовуєте Box64 у своєму проекті, будь ласка, не забудьте згадати про це!)
|
||||
@@ -0,0 +1,82 @@
|
||||
https://archive.debian.org/debian/pool/main/c/curl/libcurl3-gnutls_7.74.0-1.3+deb11u7~bpo11+1_amd64.deb,d5ae55e3a9838d12358530cd03218cc0d18127a84e9cfc73bdf79dacd40b25e4
|
||||
https://archive.debian.org/debian/pool/main/c/curl/libcurl3-gnutls_7.74.0-1.3+deb11u7~bpo11+1_i386.deb,625e5189304d4d3bfb27cb821e257816c5ce761b1696b5da5ca4fa1035c48463
|
||||
https://archive.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_amd64.deb,6e85968afe1a6643f4e82e1cc168f848c5967a131bb1c7392f11974953db0e67
|
||||
https://archive.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.2l-1~bpo8+1_i386.deb,4e8b924286a064c257ca50b8ecd44fe71226443daef62b6836010590e2157329
|
||||
https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libunwind-1.4.0-5.fc34.i686.rpm,eb518e9d073c36fd29862c7afd00a8a7cb186074a0e162983f18fb6c9dc71d2c
|
||||
https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/l/libunwind-1.4.0-5.fc34.x86_64.rpm,0f44e37e4eb472508e0dba8505ebbb04c2c1390c6a43970a6af80aad886037e3
|
||||
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/h/hidapi-0.11.2-2.fc34.i686.rpm,386040fc502e2f02b4b072e0cd90c034dc0a30831fbd2ddb116d17c080b6f9a4
|
||||
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/h/hidapi-0.11.2-2.fc34.x86_64.rpm,2a13461c7d5fcf72ffd682b3eb04833aea8306d61c3b8bdeb42a5081d96d5478
|
||||
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/40/Everything/x86_64/Packages/s/SDL3-3.2.12-1.fc40.i686.rpm,4a3bce6e6358ddd05ed2941e7b8fcc4c8cc02df20741d3f0f9295facbc687769
|
||||
https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/40/Everything/x86_64/Packages/s/SDL3-3.2.12-1.fc40.x86_64.rpm,9524803ef42d80dc1b15190d5bb5925200995d5a6152eca04471383ff891af17
|
||||
https://cdn.getsol.us/repo/shannon/libj/libjpeg-turbo/libjpeg-turbo-3.0.3-21-1-x86_64.eopkg,c92f19d446b4c2450306f13b1a908f2552400da09301996fe349fee243d964d2
|
||||
https://cdn.getsol.us/repo/shannon/libj/libjpeg-turbo/libjpeg-turbo-32bit-3.0.3-21-1-x86_64.eopkg,5624990281f6520026aa2252c711f02d4916099aeac63accc83bd2135b9d3220
|
||||
https://repo.almalinux.org/almalinux/8.10/BaseOS/x86_64/os/Packages/nettle-3.4.1-7.el8.i686.rpm,13bc8758355c3ec885f414e0e86efad29a7fe82c0999cdb3754d666949c06cc5
|
||||
https://repo.almalinux.org/almalinux/8.10/BaseOS/x86_64/os/Packages/nettle-3.4.1-7.el8.x86_64.rpm,fb4aaa22b2e2f2fc0c451b87ac464e8746d240397d64e79f6bfd38f4e9128a5a
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.i686.rpm,6b9d8e1b34dcc5a5cb1196d746022b04677b7f9a105508392446508c6ae9b4cc,https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.x86_64.rpm,102eb4355d2dfc8093ed59dd2ebc6bf8616965524faf7e886212fd542f4c1b4b
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/compat-openssl11-1.1.1k-4.el9_0.x86_64.rpm,102eb4355d2dfc8093ed59dd2ebc6bf8616965524faf7e886212fd542f4c1b4b
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/fribidi-1.0.10-6.el9.2.i686.rpm,75f808f0f5f93aceb4e477aa5f302edbed07a605a0644f0ea929d4ea609e36a0
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/fribidi-1.0.10-6.el9.2.x86_64.rpm,b4763ca410f8479b2775efb55ba09e6722948af7526180a56309e3e090c27010
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libepoxy-1.5.5-4.el9.i686.rpm,fe35e8de9b68c8d7e7b6b525580fc36cf9c86412cdb2b022dc01f95801771981
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libepoxy-1.5.5-4.el9.x86_64.rpm,b6d1e7f1c832882ceb05187cbc2d8fe1f459bcd88c7160487ee6f734e1a5d017
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libICE-1.0.10-8.el9.i686.rpm,d9c44bb34c990fdcc6987feefacfc9e1e7997ca25f1e0a59c9adc9c16f2266d1
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libICE-1.0.10-8.el9.x86_64.rpm,d0b867203384942985c3c4ad6fc9ec0000fcc9965408451a6cdef8df06a3833c
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libogg-1.3.4-6.el9.i686.rpm,9e4ff6fa0251c5357ae8f648b3e396d0043d5b3f2fb28d23325f5bd592c67aee
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libogg-1.3.4-6.el9.x86_64.rpm,83b4b333e335654674032d1cda4d7deb328b5a409f95e3952c3dc482b684fd8f
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libsigc%2B%2B20-2.10.7-2.el9.i686.rpm,7c33f4c18cbd51dc0a7c9ae0190b1a27d0540ce2fd92ced4776dde66162d1a88
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libsigc%2B%2B20-2.10.7-2.el9.x86_64.rpm,8600132b9e4efadfe23d3125e90287f5a7114165fd9ecb064d9930fcca446ef2
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libSM-1.2.3-10.el9.i686.rpm,ec68b3def828ba442248f3cff495f42c4af3dd58f38c8daad07dfddc109d999a
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libSM-1.2.3-10.el9.x86_64.rpm,d00318843a50138829b470a97b8db1a00723b10bca23c16a8386d9ab670e4c64
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libtheora-1.1.1-31.el9.i686.rpm,2155c688b516ab359d0c47be6d73e51d3c65f199ed5591f7bb7ce6d5d9799977
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libtheora-1.1.1-31.el9.x86_64.rpm,25ab4a8ad997b450b4a34a777f5a0678eea72ca1665944a7a461ac63de4b25bf
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libvorbis-1.3.7-5.el9.i686.rpm,e38c5185fea611330ea253db020315dd564507bf95c48a81dbe7db186ce4214b
|
||||
https://vault.almalinux.org/9.5/AppStream/x86_64/os/Packages/libvorbis-1.3.7-5.el9.x86_64.rpm,3c340337a073975636d198a282503f32a54bf85fb5345522a2c22e530b8d6c9e
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/bluez-libs-5.72-2.el9.i686.rpm,af1aba8e6fa5ccf33032d58a3acc59368c07d532293396db205fb9a4bc1241ae
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/bluez-libs-5.72-2.el9.x86_64.rpm,49c273813b4616240acdae8dae893192658c7541482f9bbb2c46dfe19b61877d
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/glibc-2.34-125.el9_5.8.alma.1.i686.rpm,28bc1088e39483d145849e8804c5a0f2524faeb4f76631ae46c41100f40e08b9
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/glibc-2.34-125.el9_5.8.alma.1.x86_64.rpm,1848b9ced2dfec6c206791b23a5a8a6356939c5ed0492fc91c86bf1d3a255c1d
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gmp-6.2.0-13.el9.i686.rpm,fe352f7d197ebdf2c92bbd6e548f9f6b7ac9e69e7a9d6c9861a6274482e79d73
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gmp-6.2.0-13.el9.x86_64.rpm,babe0b1385e723476a216d5f4b72453e031c3d683b19344786c2bddf7203cb04
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gnutls-3.8.3-4.el9_4.i686.rpm,64cf0b0136d3f9b80b07ce2d4b8ce6a4ab86617e8ef9baf560bdfa5edef825ea
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/gnutls-3.8.3-4.el9_4.x86_64.rpm,16c48c504fe62f8e19cac7c6442d3e08bba487f610c2f533116dac32357cda86
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/harfbuzz-2.7.4-10.el9.i686.rpm,5157daf2ab0a03b403d37c60b150b8f0f866754714f81e3d96368e06a16339ce
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/harfbuzz-2.7.4-10.el9.x86_64.rpm,1f81073019abe4176d4496723a89b55a349c31f507e96397a0b3efa7cea0ff61
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libblkid-2.37.4-20.el9.i686.rpm,f9e62d2768c31948b53268b7de51bd1c7342cdf39a328a0d89d933b4aa0c5dd1
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libblkid-2.37.4-20.el9.x86_64.rpm,ed02d978a36488b38bad62af21d4045367c1f0b00d00c90ded01e2fc8e190536
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libbrotli-1.0.9-7.el9_5.i686.rpm,d18c20fccbb9497222059d475161a55c0c6279344f214fe551b8b0f87d3c054a
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libbrotli-1.0.9-7.el9_5.x86_64.rpm,77906ae44bcd42a9f6646d814874768e8befaabf413133d44f71a95ac6c6d68c
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libffi-3.4.2-8.el9.i686.rpm,70daa216ed2a6540e41c455efc95d2b5671db164137f854bceae07e348f58645
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libffi-3.4.2-8.el9.x86_64.rpm,1cf2d122e5c423681394c1bc599ee2281d2eafff5a3749842bc93c37db4bed5e
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgcc-11.5.0-2.el9.alma.1.i686.rpm,fed64dfadf74bd132ac2675f625ec601ca9d7ae9d05b8d7ff492a204260d0174
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgcc-11.5.0-5.el9_5.alma.1.x86_64.rpm,7bd3ec130e1712442121b61b27164386006b9bfa6f0fa188316ecb35575a768f
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgomp-11.5.0-2.el9.alma.1.i686.rpm,686ac26afe2073a3607f26fd1592a8ccd9b78f6eec6e872528634b43c4e04dd7
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgomp-11.5.0-2.el9.alma.1.x86_64.rpm,9a2bdc6807b22ffb6294b30dcc13e20198abe5facaeefcf1bfacec3e1013e3c2
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgpg-error-1.42-5.el9.i686.rpm,23f828674bc30752687452dacf4a25ca8c25ef0d25e3e6953d0714b5b33cef08
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libgpg-error-1.42-5.el9.x86_64.rpm,f28fabeb02add41b8156c394427da9dbf99882d8c42055367f872130ee424c97
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libidn2-2.3.0-7.el9.i686.rpm,4458e2d416b5e6714ec664c4f88791eee7d1e707026a5854d948a6159911465b
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libidn2-2.3.0-7.el9.x86_64.rpm,c3ff43237c05258ee0dd77c28540fc8d0d824f1567b115ddfd555b78d2ee0e7a
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libnsl-2.34-125.el9_5.8.alma.1.i686.rpm,7f4d1552b6036c49028db959f82fc0bc30773cd7ed0a62c3906da0e2388f4dc5
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libnsl-2.34-125.el9_5.8.alma.1.x86_64.rpm,7d0e521ab087807ee71d79da66a2829b827bf5080bb5d080dfab108e31cf218b
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libpng-1.6.37-12.el9.i686.rpm,66bf967e84f0d8e7a0059f2b7dda33482ff5e4fe088d0e3bc86dc54e6c7c97be
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libpng-1.6.37-12.el9.x86_64.rpm,ebb3e927dfafa0b199e00e2bef4c10c85fc82a70c359faf9aeb599eda70bfa5e
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libstdc%2B%2B-11.5.0-5.el9_5.alma.1.i686.rpm,05fd29569c312a661374aa69e28ed5cad20812822070a3138265c92a446e2c80
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libstdc%2B%2B-11.5.0-5.el9_5.alma.1.x86_64.rpm,7efb1ded0ec2763589dd3bc6a9d52fa9f898cc1f3db6e8761e1d223ce4506424
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libtasn1-4.16.0-8.el9_1.i686.rpm,9cbd11277e89bd0d4a80900bee01ca71b0c582c9cb5744f5035135b2ed907c85
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libtasn1-4.16.0-8.el9_1.x86_64.rpm,2dd3a1ad2785df642cb03dfed6dfbeec929ff8b14e52e61272ca7e89f86ba3cd
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libunistring-0.9.10-15.el9.i686.rpm,792600a879fbd94ce4bf249713b0cb3a166c147cfad397e8a15e6b4f01c75997
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libunistring-0.9.10-15.el9.x86_64.rpm,d2f86fbee729a4900a433a6c52a3cb95d9b52b1d79c9e719ee3ef509813eb6d9
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libzstd-1.5.1-2.el9.i686.rpm,e98f253d6f5f9acf2ded628cd98f50a54a031e354bf7bb2efc3fe39f9899fe49
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/libzstd-1.5.1-2.el9.x86_64.rpm,2e5215e225cec2db43d92c3b3380812a6f8684e881ed415670299e1e0fe7d1ce
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/lz4-libs-1.9.3-5.el9.i686.rpm,c308ba7380a3b5c5337c919150f0234342b64c1ea696d6207c2b790b82ba4669
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/lz4-libs-1.9.3-5.el9.x86_64.rpm,439e701491af6a957ac4d7dc69cccee1a945333f19d8bfcbd896b5119af01aab
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/ncurses-libs-6.2-10.20210508.el9.i686.rpm,285db6dc6f610f75ef6863dcb0a383eae394c2b33bff283189cb49ac7fae4c58
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/ncurses-libs-6.2-10.20210508.el9.x86_64.rpm,d06b0e491481a345faf21a69666cbdc302d19b54fb29ae1aa78fa6b205f9e604
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.i686.rpm,e5610fe3b25cfca1616440e1a8a7489fd37b0852f182fdda87ab8e196d981970
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/nettle-3.9.1-1.el9.x86_64.rpm,9786b6610d17aa495fb640ba6d046bf73704915b82d12e6d8339090ff4891de5
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-3.el9_5.i686.rpm,abe4ab924b405c236eaf3fa067fed50ac66d15d0ef42c782a745788c1a9c5b91
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/p11-kit-0.25.3-3.el9_5.x86_64.rpm,0e1bd97e697a9fa3b4e508b945cf352b73b06e4e8218c14ac5fb912b0022c646
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pam-1.5.1-22.el9_5.i686.rpm,f2ae4441fc667cdcb930e7a2cfe90f7342e7d1c8848d6d18cb350ba68e025862
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pam-1.5.1-22.el9_5.x86_64.rpm,15bfe177d3c10982c75e81d7b274883a9fb53322011c8d829667c983ee419b18
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pciutils-libs-3.7.0-5.el9.i686.rpm,2cf468da5ecf307cc325c9a5da0a288aafd25dec0951af2b4d0954a77bdf900d
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/pciutils-libs-3.7.0-5.el9.x86_64.rpm,308bd897d8f9a36020d70edc79089a3595b22b149200d67c37e2d4e6147a9f75
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/sqlite-libs-3.34.1-7.el9_3.i686.rpm,dc6946a8344b8f4f476fef9479d1786c86fdcd045e988ab5d85fef7780e1fae4
|
||||
https://vault.almalinux.org/9.5/BaseOS/x86_64/os/Packages/sqlite-libs-3.34.1-7.el9_3.x86_64.rpm,e7f87444f24a03b37caa02942082b6d4283067ecbbd3f7798f882d22b55713cf
|
||||
|
@@ -0,0 +1,128 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -ex
|
||||
|
||||
trap cleanup_exit INT TERM EXIT
|
||||
|
||||
cleanup_exit()
|
||||
{
|
||||
echo "Running cleanup_exit..."
|
||||
rm -rf /tmp/box64-bundle.*
|
||||
}
|
||||
|
||||
# we must have few tools
|
||||
awk=$(which awk) || { echo "E: You must have awk" && exit 1; }
|
||||
cpio=$(which cpio) || { echo "E: You must have cpio" && exit 1; }
|
||||
curl=$(which curl) || { echo "E: You must have curl" && exit 1; }
|
||||
curl_cmd="${curl} --connect-timeout 5 --retry 5 --retry-delay 1 --create-dirs -fsSLo"
|
||||
rpm2cpio=$(which rpm2cpio) || { echo "E: You must have rpm2cpio" && exit 1; }
|
||||
sha256sum=$(which sha256sum) || { echo "E: You must have sha256sum" && exit 1; }
|
||||
unzip=$(which unzip) || { echo "E: You must have unzip" && exit 1; }
|
||||
|
||||
current_dir=$(pwd)
|
||||
dir_tmp="$(mktemp -d /tmp/box64-bundle.XXXXXX)"
|
||||
|
||||
# download the packages
|
||||
while IFS= read -r line; do
|
||||
# shellcheck disable=SC2016
|
||||
pkg_url=$(echo "${line}" | ${awk} -F',' '{print$(NF-1)}')
|
||||
# shellcheck disable=SC2016
|
||||
pkg_checksum=$(echo "${line}" | ${awk} -F',' '{print$(NF)}')
|
||||
# shellcheck disable=SC2016
|
||||
pkg_name=$(echo "${pkg_url}" | ${awk} -F'/' '{print$(NF)}')
|
||||
${curl_cmd} "${dir_tmp}/bundle-pkgs/${pkg_name}" "${pkg_url}"
|
||||
checksum="$(${sha256sum} "${dir_tmp}/bundle-pkgs/${pkg_name}" | awk '{print $1}')"
|
||||
if [ "${pkg_checksum}" != "${checksum}" ]; then
|
||||
echo "E: Invalid checksum for ${pkg_name}"
|
||||
echo "Expected: ${pkg_checksum}"
|
||||
echo "Computed: ${checksum}"
|
||||
exit 1
|
||||
fi
|
||||
done < box64-bundle-x86-libs.csv
|
||||
|
||||
# generate the bundle packages archive
|
||||
tar -C "${dir_tmp}"/bundle-pkgs -czvf "${current_dir}"/box64-bundle-x86-pkgs.tar.gz .
|
||||
|
||||
# extract the packages
|
||||
cd "${dir_tmp}"/bundle-pkgs
|
||||
for file in *.deb *.eopkg *.rpm *.xbps; do
|
||||
# handle the case of no files, e.g. xbps
|
||||
[ -e "${dir_tmp}"/bundle-pkgs/"${file}" ] || break
|
||||
# shellcheck disable=SC2016
|
||||
extension=$(echo "${file}" | ${awk} -F'.' '{print$(NF)}')
|
||||
mkdir -p "${dir_tmp}"/bundle-libs
|
||||
cd "${dir_tmp}"/bundle-libs
|
||||
case "${extension}" in
|
||||
deb)
|
||||
echo "I: DEB (Debian) package detected (${file})"
|
||||
ar x "${dir_tmp}"/bundle-pkgs/"${file}"
|
||||
tar -xf data.tar*
|
||||
;;
|
||||
eopkg)
|
||||
echo "I: EOPKG (Solus Linux) package detected (${file})"
|
||||
${unzip} -o "${dir_tmp}"/bundle-pkgs/"${file}"
|
||||
tar -xf install.tar.xz
|
||||
;;
|
||||
rpm)
|
||||
echo "I: RPM (Fedora) detected (${file})"
|
||||
${rpm2cpio} "${dir_tmp}"/bundle-pkgs/"${file}" | ${cpio} -idmv
|
||||
;;
|
||||
xbps)
|
||||
echo "I: XBPS (Void Linux) package detected (${file})"
|
||||
tar -xf "${dir_tmp}"/bundle-pkgs/"${file}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# reorganize the files
|
||||
cd "${dir_tmp}"/bundle-libs
|
||||
mkdir -p "${dir_tmp}"/bundle-libs/box64-i386-linux-gnu
|
||||
mv lib/*.so* usr/lib/*.so* usr/lib/i386-linux-gnu/*.so* usr/lib32/*.so* \
|
||||
"${dir_tmp}"/bundle-libs/box64-i386-linux-gnu
|
||||
mkdir -p "${dir_tmp}"/bundle-libs/box64-x86_64-linux-gnu
|
||||
mv lib64/*.so* usr/lib/x86_64-linux-gnu/*.so* usr/lib64/*.so* \
|
||||
"${dir_tmp}"/bundle-libs/box64-x86_64-linux-gnu
|
||||
rm -f ./*.tar.* debian-binary files.xml metadata.xml
|
||||
rm -rf ./lib* etc run sbin usr var
|
||||
mkdir -p usr/lib
|
||||
mv box64-*-linux-gnu usr/lib
|
||||
|
||||
# remove libraries that cannot be emulated
|
||||
# https://github.com/ptitSeb/box64/blob/v0.3.8/src/librarian/library.c#L433
|
||||
set -- libc libpthread librt libGL libX11 libasound libdl libm libbsd libutil \
|
||||
libresolv libXxf86vm libXinerama libXrandr libXext libXfixes libXcursor \
|
||||
libXrender libXft libXi libXss libXpm libXau libXdmcp libX11-xcb libxcb \
|
||||
libxcb-xfixes libxcb-shape libxcb-shm libxcb-randr libxcb-image \
|
||||
libxcb-keysyms libxcb-xtest libxcb-glx libxcb-dri2 libxcb-dri3 libXtst libXt \
|
||||
libXcomposite libXdamage libXmu libxkbcommon libxkbcommon-x11 \
|
||||
libpulse-simple libpulse libvulkan ld-linux-x86-64 crashhandler \
|
||||
libtcmalloc_minimal libanl ld-linux libthread_db
|
||||
for file in "$@"; do
|
||||
rm -f "${dir_tmp}"/bundle-libs/usr/lib/box64-*-linux-gnu/"${file}".so*
|
||||
done
|
||||
|
||||
# check broken symlinks
|
||||
if find "${dir_tmp}"/bundle-libs -type l ! -exec test -e {} \; -print | grep bundle-libs; then
|
||||
echo "E: Broken symlinks found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# create shared libraries (.so) symlinks
|
||||
# if multiple libraries of the same name exist, it will symlink the oldest version
|
||||
# e.g. libcurl-gnutls soname with versioned symbols (CURL_GNUTLS_3, CURL_GNUTLS_4)
|
||||
# libcurl-gnutls.so -> libcurl-gnutls.so.3
|
||||
# libcurl-gnutls.so.3 -> libcurl-gnutls.so.4
|
||||
# libcurl-gnutls.so.4 -> libcurl-gnutls.so.4.7.0
|
||||
# libcurl-gnutls.so.4.7.0
|
||||
for dir_lib in "${dir_tmp}"/bundle-libs/usr/lib/box64-*-linux-gnu; do
|
||||
cd "${dir_lib}"
|
||||
for lib in lib*.so*; do
|
||||
lib_base="$(echo "${lib}" | awk -F'.' '{print $1"."$2}')"
|
||||
if ! ls "${dir_lib}/${lib_base}" 2> /dev/null; then
|
||||
ln -s "${lib}" "${lib_base}"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# generate the bundle libraries archive
|
||||
tar -C "${dir_tmp}"/bundle-libs -czvf "${current_dir}"/box64-bundle-x86-libs.tar.gz .
|
||||
@@ -7,15 +7,15 @@ string(REGEX REPLACE "\n" ";" files "${files}")
|
||||
foreach(file ${files})
|
||||
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
|
||||
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
exec_program(
|
||||
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||
execute_process(
|
||||
COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
|
||||
RESULT_VARIABLE rm_retval
|
||||
OUTPUT_VARIABLE rm_out
|
||||
RETURN_VALUE rm_retval
|
||||
ERROR_VARIABLE rm_out
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(NOT "${rm_retval}" STREQUAL 0)
|
||||
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
|
||||
endif(NOT "${rm_retval}" STREQUAL 0)
|
||||
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
|
||||
endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach(file)
|
||||
Vendored
+254
-2
@@ -1,3 +1,255 @@
|
||||
box64 (0.4.0) unstable; urgency=low
|
||||
|
||||
This version added many important refactors: the opcode prefix decoder for Dynarec, libGL and Vulkan, the FSGSBASE support, making segments handling easier and faster.
|
||||
=> Improved compatibility accross all architecture, allowing more DRM protected game to run
|
||||
=> the prefix refactor helped removed lots of redundant source file, simplifying maintenance
|
||||
=> BOX32 is getting more and more stable, even if still not 100% ok. But Steam is more stable than before, runs on all architecture. And some gameoverlay UI works, on OpenGL games. gameoverlay (and fossilize) support for Vulkan is planned for later.
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Mon, 3 Jan 2026 10:30:33 -0100
|
||||
|
||||
box64 (0.3.8) unstable; urgency=low
|
||||
|
||||
This version introduce DynaCache, a disk cache for the generated native code. It's not enabled by default for now (but it will use cache file if present by default). It can dramaticaly speedup the load of program (try with linux factorio for example). This version also improve in the volatile metadata handling. There is a massive compatiblity improvment for box32 and on all dynarec in general too. And few more function wrapping...
|
||||
|
||||
=> DynaCache for faster loading of program, and avoid runtime hicups
|
||||
=> Batter box32 compatibility (much less "Out of Memory" error)
|
||||
=> Unity3D games on Wayland are working now
|
||||
=> Volatile Metadata fully supported and handled, making games like Starfield to just work.
|
||||
=> More work on AVX support for RV64 & LA64. LA64 almost there, while RV64 has Scalar only support (no hardware vector support yet for AVX)
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Mon, 10 Oct 2025 10:30:33 -0100
|
||||
|
||||
box64 (0.3.6) unstable; urgency=low
|
||||
|
||||
This version introduces wowbox64.dll for Hangover; the ability to use the Volatile Metadata of Windows executables for x64 wine; and some better x87/SSE/AVX handling
|
||||
|
||||
=> WowBox64 can be built directly from Box64 repo, and can be found in the CI artifacts also
|
||||
=> it also supports a subset of BOX64_XXXX settings, which can be set from command line or via a setting file ".box64rc" in the Wine prefix home
|
||||
=> Volatile Metadata, when present, allows only applying strong memory ordering when needed, as marked by the compiler, giving overall better performances
|
||||
=> The precision control bit of x87 is now handled, allowing some older games to run correctly
|
||||
=> More work has been done in the handling of precise NaN and Round handling in SSE & AVX opcodes
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 6 Jun 2025 10:30:33 -0100
|
||||
|
||||
box64 (0.3.4) unstable; urgency=low
|
||||
|
||||
* This version is Faster and more compatible
|
||||
* => The RV64 backend got faster and more stable, with lots of RVV 1.0 / xThreadVector support to emulate SSE/SSE2+ opcode (no AVX yet)
|
||||
* => On ARM64, Box64 now support more DRM types than before.
|
||||
* => BOX32 can run steam now. At least on ARM64 backend, it's still not working on RV64 and LA64 for now.
|
||||
* Please check CHAGELOG.md for more details
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 10 Mar 2025 10:30:33 -0100
|
||||
|
||||
box64 (0.3.2) unstable; urgency=low
|
||||
|
||||
* Introduced Box32 to run 32bits apps on 64bits OS
|
||||
* => Box32 is a build option for Box64, and is disabled by default
|
||||
* => Optionnal binfmt integration available for Box32
|
||||
* => Wrapped some basics libs, including graphics and sounds so a few games already works
|
||||
* => Work In Progress, many issues remain to be fixed, but some Linux games are playable
|
||||
* Introduced Native Flags. Can be controled with BOX64_DYNAREC_NATIVEFLAGS, but enabled by default
|
||||
* => Available on the 3 Dynarec backend, with different implementations
|
||||
* => ARM64 Dynarec build have all AVX/AVX2 extensions enabled by default
|
||||
* +> Can lead to large speedup on certain cases
|
||||
* Improved Strong Memory Model emulation, with better default options and a more efficiant emulation
|
||||
* Dynarec: RV64: using RVV (and XThreadVector) to implement SSEx opcodes, with some massive speedup when used!
|
||||
* Some bugfix and improvment in the Signal handler and internal memory tracking
|
||||
* Improvment to TRAP signal generation and Handling
|
||||
* Improved CPUID opcodes again, and the various virtual file in /proc that represent those data
|
||||
* Improved some x87 operations, like long double handling and infinity comparisons...
|
||||
* Dynarec: ARM64 fixes to a few opcodes
|
||||
* Dynarec: RV64 fixes to many opcodes
|
||||
* Dynarec: LA64 fixes to a few opcodes
|
||||
* Dynarec: RV64 fixes and improvments on LOCK prefixes opcodes
|
||||
* Dynarec: Many optimisation on some individual opcodes, an all 3 backends
|
||||
* WRAPPING: More libs and functions wrapped. Some wrapping fixes too
|
||||
* WREPPING: New wrapperhelper to help coding new wrapping & fixing/enhancing existing one
|
||||
* ElfLoader: Improved object fetching
|
||||
* New build profile for SD865 and ORYON
|
||||
* Changed the installation folder of x86 libs to avoid conflict with linux distro
|
||||
* Added a few syscalls
|
||||
* Some more Vulkan extensions wrapped
|
||||
* More work on build system, and github CI (generating WCP archive), with some fixes on the Android version (still not 100% operational)
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 6 Dec 2024 10:30:33 -0100
|
||||
|
||||
box64 (0.3.0) unstable; urgency=low
|
||||
|
||||
* AVX and AVX2 implemented, along with BMI1, BMI2, ADX, FMA, F16C and RDANDR extension!
|
||||
* Introduced BOX64_AVX env. var. to enable/disable AVX extension:
|
||||
* => BOX64_AVX=1 enable AVX, BMI1, F16C and VAES extension
|
||||
* => BOX64_AVX=2 also enable AVX2, BMI2, FMA, ADX,VPCLMULQDQ and RDRAND
|
||||
* Dynarec: Implemented most AVX/AVX2 and friends in ARM64 Dynarec (using only NEON, so available on all ARM64 CPU)
|
||||
* => ARM64 Dynarec build have all AVX/AVX2 extensions enabled by default
|
||||
* Improved CPUID opcodes, adding a few leaf, fixing same. Returnning an Haswell type of CPU now (was Pentium IV before)
|
||||
* Dynarec: Small optim in the emit_pf helper, on all 3 backends
|
||||
* Dynarec: ARM64 some fixes to a few opcodes
|
||||
* Dynarec: LA64 many new opcodes added, and fixes.
|
||||
* Dynarec: RV64 some new opcodes added, many fixes.
|
||||
* Dynarec: RV64 Adding some infrastructure to use RVV (if available) for SIMD emulation.
|
||||
* Dynarec: Many small changes and fixes around handling of x87, registers and internal jump.
|
||||
* WRAPPING: Added a workaround on SDL_GetThreadID to fix a race condition that was happening mostly on LA64 and broke many SDL games
|
||||
* WRAPPING: More libs and functions wrapped. Some wrapping fixes too (including a nasty error on some rare libGL functions)
|
||||
* WRAPPING: Wayland is now supported. Wine-wayland at least works now
|
||||
* Dynarec: LA64 improved LOCK CMPXCHG handling, and better 16Byte LOCK handling too (fixes many Unity3D games)
|
||||
* Dynarec: RV64 improved LOCK CMPXCHG handling
|
||||
* COSIM: Many fixes and improvment, to make BOX64_DYNAREC_TEST more usable
|
||||
* Detect when a Wine program use UnityPlayer.dll to atumaticaly use BOX64_DYNAREC_STRONGMEM=1 (unless it's already set), so more games just work
|
||||
* ElfLoader: Added a new type of relocation
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 9 Jul 2024 10:30:33 -0100
|
||||
|
||||
box64 (0.2.8) unstable; urgency=low
|
||||
|
||||
* Wrapping: More libs and function wrapping (gtk3, vulkan...)
|
||||
* Reworked X11 Callback handling, for better stability
|
||||
* Reworked exit and the load/unload of libs and symbol resolution
|
||||
* Some more profiles in box64rc
|
||||
* Better way to rename executable (including wine ones) so driver like mesa can apply the correct profile
|
||||
* Reworked memory managment in the Dynarec, limiting amount of dynamic allocation
|
||||
* Improved memory tracking and managment. Also introduce BOX64_MMAP32 to force 32bits compatible mmap for external libs (like mesa)
|
||||
* => Allow Vulkan drvier on Wine/WOW64 games to allocate 32bits compatible memory, allowing dxvk on 32bits.
|
||||
* Reworked memory managment in the Dynarec, limiting amount of dynamic allocation
|
||||
* Lots of improvments in x87 handling (virtual stack, rounding, ffree, etc.)
|
||||
* => should improve games stability
|
||||
* Dynarec: ARM64 some opcodes optimisation, especialy shift and rotation ones
|
||||
* Dynarec: RV64 lots of opcoded added.
|
||||
* => Some games on linux now have a good speed. Game on Wine are still a bit slow, and dxvk still have issues
|
||||
* Dynarec: Added Loogarch backend! Note that Loongarch are 16K pagesize platform by default.
|
||||
* => Linux games are running, and with good speed, especialy on 3A6000 platforms. Games on Wine are not working yet due to 16k pagesize limitation
|
||||
* Dynarec: Better handling of large block in the dynarec
|
||||
* Dynarec: Lots of improvments and fixes to BOX86_DYNAREC_CALLRET optimisation.
|
||||
* => It can be used on more software now, and combine with BOX64_DYNAREC_BOGBLOCKS 2 or 3 can gives some good speed boosts.
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 31 May 2024 17:30:33 -0100
|
||||
|
||||
box64 (0.2.6) unstable; urgency=low
|
||||
|
||||
* X64Libs: Updated libstdc++ & libgcc_s
|
||||
* X64Libs: Use x86_64 vrsion of libunwind (it's needed by wine)
|
||||
* Dynarec: More opcodes on ARM64 & RV64
|
||||
* Dynarec: Fixed some flags propagation issues inside blocks
|
||||
* Dynarec: Improved Strong Memory Model emulation, introducing a 3rd level
|
||||
* Dynarec: ARM64: reworked shift and bit opcodes flags handling
|
||||
* Dynarec: RV64: Many fixes, making Wow64 apps running
|
||||
* Dynarec: ARM64: Added support for SSE4.2 (with CRC32 if supported by CPU)
|
||||
* Dynarec: ARM64: Added support for SHA (with hardware support if CPU allows it)
|
||||
* Dynarec: ARM64: The CALLRET optimisation has been improved and is now default
|
||||
* CPU: Remoworked how INT, priviliged opcodes and teh Trace flags works
|
||||
* CPU: Added full support for SSE4.2
|
||||
* CPU: Added full support for SHA extension
|
||||
* ElfLoader: rework how elf memory is handled
|
||||
* Emulation: Added some more syscalls
|
||||
* Emulation: Better handling of Signal (also handling SIGMAX correctly)
|
||||
* Emulation: Better support for POKEUSER/PEEKUSER (helps Windows Unity games)
|
||||
* Wrapping: More libs and some fixes in function wrapping (gtk3, vulkan...)
|
||||
* Wrapping: Removed faked libunwind wrapping
|
||||
* Hardware: Added more profile, with support ADLink Ampere Altra, Qualcomm 8Gen3, and Pi5 machines
|
||||
* OS: Added profile to build for Android and Termux.
|
||||
* OS: New option to use mold for a high speed link
|
||||
* => More hadware support, more functions wrapped for an improve compatibity
|
||||
* => More CPU extension, with ARM64 hardware support when possible, and improved CALLRET optimisation for an improved speed of emulation
|
||||
* => Some work also to reduce the memory footprint
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 15 Dec 2023 17:30:33 -0100
|
||||
|
||||
box64 (0.2.4) unstable; urgency=low
|
||||
|
||||
* Added Dynarec for RISC-V
|
||||
* Added partial 32 bits support (WoW64 works)
|
||||
* Changed cpuid to display box64
|
||||
* Fixed steam, again
|
||||
* Improved hacked version for overridden malloc/free functions
|
||||
* More wrapped libs
|
||||
* More wrapped functions and syscalls
|
||||
* Reduced memory footprint
|
||||
* Added support for the BIND_NOW flags in ELF files
|
||||
* Added RTLD_NOLOAD support
|
||||
* Fixed some typos and general cleanup, again
|
||||
* Added a cosimulation mode (to compare the behaviour of the dynarec with the interpreter)
|
||||
* Added FASTNAN/FASTROUND handling for more opcodes
|
||||
* Better float/double/long double handling
|
||||
* Better dlopen/dlclose handling
|
||||
* More games in the rc file
|
||||
* Added BOX64_DYNAREC_MISSING to show only missing opcode, independantly of the log level
|
||||
* Added BOX64_RESERVE_HIGH to reserve addresses above 47bits
|
||||
* Improved multitreading support
|
||||
* Ukrainian translation of the README
|
||||
* => Dynarec now support RISC-V, large speedup on RISC-V 64, were games are now playable (like Stardew Valley on a Vision Five 2)
|
||||
* => Improved compatibility with more fixes in elf handling, more wrapped libs and functiond, more fixed opcodes and refined profile
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 10 Mar 2023 10:20:33 -0500
|
||||
|
||||
box64 (0.2.2) unstable; urgency=low
|
||||
|
||||
* Added a hacked version for overridden malloc/free functions, enabling libcef (and derivative) to work.
|
||||
* Added rcfile handling: box64 now read "/etc/box64.box64rc" and "~/.box64rc" and apply per process parameters
|
||||
* Added BOX64_DYNAREC_CALLRET to optimized CALL/RET opcode using semi-direct native CALL/RET (get more than 10% speedup)
|
||||
* Added BOX64_DYNAREC_FORWARD to allow bigger Dynarec block to be build (can get more then 30% of Speedup!)
|
||||
* Improved memory protection tracking and signal handling, again
|
||||
* Simplified mutex handling (faster, cleaner)
|
||||
* Reduce memory used by the memory tracking (memory almost divide by 4 is some critical use case)
|
||||
* Added d3dadaptor9 wrapping
|
||||
* More wrapped libs (especially on the gtk familly)
|
||||
* Improved/fixed some Syscall handling
|
||||
* Refactored Strong Memory Model emulation (faster and more accurate)
|
||||
* Added some more opcode to ARM64 Dynarec, and fixed some other
|
||||
* Some fixes to flags handling in the Dynarec on some special cases
|
||||
* Refactor library loading/unloading, with refcount.
|
||||
* Some special cases fixes for dlopen (fixes deadcells, maybe others too)
|
||||
* Improved mmap mapping, espcially with MAP_32BITS flag
|
||||
* More wrapped functions and syscalls
|
||||
* Lots of improvment in the Rounding of float & double (Dynarec and Interpreter), and proper handling of denormals when converting to/from 80 bits long double
|
||||
* Added specific suppport for RK3588 board (needed some hack in signal handling, probably due to the use of a non mainlined kernel)
|
||||
* More support on the RV64 port
|
||||
* More support to build under musl environment
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 10 Mar 2023 10:20:33 -0500
|
||||
|
||||
box64 (0.2.0) unstable; urgency=low
|
||||
|
||||
* Wrapped more vulkan function, dxvk 2.0 now works
|
||||
* Added support for overridden malloc/free functions
|
||||
* Refactor Dynarec memory management, reducing memory footprint (from 20% to 40% of Dynarec size)
|
||||
* Improved elf loader
|
||||
* Improved dlsym handling with RTLD_NEXT
|
||||
* Added BOX64_DYNAREC_SAFEFLAGS to allow finetuning Dynarec generated code handling of flags accross function calls and returns.
|
||||
* Added BOX64_BASH to setup x86_64 bash binary, so shell script can be run in x86_64 world
|
||||
* Added BOX64_ROLLING_LOG to have details log only on crash
|
||||
* Work on alignment for some of pthread structures
|
||||
* More wrapped libraries in the gtk family
|
||||
* Some fixes on the Dynarec x87 code (fixing a bunch of games like ut2004 or Piczle Puzzle)
|
||||
* Improved TLS Size handling (Unity3D games now works)
|
||||
* More PageSize Compile options
|
||||
* Improved execv family of function to have better box64 integration
|
||||
* Added support for wrapped libfuse so AppImage works
|
||||
* Adjusted the binfmt integration so AppImage are automaticaly picked
|
||||
* Improved FAudio, SDL2, GL (and more) wrapping
|
||||
* More wrapped libs, like libEGL.so, to helps emulated Qt4/5 libs to load
|
||||
* Improved Signal Handling and memory protection traking
|
||||
* Some signature fixes to some wrapped functions (in libc)
|
||||
* Added more syscalls
|
||||
* Added a lot of new opcodes to the ARM64 Dynarec
|
||||
* docs: add instructions for Debian-based Linux by @ryanfortner in #306
|
||||
* Fix typos and arch type string by @archanox in #321
|
||||
* Fix grammar by @Jai-JAP in #326
|
||||
* Enable 64k page size by @martinmanyhats in #334
|
||||
* Align address when call mprotect by @wannacu in #336
|
||||
* Add wrapped functions needed for 'ls -l'. by @stiltr in #294
|
||||
* add 18.04 tegra X1 github actions by @theofficialgman in #345
|
||||
* change order of matrix (to preview better under checkmark dropdown by @theofficialgman in #346
|
||||
* Backport SDL_DYNAPI_entry wrapper from box86. by @JohnnyonFlame in #374
|
||||
* Add SW64 base support by @wannacu in #382
|
||||
* fix overzealous replace in wrappers pathnames by @NobodyNada in #415
|
||||
* Create X64WINE.md by @WheezyE in #423
|
||||
* src: asm: Rename lr & fp registers to their x-equivalents by @fredldotme in #426
|
||||
* Malloc override by @ptitSeb in #437
|
||||
* Remove dynablocklist by @ptitSeb in #438
|
||||
* Fix Pkgbuilds by @Jai-JAP in #452
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Thu, 17 Nov 2022 11:20:33 -0500
|
||||
|
||||
box64 (0.1.8) unstable; urgency=low
|
||||
|
||||
* Added an option to get generated -NAN on SSE2 operation
|
||||
@@ -23,7 +275,7 @@ box64 (0.1.8) unstable; urgency=low
|
||||
* Don't quit on unsupported syscall, return -1 / ENOSYS error
|
||||
* Added some more Syscall
|
||||
* Wrapped Vulkan library. Vulkan and dxvk now supported!
|
||||
* Support building on PPC64LE (interpretor only)
|
||||
* Added support for Risc-V (interpretor only)
|
||||
* Support building on PPC64LE (interpreter only)
|
||||
* Added support for Risc-V (interpreter only)
|
||||
|
||||
-- Sebastien Chevalier <[email protected]> Tue, 18 Jan 2022 11:20:33 -0500
|
||||
Vendored
+15
-2
@@ -6,7 +6,20 @@
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||
-DARM_DYNAREC=1
|
||||
-DARM_DYNAREC=1 \
|
||||
-DNOGIT=1
|
||||
|
||||
override_dh_shlibdeps:
|
||||
dh_shlibdeps --exclude=libgcc_s.so.1 --exclude=libpng12.so.0 --exclude=libstdc++.so.6
|
||||
dh_shlibdeps --exclude=libgcc_s.so.1 \
|
||||
--exclude=libpng12.so.0 \
|
||||
--exclude=libstdc++.so.5 \
|
||||
--exclude=libstdc++.so.6 \
|
||||
--exclude=libmbedcrypto.so.7 \
|
||||
--exclude=libssl.so.1.1 \
|
||||
--exclude=libunwind.so.8 \
|
||||
--exclude=libmbedtls.so.14 \
|
||||
--exclude=libcrypto.so.1.1 \
|
||||
--exclude=libmbedx509.so.1 \
|
||||
--exclude=libcrypto.so.1.0.0 \
|
||||
--exclude=libssl.so.1.0.0 \
|
||||
--exclude=box64-bash
|
||||
@@ -0,0 +1,78 @@
|
||||
# Bundling x86 Libraries
|
||||
|
||||
The script `box64-bundle-x86-libs.sh` is provided to download, extract, and re-bundle x86_64 and x86 libraries for use with Box64/Box32 and Box86. These libraries improve Box emulation. This bundle provides a much smaller size compared to using a full root file system of an operating system.
|
||||
|
||||
## Usage
|
||||
|
||||
### Administrator
|
||||
|
||||
Install required dependencies for the bundle script.
|
||||
|
||||
- Arch Linux
|
||||
```
|
||||
sudo pacman -S -y -u
|
||||
sudo pacman -S binutils coreutils curl rpm-tools tar zstd
|
||||
```
|
||||
- Debian
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get install binutils coreutils curl rpm2cpio tar zstd
|
||||
```
|
||||
- Fedora
|
||||
```
|
||||
sudo dnf install binutils coreutils curl tar zstd
|
||||
```
|
||||
|
||||
Run `box64-bundle-x86-libs.sh`. This will create two archives:
|
||||
- `box64-bundle-x86-libs.tar.gz` = All of the extracted library files in the directory structure of `usr/lib/box64-i386-linux-gnu` and `usr/lib/box64-x86_64-linux-gnu`.
|
||||
- `box64-bundle-x86-pkgs.tar.gz` = All of the Linux distribution packages used to extract the library files. This is only created for preservation purposes and is otherwise unused.
|
||||
|
||||
Extract the library archive. Box will automatically search these paths for library files to emulate.
|
||||
|
||||
```
|
||||
sudo tar --extract --no-same-owner --file box64-bundle-x86-libs.tar.gz --directory /
|
||||
```
|
||||
|
||||
### Developer
|
||||
|
||||
Add new packages to the `box64-bundle-x86-libs.csv` file in the format of `<PACKAGE_URL>,<SHA256_CHECKSUM>`.
|
||||
|
||||
Supported packages:
|
||||
- DEB (Debian)
|
||||
- EOPKG (Solus)
|
||||
- RPM (Fedora)
|
||||
- XBPS (Void Linux)
|
||||
|
||||
Preference of operating system packages that provide a library:
|
||||
1. RPMs from AlmaLinux 9 provide 10 years of updates.
|
||||
2. DEBs from Debian 11 provide 5 years of updates.
|
||||
3. EOPKG from Solus provide old variants of obscure 32-bit libraries.
|
||||
4. XBPS from Void Linux provide updated variants of obscure 32-bit libraries.
|
||||
5. Other (whereever a library is packaged)
|
||||
|
||||
Some essential library files will never be emulated (only wrapped) and should not be bundled. This includes glibc, OpenGL, Vulkan, and X11/Xorg libraries. The full list can be found [in the library source code](https://github.com/ptitSeb/box64/blob/v0.3.6/src/librarian/library.c#L433). Other libraries with lots of dependencies, such as GTK, require all dependencies to be installed for emulation to work. This becomes dependency hell and should be avoided.
|
||||
|
||||
For finding package names that contian a specific library file, use the [pkgs.org website](https://pkgs.org/). Otherwise, use one of these package manager commands on a x86_64 Linux distribution:
|
||||
- DEB
|
||||
- `apt-file <LIBRARY_FILE>`
|
||||
- EOPKG
|
||||
- Does not support file search. Use pkgs.org instead.
|
||||
- RPM
|
||||
- `dnf provides "*/<LIBRARY_FILE>*"`
|
||||
- XBPS
|
||||
- `xbps-query --repository --ownedby <LIBRARY_FILE>`
|
||||
|
||||
Once the package name is found, find the exact URL for downloading it.
|
||||
- DEB = Explore "main" and "contrib". Search for packages with the name "deb11" in it. Use the "amd64.deb" and "i386.deb" packages.
|
||||
- https://archive.debian.org/debian/pool/
|
||||
- EOPKG = Use the "`<VERSION>-<RELEASE>-x86_64.eopkg`" and "`32bit-<VERSION>-<RELEASE>-x86_64.eopkg`" packages.
|
||||
- https://cdn.getsol.us/repo/shannon/
|
||||
- RPM = Navigate to the "`<MAJOR>.<MINOR>`" version directory first. Then explore "AppStream" and "BaseOS". Use the "x86_64.rpm" and "i686.rpm" packages.
|
||||
- https://repo.almalinux.org/almalinux/
|
||||
- Enterprise Linux (EL) distributions, such as AlamaLinux, sometimes are missing 32-bit packages. Use the Fedora 34 [update](https://archives.fedoraproject.org/pub/archive/fedora/linux/updates/34/Everything/x86_64/Packages/) and [release](https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/34/Everything/x86_64/os/Packages/) archives for compatible packages with EL 9.
|
||||
- XBPS = There are too many files in the repository to display on a web browser. Use pkgs.org instead to find the exact URL for downloading it.
|
||||
- https://repo-default.voidlinux.org/current/
|
||||
|
||||
Download the package and then find the checksum with the `sha256sum` command.
|
||||
|
||||
Major Linux distributions such as AlmaLinux and Debian provide archives of packages. Most rolling distributions such as Solus and Void Linux do not (one exception is Arch Linux which has the [Arch Linux Archive (ALA)](https://wiki.archlinux.org/title/Arch_Linux_Archive)). In those cases, use the [Internet Archive](https://web.archive.org/) to archive any rolling release package used by Box by using the "Save Page Now" feature. If the error "Save Page Now browser crashed" appears, it can be safely ignored. The archive will still have been saved.
|
||||
+375
-5
@@ -1,3 +1,373 @@
|
||||
v0.4.0
|
||||
======
|
||||
|
||||
Highlights:
|
||||
* This version added many important refactors: the opcode prefix decoder for Dynarec, libGL and Vulkan, the FSGSBASE support, making segments handling easier and faster.
|
||||
=> Improved compatibility accross all architecture, allowing more DRM protected game to run
|
||||
=> the prefix refactor helped removed lots of redundant source file, simplifying maintenance
|
||||
=> BOX32 is getting more and more stable, even if still not 100% ok. But Steam is more stable than before, runs on all architecture. And some gameoverlay UI works, on OpenGL games. gameoverlay (and fossilize) support for Vulkan is planned for later.
|
||||
|
||||
Version summary:
|
||||
|
||||
* Added new BOX64_ARCH to have settings specific to one of the supported cpu architecture (arm64, rv64, la64)
|
||||
* Added BAD_PKILL build option, to workaround missing non-mandatory behaviour of pthread_kill (needed on LA64)
|
||||
* Improved the handling of invalid opcodes
|
||||
* Refactored handling of Selector, Segments and TLS data
|
||||
* Added FSGSBASE cpu extension
|
||||
* Added support for IFUNC relocation type to ElfLoader (64bits & 32bits)
|
||||
* Refactored some internal behaviour to get better Interpreter only build
|
||||
* Added BOX64_STEAM_VULKAN to have Vulkan renderer option injected when steamwebhelper is called
|
||||
* Introduce BOX64_PYTHON3 to force using an X64 version of python (and use that on arm64 steam)
|
||||
* Fixed signal handling when using Wine v10.19+
|
||||
* Added some cache to customMalloc / customFree internal functions
|
||||
* Some refactor on the cpuid helper function
|
||||
* Wrapping: most Wayland listener for wider compatibility
|
||||
* Wrapping: refactored libGL & libVulkan wrapping
|
||||
* Wrapping: more wrapped functions, reworked some existing one with wrapperhelper
|
||||
* Wrapping: Added a few more wrapped libs
|
||||
* Wrapping: Better handling of RTLD_NEXT in dlsym function call
|
||||
* Wrapping: Reworked wrapping of pthread_one (on Box32 too)
|
||||
* Wrapping: a few new syscall implemented
|
||||
* Wrapping: Make BOX64_EMULATED_LIBS to also affect gstreamer hacked loading of plugins
|
||||
* Wrapping: BOX32: more wrapped function and some fixes to existing ones
|
||||
* Wrapping: BOX32: a few new syscall implemented
|
||||
* Interpreter: Added LOCK prefix to the generic opcode prefix handling
|
||||
* Interpreter: A few fixes to existing opcodes
|
||||
* Interpreter: Added F3 0F 40..4F opcodes
|
||||
* Dynarec: Refactored HotPages Detection & Handling
|
||||
* Dynarec: Introduced DYNAREC_PURGE to allow purging of old (unused?) Dynarec block and save memory
|
||||
* Dynarec: Refactored prefix decoding, similar to the Interpreter
|
||||
* Dynarec: ARM64: Added detection of loops and preload of xmm/ymm regs before entering
|
||||
* Dynarec: ARM64: Refactored the handling of deferred flags
|
||||
* Dynarec: ARM64: A few optimisation in some existing opcodes
|
||||
* DYnarec: ARM64: Some fixes to existing opcodes
|
||||
* Dynarec: LA64: Added x87 opcodes
|
||||
* Dynarec: LA64: Added a few missing LOCK prefixed opcodes
|
||||
* Dynarec: LA64: Added some more shift/roll opcodes
|
||||
* Dynarec: LA64: Added support for native CRC opcodes
|
||||
* Dynarec: LA64: Many fixes to some AVX opcodes
|
||||
* Dynarec: LA64: Various fixes to some opcodes
|
||||
* Dynarec: LA64: Addes a few 66 prefixed opcodes
|
||||
* Dynarec: LA64: Added some "simple wrapper" support (allowing direct call of wrapped functions)
|
||||
* Dynarec: LA64: Added some more native flags optimisations
|
||||
* Dynarec: LA64: optimized REP MOVSB
|
||||
* Dynarec: RV64: Fixed/Fine tunning flags on existing opcodes
|
||||
* Dynarec: RV64: Various fixes to some opcodes
|
||||
|
||||
v0.3.8
|
||||
======
|
||||
|
||||
Highlights:
|
||||
|
||||
* This version introduce DynaCache, a disk cache for the generated native code. It's not enabled by default for now (but it will use cache file if present by default). It can dramaticaly speedup the load of program (try with linux factorio for example). This version also improve in the volatile metadata handling. There is a massive compatiblity improvment for box32 and on all dynarec in general too. And few more function wrapping...
|
||||
|
||||
=> DynaCache for faster loading of program, and avoid runtime hicups
|
||||
=> Batter box32 compatibility (much less "Out of Memory" error)
|
||||
=> Unity3D games on Wayland are working now
|
||||
=> Volatile Metadata fully supported and handled, making games like Starfield to just work.
|
||||
=> More work on AVX support for RV64 & LA64. LA64 almost there, while RV64 has Scalar only support (no hardware vector support yet for AVX)
|
||||
|
||||
Version summary:
|
||||
|
||||
* Improved and fixed memory tracking
|
||||
* Improved volatile metadata handling, and some light refactor on StrongMem emulation
|
||||
* Improved handling of TF flag
|
||||
* DynaCache: Introducing a way to cache on disk native generated code for faster startup time on subsequent release
|
||||
* DynaCache: Support for all 3 backends ARM64, RV64 & LA64
|
||||
* Interpreter: refactor opcodes decoding to have prefixes handled in a generic way
|
||||
* Interpreter: many small fixes
|
||||
* Dynarec: some optimisations in the jump table, to remove one memory fetch on each jump
|
||||
* Dynarec: create infrastructure to be able to change easily the reg mapping
|
||||
* Dynarec: optimised defered flag handling to limit cases where UpdateFlags is needed
|
||||
* Dynarec: Introduced BOX64_DYNAREC_NOHOTPAGE to disable detection of hotpages
|
||||
* Dynarec: ARM64: A few more opcode added
|
||||
* Dynarec: ARM64: Some small fixes and better handling of undefined behavior in opcodes, as well as undefined opcodes
|
||||
* Dynarec: ARM64: Implemented a Dynarec version of UpdateFlags, for improved performances
|
||||
* Dynarec; ARM64: Fixes/Improved SSE_FLUSHTO0 support
|
||||
* Dynarec: LA64: Added support for AVX (& friends) opcodes. Still need some debugging so AVX still disabled by default on LA64
|
||||
* Dynarec: LA64: Changed register mapping to be closer to the x86_64 ABI
|
||||
* Dynarec: LA64: RV64: Added limited support to SSE_FLUSHTO0
|
||||
* Dynarec: RV64: Many fixes and improvments for MMX opcodes
|
||||
* Dynarec: RV64: many Scalar version of AVX opcodes added
|
||||
* Dynarec: Many fixes to various OpCodes, on all 3 backends
|
||||
* WowBox64: Added minimal runtime, improved overall stability
|
||||
* BOX32: Wrapper: many new functions added, plus many fixes
|
||||
* BOX32: Improved memory hadnling, using 32bits personality and other tunning to get more reliable 32bits memory allocations
|
||||
* BOX64: Wrapper: some more wrapped functions added, including wayland (for Unity games on Wayland) and vulkan (more extensions)
|
||||
* BOX64: Wrapper: improved handling of some VarArg wrapped functions on non-ARM64 backend
|
||||
* RCFILE: Fixed MAXCPU not working properly with Wine programs
|
||||
* RCFILE: Generic Setup profile refined, and more games profile added
|
||||
* Trace: Added support for current libZydis
|
||||
|
||||
v0.3.6
|
||||
======
|
||||
|
||||
Highlights:
|
||||
|
||||
* This version introduces wowbox64.dll for Hangover; the ability to use the Volatile Metadata of Windows executables for x64 wine; and some better x87/SSE/AVX handling
|
||||
|
||||
=> WowBox64 can be built directly from Box64 repo, and can be found in the CI artifacts also
|
||||
=> it also supports a subset of BOX64_XXXX settings, which can be set from command line or via a setting file ".box64rc" in the Wine prefix home
|
||||
=> Volatile Metadata, when present, allows only applying strong memory ordering when needed, as marked by the compiler, giving overall better performances
|
||||
=> The precision control bit of x87 is now handled, allowing some older games to run correctly
|
||||
=> More work has been done in the handling of precise NaN and Round handling in SSE & AVX opcodes
|
||||
|
||||
Version summary:
|
||||
|
||||
* Added/fixed some Syscalls, helping Go programs
|
||||
* Wrapper: more functions added, and some fixes too. Vulkan is 1.4 now, among other things
|
||||
* Wrapper: Added a few more wrapped libs (like some avcodec and friends)
|
||||
* Improve internal memory allocator (with a dedicated allocator for small memory allocations), and fixed some issues around it
|
||||
* Improve internal mmaped file tracking
|
||||
* Box32: Some small refactoring around memory management and internal memory allocations
|
||||
* Box32: More functions wrapped
|
||||
* Box32: More libraries wrapped
|
||||
* ARM64: Added support for Atomic extension in many internal functions (not related to Dynarec).
|
||||
* ARM64: Added support for CRC2 extension for internal CRC functions
|
||||
* Interp: A few fixes to some opcodes, and better NAN handling on some selected SSE/AVX opcodes
|
||||
* Interp: Added a few opcodes with exotic prefixes
|
||||
* Dynarec: Introcude BOX64_DYNAREC_ROUND=2 to handle x87 precision control bit (ARM64 and RV64, LA64 still doesn't handle x87 yet)
|
||||
* Dynarec: Some small optimizations on Strongmem emulation, making it more efficient
|
||||
* Dynarec: Some speed optimizations on code that do SMC and waiting slot
|
||||
* Dynarec: Added CALLRET=2 to improve call/ret optimization compatibility with SMC code
|
||||
* Dynarec: ARM64: Various optimizations and fixes on some opcodes, especially AVX ones
|
||||
* Dynarec: ARM64: Added missing FASTNAN=0 handling on some SSE/AVX opcodes
|
||||
* Dynarec: ARM64: Added some exotic prefixed opcodes
|
||||
* Dynarec: ARM64: Avoid purging XMM/YMM register on intra-block loop if possible
|
||||
* Dynarec: RV64: Many fixes and improvments around x87 emulation
|
||||
* Dynarec: RV64: Added some more missing opcodes, especially some LOCK prefixed ones and many MMX ones
|
||||
* Dynarec: RV64: Various fixes on some existing opcodes
|
||||
* Dynarec: RV64: Improved nativeflags handling, allowing for more cases to use it
|
||||
* Dynarec: LA64: Added some more opcodes and MMX handling
|
||||
* Dynarec: LA64: Various fixes to some existing opcodes
|
||||
* Android: Improved signal handling, structure alignment, and transformation
|
||||
* WowBox64: Created the dll, with RcFile, Env. Var. handling and log printout (both ARM64 Dynarec and Interpreter available)
|
||||
* Cosim: Various fixes and improvements to limit false negatives and improve readability of logs
|
||||
* RcFile: A few fixes for some values that would be ignored
|
||||
|
||||
v0.3.4
|
||||
======
|
||||
* This version is Faster and more compatible:
|
||||
=> The RV64 backend got faster and more stable, with lots of RVV 1.0 / xThreadVector support to emulate SSE/SSE2+ opcode (no AVX yet)
|
||||
=> On ARM64, Box64 now support more DRM types than before.
|
||||
=> BOX32 can run steam now. At least on ARM64 backend, it's still not working on RV64 and LA64 for now.
|
||||
* Added support to emulate Windows Syscall (needs Proton and a 48bits address space for now)
|
||||
* Added BOX64_DYNAREC_DIRTY to have a faster (but less safe) way to handle code that write in it's current page
|
||||
* Added a few rarely used opcodes
|
||||
* Added experimental support for GDBJIT, that allow an x86/x86_64 program to be debugged on ARM/RV64/LA64 platform with x86 regs and opcode view (might generate a lot of file tho)
|
||||
* Added support for Perf tools in a similar way if GDBJIT, to have an x86 fine view of the performances
|
||||
* Reworked undefined flags for common operations, to be similar to real CPU
|
||||
* Reworked cpuid handling, adding BOX64_CPUTYPE support to select Intel/AMD emulation (no 3DNow! support on AMD for now)
|
||||
* Reworked ucontext link to be closer to the real thing (and make it more simple)
|
||||
* Improved memory traking, file descriptor backed memory map, and detect wine loaded dll
|
||||
* Introduced settings per library and dll (mostly for Dynarec)
|
||||
* Wrapper: More functions addes, and some fixes too
|
||||
* BOX32: Many fixes around pthreads wrapping
|
||||
* BOX32: More functions wrapped.
|
||||
* BOX32: More libraies wrapped.
|
||||
* BOX32: Some reworks on how high memory (higher than 32bits) is masked, and can be used for Dynarec blocks.
|
||||
* Dynarec: The usual batch of fixes, improvments and opcodes additions on all 3 supported backend
|
||||
* Dynarec: Some fixes to NativeFlags handling, both on ARM64 and RV64
|
||||
* Dynarec: Added optimized REP MOVSB (expected for default CPUTYPE=0, according to new cpuid return)
|
||||
* Dynarec: LA64: more opcoded addes, using hardware extensions like AES
|
||||
* Dynarec: RV64: More work on using RVV 1.0 and xTheadVector extension to emulate SSE/SSE2+ opcodes
|
||||
* Dynarec: RV64: Added informations on flags when building blocks, to be used when a signal happens to rebuild a x86 context more accurate
|
||||
* Dynarec: ARM64: Reworked undefined flags for common operations, to be similar to real CPU
|
||||
* Dynarec: ARM64: Added informations on flags and xmm/ymm/x87 register when building blocks, to be used when a signal happens to rebuild a x86 context 100% accurate
|
||||
* TRACE: Reworked how trace for wrapped function call is printed.
|
||||
* TRACE: Reworked logs to prefix each line with a (optionaly colored) BOX32 or BOX64
|
||||
* COSIM: Some rework on cosim to limit false negative, especialy when handling x87 operations
|
||||
* LA64: Added limited support for ABI 1.0
|
||||
* CI: github CI now also generate MiceWine .rat archive, along with Winlator .wcp archive and regular linux builds.
|
||||
* RCFile: Added many new games profiles (both for speed improvment or for compatibilty)
|
||||
|
||||
v0.3.2
|
||||
======
|
||||
* Introduced Box32 to run 32bits apps on 64bits OS
|
||||
=> Box32 is a build option for Box64, and is disabled by default
|
||||
=> Optionnal binfmt integration available for Box32
|
||||
=> Wrapped some basics libs, including graphics and sounds so a few games already works
|
||||
=> Work In Progress, many issues remain to be fixed, but some Linux games are playable
|
||||
* Introduced Native Flags. Can be controled with BOX64_DYNAREC_NATIVEFLAGS, but enabled by default
|
||||
=> Available on the 3 Dynarec backend, with different implementations
|
||||
=> ARM64 Dynarec build have all AVX/AVX2 extensions enabled by default
|
||||
+> Can lead to large speedup on certain cases
|
||||
* Improved Strong Memory Model emulation, with better default options and a more efficiant emulation
|
||||
* Dynarec: RV64: using RVV (and XThreadVector) to implement SSEx opcodes, with some massive speedup when used!
|
||||
* Some bugfix and improvment in the Signal handler and internal memory tracking
|
||||
* Improvment to TRAP signal generation and Handling
|
||||
* Improved CPUID opcodes again, and the various virtual file in /proc that represent those data
|
||||
* Improved some x87 operations, like long double handling and infinity comparisons...
|
||||
* Dynarec: ARM64 fixes to a few opcodes
|
||||
* Dynarec: RV64 fixes to many opcodes
|
||||
* Dynarec: LA64 fixes to a few opcodes
|
||||
* Dynarec: RV64 fixes and improvments on LOCK prefixes opcodes
|
||||
* Dynarec: Many optimisation on some individual opcodes, an all 3 backends
|
||||
* WRAPPING: More libs and functions wrapped. Some wrapping fixes too
|
||||
* WREPPING: New wrapperhelper to help coding new wrapping & fixing/enhancing existing one
|
||||
* ElfLoader: Improved object fetching
|
||||
* New build profile for SD865 and ORYON
|
||||
* Changed the installation folder of x86 libs to avoid conflict with linux distro
|
||||
* Added a few syscalls
|
||||
* Some more Vulkan extensions wrapped
|
||||
* More work on build system, and github CI (generating WCP archive), with some fixes on the Android version (still not 100% operational)
|
||||
|
||||
v0.3.0
|
||||
======
|
||||
* AVX and AVX2 implemented, along with BMI1, BMI2, ADX, FMA, F16C and RDANDR extension!
|
||||
* Introduced BOX64_AVX env. var. to enable/disable AVX extension:
|
||||
=> BOX64_AVX=1 enable AVX, BMI1, F16C and VAES extension
|
||||
=> BOX64_AVX=2 also enable AVX2, BMI2, FMA, ADX,VPCLMULQDQ and RDRAND
|
||||
* Dynarec: Implemented most AVX/AVX2 and friends in ARM64 Dynarec (using only NEON, so available on all ARM64 CPU)
|
||||
=> ARM64 Dynarec build have all AVX/AVX2 extensions enabled by default
|
||||
* Improved CPUID opcodes, adding a few leaf, fixing same. Returnning an Haswell type of CPU now (was Pentium IV before)
|
||||
* Dynarec: Small optim in the emit_pf helper, on all 3 backends
|
||||
* Dynarec: ARM64 some fixes to a few opcodes
|
||||
* Dynarec: LA64 many new opcodes added, and fixes.
|
||||
* Dynarec: RV64 some new opcodes added, many fixes.
|
||||
* Dynarec: RV64 Adding some infrastructure to use RVV (if available) for SIMD emulation.
|
||||
* Dynarec: Many small changes and fixes around handling of x87, registers and internal jump.
|
||||
* WRAPPING: Added a workaround on SDL_GetThreadID to fix a race condition that was happening mostly on LA64 and broke many SDL games
|
||||
* WRAPPING: More libs and functions wrapped. Some wrapping fixes too (including a nasty error on some rare libGL functions)
|
||||
* WRAPPING: Wayland is now supported. Wine-wayland at least works now
|
||||
* Dynarec: LA64 improved LOCK CMPXCHG handling, and better 16Byte LOCK handling too (fixes many Unity3D games)
|
||||
* Dynarec: RV64 improved LOCK CMPXCHG handling
|
||||
* COSIM: Many fixes and improvment, to make BOX64_DYNAREC_TEST more usable
|
||||
* Detect when a Wine program use UnityPlayer.dll to atumaticaly use BOX64_DYNAREC_STRONGMEM=1 (unless it's already set), so more games just work
|
||||
* ElfLoader: Added a new type of relocation
|
||||
|
||||
v0.2.8
|
||||
======
|
||||
* Wrapping: More libs and function wrapping (gtk3, vulkan...)
|
||||
* Reworked X11 Callback handling, for better stability
|
||||
* Reworked exit and the load/unload of libs and symbol resolution
|
||||
* Some more profiles in box64rc
|
||||
* Better way to rename executable (including wine ones) so driver like mesa can apply the correct profile
|
||||
* Reworked memory managment in the Dynarec, limiting amount of dynamic allocation
|
||||
* Improved memory tracking and managment. Also introduce BOX64_MMAP32 to force 32bits compatible mmap for external libs (like mesa)
|
||||
=> Allow Vulkan drvier on Wine/WOW64 games to allocate 32bits compatible memory, allowing dxvk on 32bits.
|
||||
* Reworked memory managment in the Dynarec, limiting amount of dynamic allocation
|
||||
* Lots of improvments in x87 handling (virtual stack, rounding, ffree, etc.)
|
||||
=> should improve games stability
|
||||
* Dynarec: ARM64 some opcodes optimisation, especialy shift and rotation ones
|
||||
* Dynarec: RV64 lots of opcoded added.
|
||||
=> Some games on linux now have a good speed. Game on Wine are still a bit slow, and dxvk still have issues
|
||||
* Dynarec: Added Loogarch backend! Note that Loongarch are 16K pagesize platform by default.
|
||||
=> Linux games are running, and with good speed, especialy on 3A6000 platforms. Games on Wine are not working yet due to 16k pagesize limitation
|
||||
* Dynarec: Better handling of large block in the dynarec
|
||||
* Dynarec: Lots of improvments and fixes to BOX86_DYNAREC_CALLRET optimisation.
|
||||
=> It can be used on more software now, and combine with BOX64_DYNAREC_BOGBLOCKS 2 or 3 can gives some good speed boosts.
|
||||
|
||||
v0.2.6
|
||||
======
|
||||
* X64Libs: Updated libstdc++ & libgcc_s
|
||||
* X64Libs: Use x86_64 vrsion of libunwind (it's needed by wine)
|
||||
* Dynarec: More opcodes on ARM64 & RV64
|
||||
* Dynarec: Fixed some flags propagation issues inside blocks
|
||||
* Dynarec: Improved Strong Memory Model emulation, introducing a 3rd level
|
||||
* Dynarec: ARM64: reworked shift and bit opcodes flags handling
|
||||
* Dynarec: RV64: Many fixes, making Wow64 apps running
|
||||
* Dynarec: ARM64: Added support for SSE4.2 (with CRC32 if supported by CPU)
|
||||
* Dynarec: ARM64: Added support for SHA (with hardware support if CPU allows it)
|
||||
* Dynarec: ARM64: The CALLRET optimisation has been improved and is now default
|
||||
* CPU: Remoworked how INT, priviliged opcodes and teh Trace flags works
|
||||
* CPU: Added full support for SSE4.2
|
||||
* CPU: Added full support for SHA extension
|
||||
* ElfLoader: rework how elf memory is handled
|
||||
* Emulation: Added some more syscalls
|
||||
* Emulation: Better handling of Signal (also handling SIGMAX correctly)
|
||||
* Emulation: Better support for POKEUSER/PEEKUSER (helps Windows Unity games)
|
||||
* Wrapping: More libs and some fixes in function wrapping (gtk3, vulkan...)
|
||||
* Wrapping: Removed faked libunwind wrapping
|
||||
* Hardware: Added more profile, with support ADLink Ampere Altra, Qualcomm 8Gen3, and Pi5 machines
|
||||
* OS: Added profile to build for Android and Termux.
|
||||
* OS: New option to use mold for a high speed link
|
||||
=> More hadware support, more functions wrapped for an improve compatibity
|
||||
=> More CPU extension, with ARM64 hardware support when possible, and improved CALLRET optimisation for an improved speed of emulation
|
||||
=> Some work also to reduce the memory footprint
|
||||
|
||||
v0.2.4
|
||||
======
|
||||
* Added Dynarec for RISC-V
|
||||
* Added partial 32 bits support (WoW64 works)
|
||||
* Changed cpuid to display box64
|
||||
* Fixed steam, again
|
||||
* Improved hacked version for overridden malloc/free functions
|
||||
* More wrapped libs
|
||||
* More wrapped functions and syscalls
|
||||
* Reduced memory footprint
|
||||
* Added support for the BIND_NOW flags in ELF files
|
||||
* Added RTLD_NOLOAD support
|
||||
* Fixed some typos and general cleanup, again
|
||||
* Added a cosimulation mode (to compare the behaviour of the dynarec with the interpreter)
|
||||
* Added FASTNAN/FASTROUND handling for more opcodes
|
||||
* Better float/double/long double handling
|
||||
* Better dlopen/dlclose handling
|
||||
* More games in the rc file
|
||||
* Added BOX64_DYNAREC_MISSING to show only missing opcode, independantly of the log level
|
||||
* Added BOX64_RESERVE_HIGH to reserve addresses above 47bits
|
||||
* Improved multitreading support
|
||||
* Ukrainian translation of the README
|
||||
=> Dynarec now support RISC-V, large speedup on RISC-V 64, were games are now playable (like Stardew Valley on a Vision Five 2)
|
||||
=> Improved compatibility with more fixes in elf handling, more wrapped libs and functiond, more fixed opcodes and refined profile
|
||||
|
||||
v0.2.2
|
||||
======
|
||||
* Added a hacked version for overridden malloc/free functions, enabling libcef (and derivative) to work.
|
||||
=> Steam Large mode and new BigPicture are working
|
||||
=> Heroic Launcher is working
|
||||
* Added rcfile handling: box64 now read `/etc/box64.box64rc` and `~/.box64rc` and apply per process parameters
|
||||
=> Every program can be finetuned, for speed or just to make them work
|
||||
* Added BOX64_DYNAREC_CALLRET to optimized CALL/RET opcode using semi-direct native CALL/RET (get more than 10% speedup)
|
||||
* Added BOX64_DYNAREC_FORWARD to allow bigger Dynarec block to be build (can get more then 30% of Speedup!)
|
||||
* Improved memory protection tracking and signal handling, again
|
||||
* Box64 now return a custom name for the CPU instal of P4, build with Box64 and the cpu name it's running on
|
||||
* Simplified mutex handling (faster, cleaner)
|
||||
* Reduce memory used by the memory tracking (memory almost divide by 4 is some critical use case)
|
||||
* Added d3dadapter9 wrapping
|
||||
=> gallium nine is now supported on box64 too
|
||||
* More wrapped libs (especially on the gtk familly)
|
||||
* Improved/fixed some Syscall handling
|
||||
* Refactored Strong Memory Model emulation (faster and more accurate)
|
||||
* Added some more opcode to ARM64 Dynarec, and fixed some other
|
||||
* Some fixes to flags handling in the Dynarec on some special cases
|
||||
* Refactor library loading/unloading, with refcount.
|
||||
* Some special cases fixes for dlopen (fixes deadcells, maybe others too)
|
||||
* Improved mmap mapping, espcially with MAP_32BITS flag
|
||||
* More wrapped functions and syscalls
|
||||
* Lots of improvment in the Rounding of float & double (Dynarec and Interpreter), and proper handling of denormals when converting to/from 80 bits long double
|
||||
* Added specific suppport for RK3588 board (needed some hack in signal handling, probably due to the use of a non mainlined kernel)
|
||||
* More support on the RV64 port
|
||||
* More support to build under musl environment
|
||||
|
||||
v0.2.0
|
||||
======
|
||||
* Wrapped more vulkan function, dxvk 2.0 now works
|
||||
* Added support for overridden malloc/free functions
|
||||
* Refactor Dynarec memory management, reducing memory footprint (from 20% to 40% of Dynarec size)
|
||||
* Improved elf loader
|
||||
* Improved dlsym handling with RTLD_NEXT
|
||||
* Added BOX64_DYNAREC_SAFEFLAGS to allow finetuning Dynarec generated code handling of flags accross function calls and returns.
|
||||
* Added BOX64_BASH to setup x86_64 bash binary, so shell script can be run in x86_64 world
|
||||
* Added BOX64_ROLLING_LOG to have details log only on crash
|
||||
* Work on alignment for some of pthread structures
|
||||
* More wrapped libraries in the gtk family
|
||||
* Some fixes on the Dynarec x87 code (fixing a bunch of games like ut2004 or Piczle Puzzle)
|
||||
* Improved TLS Size handling (Unity3D games now works)
|
||||
* More PageSize Compile options
|
||||
* Improved `execv` family of function to have better box64 integration
|
||||
* Added support for wrapped libfuse so AppImage works
|
||||
* Adjusted the binfmt integration so AppImage are automaticaly picked
|
||||
* Improved FAudio, SDL2, GL (and more) wrapping
|
||||
* More wrapped libs, like libEGL.so, to helps emulated Qt4/5 libs to load
|
||||
* Improved Signal Handling and memory protection traking
|
||||
* Some signature fixes to some wrapped functions (in libc)
|
||||
* Added more syscalls
|
||||
* Added a lot of new opcodes to the ARM64 Dynarec
|
||||
=> Lot's of new games stat working, to name a few: Surviving Mars, Piczle Cross Adventure (using Proton experimental), UT2004, Obduction, Machinarium, Silicon Zero, Hacknet, Absolute Drift, Art of Rally, Dota2
|
||||
=> Some apps also runs now, like TeamSpeak 3 Client and Server or Discord
|
||||
=> The bash integration is usefull for device with no binfmt integration or for script that check the machine it's running on
|
||||
|
||||
v0.1.8
|
||||
======
|
||||
* Added an option to get generated -NAN on SSE2 operation
|
||||
@@ -23,8 +393,8 @@ v0.1.8
|
||||
* Don't quit on unsupported syscall, return -1 / ENOSYS error
|
||||
* Added some more Syscall
|
||||
* Wrapped Vulkan library. Vulkan and dxvk now supported!
|
||||
* Support building on PPC64LE (interpretor only)
|
||||
* Added support for Risc-V (interpretor only)
|
||||
* Support building on PPC64LE (interpreter only)
|
||||
* Added support for Risc-V (interpreter only)
|
||||
|
||||
v0.1.6
|
||||
======
|
||||
@@ -40,7 +410,7 @@ v0.1.6
|
||||
* Some residual fixes on thread attribute handling
|
||||
* Better handling of app that want 32bits jumps, like unity3d/mono (thanks mogery)
|
||||
* More ARM hardware option in CMake (Phytium, NX...)
|
||||
* Added loongarch64 support (interpretor only)
|
||||
* Added loongarch64 support (interpreter only)
|
||||
* Some fixes to elfloader
|
||||
* Added a mecanism to cancel a Dynarec block construction if it triggers a segfault (instead of a crash)
|
||||
|
||||
@@ -63,7 +433,7 @@ v0.1.4
|
||||
v0.1.2
|
||||
======
|
||||
* OpenSource!
|
||||
* A few more opcode added to the Interpretor and the Dynarec
|
||||
* A few more opcode added to the Interpreter and the Dynarec
|
||||
* Improved Native Function calling
|
||||
* Added some function to limit allocated memory to 47bits space (for Wine)
|
||||
* Improved and Fixed the functions to limit allocated memory to 32bits space
|
||||
@@ -77,7 +447,7 @@ v0.1.0
|
||||
* Some fixes to a few function signature
|
||||
* Improvement to Signal handling, and internal mutex handling
|
||||
* A few fixes to some dynarec opcodes
|
||||
* A few fixes to some interpretor opcodes
|
||||
* A few fixes to some interpreter opcodes
|
||||
|
||||
v0.0.8
|
||||
======
|
||||
|
||||
Executable → Regular
+304
-124
@@ -1,215 +1,395 @@
|
||||
Compiling
|
||||
Compiling/Installing
|
||||
----
|
||||
|
||||
If you don't want to compile box64 yourself and prefer to use third-party pre-build version, go to the [end of the document](#pre-built-packages) for alternatives.
|
||||
|
||||
You can also generate your own package using the [instructions below](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md#debian-packaging).
|
||||
|
||||
Additional installation steps may be necessary when copying only the box64 executable file without running make install in cross-build environments. See [Cross-Compiling](https://github.com/ptitSeb/box64/blob/main/docs/COMPILE.md#Cross-Compiling)
|
||||
|
||||
## Per-platform compiling instructions
|
||||
|
||||
### The general approach
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. ${OPTIONS}
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
```
|
||||
- You can use `make -j1`, `make -j2` with less jobs to prevent running out of memory
|
||||
- You can also add `-DBAD_SIGNAL=ON` to the cmake command if you are on a Linux Kernel mixed with Android, like on RK3588.
|
||||
|
||||
### Note about Box32
|
||||
|
||||
If you want to build Box64 with the Box32 option, you will need to add `-DBOX32=ON` to the cmake command. That will enable 32bits process to be run with Box64.
|
||||
If you also want binfmt integration on 32bits binaries, you also need to add `-DBOX32_BINFMT=ON` to the cmake command.
|
||||
|
||||
### Note about WowBox64
|
||||
|
||||
A highly experimantal subproject named WowBox64 has been added as a build option, add `-DWOW64=ON` to the cmake command to enable it.
|
||||
It will build alongside the regular Box64, and produce a `wowbox64.dll` file in `build/wowbox64-prefix/src/wowbox64-build/` directory.
|
||||
|
||||
### Note about binfmt_misc on Android
|
||||
|
||||
[binfmt_misc](https://en.wikipedia.org/wiki/Binfmt_misc) is a capability of the Linux kernel which allows arbitrary executable file formats to be recognized and passed to certain user space applications such as Box64 usually used with systemd but systems like Android can't run/use systemd so you will need to register Box64 manually, this will also work inside a CHRoot.
|
||||
```
|
||||
sudo mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
|
||||
sudo echo ':box64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00:\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/box64:' | sudo tee /proc/sys/fs/binfmt_misc/register
|
||||
```
|
||||
|
||||
|
||||
#### Example of generic ARM64 build for linux platforms
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -D ARM_DYNAREC=ON -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
sudo systemctl restart systemd-binfmt
|
||||
```
|
||||
|
||||
#### Example of generic ARM64 build for linux platforms with full box32 integration
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -D ARM_DYNAREC=ON -D CMAKE_BUILD_TYPE=RelWithDebInfo -D BOX32=ON -D BOX32_BINFMT=ON
|
||||
make -j4
|
||||
sudo make install
|
||||
sudo systemctl restart systemd-binfmt
|
||||
```
|
||||
|
||||
----
|
||||
|
||||
#### for RK3399
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D RK3399=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for PI4
|
||||
#### for RK3588 / RK3588S
|
||||
|
||||
Warning, you need a 64bit OS:
|
||||
On a 64bit OS:
|
||||
```
|
||||
-D RK3588=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for Raspberry Pi 3
|
||||
|
||||
On a 64bit OS:
|
||||
|
||||
If building on the Pi, you will also need a large swap (3 GB+)
|
||||
[optionally reduce GPU memory to a minimum (e.g. 16 MB) using `raspi-config`
|
||||
(and reboot) before starting the build]:
|
||||
|
||||
You can use e.g. '`make -j4`' to speed up the build, but on a Pi 3 with 1GB memory you will likely
|
||||
run out of memory at some point and need to run the build again.
|
||||
Still, this can be faster if your build is attended.
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
-D RPI3ARM64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
|
||||
#### for Raspberry Pi 4
|
||||
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D RPI4ARM64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for Raspberry Pi 5
|
||||
|
||||
```
|
||||
-D RPI5ARM64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for TEGRA X1
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D TEGRAX1=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for Snapdragon 845
|
||||
#### for Jetson Xavier/T194
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DSD845=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D TEGRA_T194=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for Jetson Orin/T234
|
||||
|
||||
On a 64bit OS:
|
||||
|
||||
Note: use gcc-11 or higher, older gcc doesn't know cortex-a78ae
|
||||
```
|
||||
-D TEGRA_T234=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for DGX Spark/GB10 based devices
|
||||
|
||||
On a 64bit OS:
|
||||
|
||||
Note: Requires GCC 15.2.0 or higher. Older GCC versions do not support gb10, cortex-a725, or cortex-x925.
|
||||
|
||||
For GCC 14 or older, you can use the following march equivalent:
|
||||
```
|
||||
-march=armv9.2-a+crc+sve2-aes+sve2-bitperm+sve2-sha3+sve2-sm4+memtag+profile
|
||||
```
|
||||
|
||||
With GCC 15.2.0 or higher:
|
||||
```
|
||||
-D NVIDIA_GB10=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for ODROID N2/N2+
|
||||
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
-D ODROIDN2=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for Snapdragon
|
||||
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
-D SD845=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
-D SD888=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
Depending on how recent your Snapdragon is
|
||||
|
||||
----
|
||||
#### for Phytium
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DPHYTIUM=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
-D PHYTIUM=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
|
||||
#### for ADLink machines
|
||||
|
||||
On a 64bit OS:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D ADLINK=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for M1
|
||||
|
||||
Only test on Asahi for now, using the default "16K page" kernel
|
||||
Only test on Asahi with Fedora, using the default "16K page" kernel
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DM1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
-D M1=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
```
|
||||
|
||||
|
||||
#### for Other ARM64 Linux platforms
|
||||
|
||||
`mkdir build; cd build; cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)`
|
||||
|
||||
#### for LoongArch
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DLARCH64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D LARCH64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for RISCV
|
||||
#### for RISC-V
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DRV64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D RV64=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for PowerPC 64 LE
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DPPC64LE=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D PPC64LE=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for LX2160A
|
||||
|
||||
Using a 64bit OS:
|
||||
On a 64bit OS:
|
||||
|
||||
```
|
||||
git clone https://github.com/ptitSeb/box64
|
||||
cd box64
|
||||
mkdir build; cd build; cmake .. -DLX2160A=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
make -j$(nproc)
|
||||
sudo make install
|
||||
-D LX2160A=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
If it's the first install, you also need:
|
||||
|
||||
#### for Termux
|
||||
|
||||
You must have ARM64 machine to build box64.
|
||||
|
||||
##### in CHRoot/PRoot
|
||||
|
||||
```
|
||||
sudo systemctl restart systemd-binfmt
|
||||
-D ARM64=1 -DCMAKE_C_COMPILER=gcc -DBAD_SIGNAL=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
##### in Termux (Native)
|
||||
|
||||
Note: Box64 in native termux is experimental and won't run linux binaries!
|
||||
|
||||
You also need `libandroid-sysv-semaphore` and `libandroid-spawn` libraries.
|
||||
|
||||
```
|
||||
-D TERMUX=1 -DCMAKE_C_COMPILER=clang -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
|
||||
#### for x86_64 Linux
|
||||
|
||||
`mkdir build; cd build; cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)`
|
||||
```
|
||||
-D LD80BITS=1 -D NOALIGN=1 -D CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
```
|
||||
If you encounter some linking errors, try using `NOLOADADDR=ON` (`cmake -D NOLOADADDR=ON; make -j$(nproc)`).
|
||||
|
||||
If you encounter some linking errors, try using `NOLOADADDR=ON` (`cmake -DNOLOADADDR=ON; make -j$(nproc)`).
|
||||
----
|
||||
|
||||
### use ccmake
|
||||
### Use ccmake
|
||||
|
||||
Alternatively, you can **use the curses-bases ccmake (or any other gui frontend for cmake)** to select wich platform to use interactively.
|
||||
Alternatively, you can **use the curses-based ccmake (or any other gui frontend for cmake)** to select which platform to use interactively.
|
||||
|
||||
### Customize your build
|
||||
|
||||
#### Use ccache if you have it
|
||||
#### Use ccache when present
|
||||
|
||||
Add `-DUSE_CCACHE=1` if you have ccache (it's better if you plan to touch the sources)
|
||||
Add `-DUSE_CCACHE=1` option if you have ccache and plan to touch the sources.
|
||||
|
||||
#### To have some debug info
|
||||
#### Include debug information
|
||||
|
||||
The `-DCMAKE_BUILD_TYPE=RelWithDebInfo` argument makes a build that is both optimized for speed, and has debug information embedded. That way, if you have a crash or try to analyse performance, you'll have some symbols.
|
||||
Add `-DCMAKE_BUILD_TYPE=RelWithDebInfo` option for an optimized build with debug information embedded. That way, if you want to debug a crash or analyze performance, you have symbols.
|
||||
|
||||
#### To have a Trace Enabled build
|
||||
#### Build with trace
|
||||
|
||||
To have a trace enabled build (***the interpreter will be slightly slower***), add `-DHAVE_TRACE=1`. But you will need to have the [Zydis library](https://github.com/zyantific/zydis) in your `LD_LIBRARY_PATH` or in the system library folders at runtime.
|
||||
To have a trace enabled build (***the interpreter will be slightly slower***), add `-DHAVE_TRACE=1`. You will need the [Zydis library](https://github.com/zyantific/zydis) devel package installed (`apt install libzydis-dev` on Debian for example).
|
||||
|
||||
#### To have ARM Dynarec
|
||||
#### Build DynaRec
|
||||
|
||||
Dynarec is only available on ARM (for the meantime), Activate it by using `-DARM_DYNAREC=1`.
|
||||
###### *Note: VFPv3 and NEON are required for Dynarec.*
|
||||
Add `-D ARM_DYNAREC=ON` option to enable DynaRec on ARM machines.
|
||||
Add `-D RV64_DYNAREC=ON` option to enable DynaRec on RV64 machines.
|
||||
Add `-D LARCH64_DYNAREC=ON` option to enable DynaRec on LARCH64 machines.
|
||||
|
||||
#### Not building from a git clone
|
||||
#### Save memory at run time
|
||||
|
||||
If you are not building from a git clone (for example, downloading a release source code zip from github), you need to use `-DNOGIT=1` from cmake to be able to build (box64 uses git SHA1 to show last commit in version number).
|
||||
You can use `-DSAVE_MEM` to have a build that will try to save some memory. For now, it only increases the jumptable from 4 levels to 5. The added granularity avoids wasting space, but adds one more read from memory when jumping between blocks.
|
||||
|
||||
#### Build outside of a git repo
|
||||
|
||||
Box64 uses git SHA1 to show last commit in version number, use `-DNOGIT=1` option when building outside of a git repo (for example, downloading a release source code zip from github).
|
||||
|
||||
#### Use faster linker
|
||||
|
||||
Add `-DWITH_MOLD=1` option when GNU ld is extremely slow. Then run `mold -run make -j4` to build (make sure [Mold](https://github.com/rui314/mold) is installed).
|
||||
|
||||
#### Build a statically linked box64
|
||||
|
||||
You can now build box64 statically linked, with `-DSTATICBUILD` to use inside of a x86_64 chroot. Note that this version of box64 will only have the minimal wrapped libs, such as libc, libm and libpthread. Other libs (like libGL or libvulkan, SDL2, etc...) will use x86_64 versions. A static build is intended to be used in a docker image, or in a headless server. It is highly experimental, but feedback is always welcome.
|
||||
|
||||
----
|
||||
|
||||
Testing
|
||||
----
|
||||
## Testing
|
||||
|
||||
A few tests are included with box64.
|
||||
|
||||
They can be launched using the `ctest` command.
|
||||
|
||||
The tests are very basic and only tests some functionality for now.
|
||||
The tests are very basic and only test some functionality for now.
|
||||
|
||||
----
|
||||
|
||||
Debian Packaging
|
||||
## Debian Packaging
|
||||
|
||||
Box64 can also be packaged into a .deb file ***using the source code zip from the releases page*** with `DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -us -uc -nc`. Configure any additional cmake options you want in `debian/rules`.
|
||||
|
||||
## Pre-built packages
|
||||
|
||||
### Debian-based Linux
|
||||
|
||||
You can use the [Pi-Apps-Coders apt repository](https://github.com/Pi-Apps-Coders/box64-debs) to install precompiled box64 debs, updated every 24 hours.
|
||||
|
||||
```
|
||||
# check if .list file already exists
|
||||
if [ -f /etc/apt/sources.list.d/box64.list ]; then
|
||||
sudo rm -f /etc/apt/sources.list.d/box64.list || exit 1
|
||||
fi
|
||||
|
||||
# check if .sources file already exists
|
||||
if [ -f /etc/apt/sources.list.d/box64.sources ]; then
|
||||
sudo rm -f /etc/apt/sources.list.d/box64.sources || exit 1
|
||||
fi
|
||||
|
||||
# download gpg key from specified url
|
||||
if [ -f /usr/share/keyrings/box64-archive-keyring.gpg ]; then
|
||||
sudo rm -f /usr/share/keyrings/box64-archive-keyring.gpg
|
||||
fi
|
||||
sudo mkdir -p /usr/share/keyrings
|
||||
wget -qO- "https://pi-apps-coders.github.io/box64-debs/KEY.gpg" | sudo gpg --dearmor -o /usr/share/keyrings/box64-archive-keyring.gpg
|
||||
|
||||
# create .sources file
|
||||
echo "Types: deb
|
||||
URIs: https://Pi-Apps-Coders.github.io/box64-debs/debian
|
||||
Suites: ./
|
||||
Signed-By: /usr/share/keyrings/box64-archive-keyring.gpg" | sudo tee /etc/apt/sources.list.d/box64.sources >/dev/null
|
||||
|
||||
sudo apt update
|
||||
sudo apt install box64-generic-arm -y
|
||||
```
|
||||
|
||||
## Cross-Compiling
|
||||
----
|
||||
Box64 can also be packaged into a .deb file with `DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -us -uc -nc`.
|
||||
### Set Up the Cross-Compiler
|
||||
For example, to compile Box64 for RISC-V on an x86 machine, you can get prebuilt GNU toolchain from the [riscv-gnu-toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/releases)
|
||||
|
||||
### Run CMake with Cross-Compilation Options
|
||||
Follow the per-platform compilation instructions to configure the CMake options for your target architecture.
|
||||
In particular, you must specify the cross-compiler. For example:
|
||||
```
|
||||
-DCMAKE_C_COMPILER=riscv64-unknown-linux-gnu-gcc # Or whichever cross-compiler you use
|
||||
```
|
||||
|
||||
Be aware of potential glibc capability errors when choosing a cross-compiler.
|
||||
To avoid this, run `ldd --version` on your target machine to check its glibc version.
|
||||
|
||||
### Running tests with QEMU (optional)
|
||||
To do a quick check, run:
|
||||
```
|
||||
qemu-riscv64 -L path/to/your/riscv64/sysroot box64 --help
|
||||
```
|
||||
You can run `dirname $(find -name libc.so.6)` to determine whether sysroot is provided by the prebuilt GNU toolchain or not.
|
||||
|
||||
To run CTest-based tests under QEMU:
|
||||
```
|
||||
ctest -j$(nproc)
|
||||
```
|
||||
|
||||
### Installing on the Target Machine
|
||||
After successfully cross-compiling, copy the box64 executable to your RISC-V device. Note that simply copying the binary does not automatically install Box64’s shared libraries. Because `make install` does not run on the target during cross-compilation, libraries required for emulation may be missing.
|
||||
|
||||
To resolve this, copy the shared libraries folder from the Box64 repository (`x64lib` or `x86lib`) to your target device, then rename it and place it in the appropriate library search path (e.g., `/usr/lib`).
|
||||
|
||||
For `x86_64`:
|
||||
```shell
|
||||
$ mv x64lib box64-x86_64-linux-gnu
|
||||
$ mv box64-x86_64-linux-gnu /usr/lib
|
||||
```
|
||||
For `i386`:
|
||||
```shell
|
||||
$ mv x86lib box64-i386-linux-gnu
|
||||
$ mv box64-i386-linux-gnu /usr/lib
|
||||
```
|
||||
|
||||
-114
@@ -1,114 +0,0 @@
|
||||

|
||||
|
||||
Linux Userspace x86_64 Emulator with a twist
|
||||
|
||||
[View changelog](https://github.com/ptitSeb/box64/blob/main/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box64/blob/main/docs/README_CN.md) | [Report an error](https://github.com/ptitSeb/box64/issues/new)
|
||||
|
||||
     
|
||||
|
||||
----
|
||||
|
||||
Box64 lets you run x86_64 Linux programs (such as games) on non-x86_64 Linux systems, like ARM (host system needs to be 64-bit little-endian).
|
||||
|
||||
You can find many Box64 videos on the [MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ), [Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g) or [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA) YouTube channels.
|
||||
|
||||
Since Box64 uses the native versions of some "system" libraries, like libc, libm, SDL, and OpenGL, it's easy to integrate and use with most applications, and performance can be surprisingly high in many cases. Take a look at thoses bench analysis for an example [here](https://box86.org/index.php/2021/06/game-performances/).
|
||||
|
||||
Box64 integrates with DynaRec (dynamic recompiler) for the ARM64 platform, providing a speed boost between 5 to 10 times faster than using only the interpreter. Some high level information on how DynaRec works can be found [here](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/).
|
||||
|
||||
Some x64 internal opcodes use parts of "Realmode X86 Emulator Library", see [x64primop.c](../src/emu/x64primop.c) for copyright details
|
||||
|
||||
<img src="img/Box64Icon.png" width="96" height="96">
|
||||
|
||||
Logo and Icon made by @grayduck, thanks!
|
||||
|
||||
----
|
||||
|
||||
Usage
|
||||
----
|
||||
|
||||
There are a few environment variables to control the behaviour of Box64.
|
||||
|
||||
See [here](USAGE.md) for all the environment variables and what they do.
|
||||
|
||||
Note: Box64's Dynarec uses a mechanism with Memory Protection and a SegFault signal handler to handle JIT code. In simpler terms, if you want to use GDB to debug a running program that use JIT'd code (like mono/Unity3D), you will still have many "normal" segfaults triggering. It is suggested to use something like `handle SIGSEGV nostop` in GDB to not stop at each segfault, and maybe put a breakpoint inside `my_memprotectionhandler` in `signals.c` if you want to trap SegFaults.
|
||||
|
||||
----
|
||||
|
||||
Compiling/Installation
|
||||
----
|
||||
> Compilation instructions can be found [here](COMPILE.md).
|
||||
|
||||
----
|
||||
|
||||
Version history/Change log
|
||||
----
|
||||
|
||||
The change log is available [here](CHANGELOG.md).
|
||||
|
||||
----
|
||||
|
||||
Notes about 32-bit platforms
|
||||
----
|
||||
|
||||
Because Box64 works by directly translating function calls from x86_64 to host system, the host system (the one Box64 is running on) needs to have 64-bit libraries. Box64 doesn't include any 64-bit <-> 32-bit translation.
|
||||
|
||||
So understand that box64 will only runs 64-bit linux binaries. For 32-bit binaries, you need box86 (with all the multiarch or proot trickery it imply on 64-bit OS).
|
||||
Note that many installer (mojo setup based) will fall back to "x86" when detecting ARM64 OS, and so will try to use box86 for the setup, even if an x86_64 version exist. You can hack your way around with a fake "uname" that return "x86_64" when the argument is "-m"
|
||||
|
||||
----
|
||||
|
||||
Notes about Unity game emulation
|
||||
----
|
||||
|
||||
Running Unity games is a hit or miss for now. Unity uses Mono (which uses signals that are not always emulated in a 100% accurate way).
|
||||
You should also note that some Unity3D games require OpenGL 3+ which can be tricky to provide on ARM SBC (single-board computers).
|
||||
So, not all Unity games work and can require a high OpenGL profile, but many actualy work now.
|
||||
Hint: on Pi4, use `MESA_GL_VERSION_OVERRIDE=3.2` and with Panfrost use `PAN_MESA_DEBUG=gl3` to use higher profile if the game starts then quits before showing anything.
|
||||
|
||||
----
|
||||
|
||||
Notes about GTK programs
|
||||
----
|
||||
|
||||
GTK libraries are now wrapped on box64, bu only gtk2, not gtk3 (contrary to box86).
|
||||
|
||||
----
|
||||
|
||||
Notes about Steam
|
||||
----
|
||||
|
||||
Note that Steam is a hybrid 32-bit / 64-bit. You NEED box86 to run Steam, as the client app is a 32-bit binary. It also uses a 64-bit local server binaries, but like most stuff using libcef/chromium, it's not working correctly on box64 for now.
|
||||
So, no Steam for now on box64.
|
||||
|
||||
----
|
||||
|
||||
Notes about Wine
|
||||
----
|
||||
|
||||
Wine64 is supported on box64. Proton should also work. Be aware that 64-bit Wine also includes 32-bit components, to be able to run 32-bit Windows programs. The 32-bit apps will need box86 and will not run without it. On a system where both box64 and box86 are present and working, a wine 64-bit setup can run both 32-bit and 64-bit Windows programs (just use `wine` and `wine64` respectively)
|
||||
|
||||
----
|
||||
|
||||
Notes about Vulkan
|
||||
----
|
||||
|
||||
Box64 wraps Vulkan libraries, but note that it as only been tested with a RX550 card, some extensions may be missing depending on your graphics card.
|
||||
|
||||
----
|
||||
|
||||
Final word
|
||||
----
|
||||
|
||||
I want to thank everyone who has contributed to box64 development.
|
||||
There are many ways to contribute: code contribution, financial, hardware and advertisement!
|
||||
So, in no particular order, I want to thank:
|
||||
* For their major code contribution: rajdakin, mogery
|
||||
* For their major financial contribution: FlyingFathead, stormchaser3000
|
||||
* For hardware contribution and LoongArch migration: [xiaoji](https://www.linuxgame.cn/), Deepin Beijing Develop Team
|
||||
* For their hardware contribution: [Radxa](https://rockpi.org/), [Pine64](https://www.pine64.org/), [StarFive](https://rvspace.org/)
|
||||
* For their continous advertisement of box64 project: salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/[TwisterOS](https://twisteros.com/) team, [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
|
||||
|
||||
And I also thank the many other people who participated even once in this project.
|
||||
|
||||
(If you use Box64 in your project, please don't forget to mention it!)
|
||||
@@ -1,119 +0,0 @@
|
||||
# box64
|
||||
|
||||

|
||||
Linux上用户空间的x86_64应用模拟器
|
||||
|
||||
----
|
||||

|
||||
|
||||
[English](README.md)
|
||||
|
||||
在ARM或其他非X86_64架构的Linux操作系统上,使用Box64可以运行x86_64 Linux程序(例如游戏),请注意,主机系统需要**64位小端**。
|
||||
|
||||
您可以在Youtube的[MicroLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)、[Pi Labs](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)或[The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA)频道找到更多Box64视频。
|
||||
|
||||
Box64使用了一些“系统”库的原生版本,例如libc、libm、SDL和OpenGL,所以它很容易与大多数应用程序集成和使用,并且在很多情况下性能会出奇的高。点击[此处](https://box86.org/index.php/2021/06/game-performances/)查看示例的基准测试分析。
|
||||
|
||||
Box64为ARM64平台集成了DynaRec(动态重编译器),比仅使用解释器提升5到10倍性能。关于Dynarec如何工作的更多信息,可以在[这里](https://box86.org/2021/07/inner-workings-a-high%e2%80%91level-view-of-box86-and-a-low%e2%80%91level-view-of-the-dynarec/)找到。
|
||||
|
||||
注:DynaRec需要针对不同平台编写一部分汇编代码,目前仅支持ARM64。
|
||||
|
||||
一些x64内部操作码使用“Realmode X86 Emulator Library”的部分内容,请参阅[x64primop.c](../src/emu/x64primop.c)了解版权详情
|
||||
|
||||
<img src="img/Box64Icon.png" width="96" height="96">
|
||||
|
||||
Logo和图标由grayduck制作,感谢!
|
||||
|
||||
----
|
||||
|
||||
使用方法
|
||||
----
|
||||
|
||||
若干环境变量可以设置Box64的行为。
|
||||
|
||||
点击[这里](USAGE.md)了解所有的环境变量和它们的作用。
|
||||
|
||||
请注意:Box64的Dynarec提供了一种机制来处理JIT代码,包含内存保护和段错误信号处理程序。简单地说,如果您想用GDB来调试一个使用JIT代码的运行程序(比如mono/Unity3D),您仍然会触发很多“正常”的段错误。建议在GDB中使用类似于`handle SIGSEGV nostop`的东西,不要在每个段错误时都停止,如果您想捕获段错误,可以在`signals.c`中的`my_memprotectionhandler`中放置一个断点。
|
||||
|
||||
----
|
||||
|
||||
编译/安装
|
||||
----
|
||||
> 编译说明可以在[这里](COMPILE.md)查看。
|
||||
|
||||
----
|
||||
|
||||
版本历史
|
||||
----
|
||||
|
||||
版本日志在[这里](CHANGELOG.md)。
|
||||
|
||||
----
|
||||
|
||||
32位平台的注意事项
|
||||
----
|
||||
|
||||
Box64的工作原理是直接将函数调用从x86_64转换到主机系统,主机系统(Box64运行的系统)需要有64位的库。Box64并不包括任何64位<->32位的转换。
|
||||
|
||||
所以请理解,Box64只能运行64位的Linux二进制文件。对于32位的二进制文件,需要Box86(在64位的操作系统上需要所有的multiarch库或一些proot技巧)。
|
||||
|
||||
请注意,许多(基于mojo的)安装程序,即使存在x86_64版本,但在检测到架构为ARM64时会退回到"x86",这时会尝试使用(如果有)box86进行安装。这时你可以使用一个假的"uname",当它的参数为"-m"时返回"x86_64"。
|
||||
|
||||
----
|
||||
|
||||
关于Unity游戏模拟的注意事项
|
||||
----
|
||||
|
||||
当前Unity游戏模拟是一件碰运气的事情。Unity使用Mono(它的信号表示,并不总能100%成功模拟)。
|
||||
|
||||
您还应该注意,一些Unity3D游戏需要OpenGL 3+,目前在ARM SBC(单板计算机)上提供OpenGL 3+是很棘手的。
|
||||
|
||||
所以,并不是所有的Unity游戏都能工作,而且可能需要很高的OpenGL配置,但现在很多游戏都能工作。
|
||||
|
||||
提示:如果游戏开始后在显示任何东西之前退出,在Pi4上使用`MESA_GL_VERSION_OVERRIDE=3.2`,在Panfrost上使用`PAN_MESA_DEBUG=gl3`来使用更高的配置文件。
|
||||
|
||||
----
|
||||
|
||||
关于GTK程序的注意事项
|
||||
----
|
||||
|
||||
GTK 庫現在包裝在 box64 上,但只有 gtk2,而不是 gtk3(與 box86 相反)。
|
||||
|
||||
----
|
||||
|
||||
关于Steam的注意事项
|
||||
----
|
||||
|
||||
Steam并不是32位/64位混合的,而是32位的,因此您需要Box86才能运行Steam。Steam也使用64位的本地服务器程序,但像大多数使用libcef/chromium的程序一样,在box64上暂时无法正常工作。
|
||||
所以:目前在box64上无法运行Steam。
|
||||
----
|
||||
|
||||
关于Wine的注意事项
|
||||
----
|
||||
|
||||
box64支持64位Wine,但请注意,64位的Wine还包含32位的组件,以便能够运行32位的Windws程序。32位程序需要Box86,没有它就不能运行。在Box64和Box86共存的系统上,设置64位Wine可以同时运行32位和64位windows程序(只需分别使用 `wine` 和 `wine64`)。
|
||||
|
||||
----
|
||||
|
||||
关于Vulkan注意事项
|
||||
----
|
||||
|
||||
Box64 包裝 Vulkan 庫。但請注意,它僅使用 RX550 卡進行了測試,根據您的圖形卡,可能會缺少某些擴展。
|
||||
|
||||
----
|
||||
|
||||
结语
|
||||
----
|
||||
|
||||
我要感谢所有为 box64 开发做出贡献的人。
|
||||
贡献方式有很多种:代码贡献、财务帮助、捐赠捐赠和广告合作!
|
||||
以下感谢不分先后:
|
||||
* 代码贡献:rajdakin, mogery
|
||||
* 财务帮助:FlyingFathead, stormchaser3000
|
||||
* 硬件捐赠:[Radxa](https://rockpi.org/), [Pine64](https://www.pine64.org/), [StarFive](https://rvspace.org/)
|
||||
* 硬件捐赠和LoongArch迁移:[xiaoji](https://www.linuxgame.cn)
|
||||
* 为本项目持续的宣传:salva ([microLinux](https://www.youtube.com/channel/UCwFQAEj1lp3out4n7BeBatQ)), [PILab](https://www.youtube.com/channel/UCgfQjdc5RceRlTGfuthBs7g)/[TwisterOS](https://twisteros.com/) team, [The Byteman](https://www.youtube.com/channel/UCEr8lpIJ3B5Ctc5BvcOHSnA), [NicoD](https://www.youtube.com/channel/UCpv7NFr0-9AB5xoklh3Snhg), ekianjo ([Boilingsteam](https://boilingsteam.com/))
|
||||
|
||||
我还要感谢很多人,即使他们只参与了一次本项目。
|
||||
|
||||
(如果你的项目中使用了Box64,请不要忘记提及!)
|
||||
@@ -0,0 +1,19 @@
|
||||
# The guide on running Steam with Box64
|
||||
|
||||
Steam works with Box64, both Linux version and Windows version. Systems with less than 6GB RAM may need a swap file for optimal performance.
|
||||
|
||||
## Install and run Linux Steam
|
||||
|
||||
Linux Steam requires Box86 or Box32 and it's binfmt enabled, check [Compilation Instructions](COMPILE.md) for details.
|
||||
|
||||
```bash
|
||||
# This file can be found in the project root directory
|
||||
./install_steam.sh
|
||||
|
||||
# And then, just run
|
||||
steam
|
||||
```
|
||||
|
||||
## Install and run Windows Steam
|
||||
|
||||
It's simple, just download it from Steam website and install it like other Windows applications.
|
||||
Executable → Regular
+858
-197
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,55 @@
|
||||
# The guide on using Wine with Box64
|
||||
|
||||
<ins>W</ins>ine <ins>I</ins>s <ins>N</ins>ot an <ins>E</ins>mulator, but Box64 is. Box64 supports Wine in multiple ways. Before continuing reading, you should have a basic understanding of Wine.
|
||||
|
||||
## Wine variants
|
||||
|
||||
Wine ships in multiple forms:
|
||||
|
||||
|
||||
1. **x86 Wine**
|
||||
|
||||
The executable architecture of **x86 Wine** is x86, and it runs x32 Windows executables.
|
||||
|
||||
**x86 Wine** requires a 32-bit environment (read 32-bit Linux libraries), which is usually available on x86_64 machines because of the nature of the architecture.
|
||||
|
||||
However, when you try to run it via an emulator on RISC architectures, the situation is a bit different. For Arm64, there is armhf, which is a 32-bit environment, and there is also Box86, which is made for armhf, so you can use Box86 to run **x86 Wine**.
|
||||
|
||||
However, for RISC-V 64, LoongArch64, and many newer Arm64 cores, a 32-bit environment is not available. Box64 introduced a new mode called Box32, which can be enabled at compile time via a CMake option `BOX32`. It essentially emulates a 32-bit environment using the 64-bit environment, so it can be used to run **x86 Wine**. But be aware that Box32 is still highly experimental and unstable.
|
||||
|
||||
2. **x86_64 Wine**
|
||||
|
||||
The executable architecture of **x86_64 Wine** is x86_64, and it runs x64 Windows executables.
|
||||
|
||||
It can be used with Box64. Note that **x86_64 Wine** usually ships with **x86 Wine** included. So you can use a combination of Box86 + Box64 or Box64 alone with Box32 enabled to run both x32 and x64 executables seamlessly.
|
||||
|
||||
3. **x86_64 Wine WOW64**
|
||||
|
||||
The executable architecture of **x86_64 Wine WOW64** is x86_64, and it runs both x32 and x64 Windows executables.
|
||||
|
||||
What's great about **x86_64 Wine WOW64** is that it does not require a 32-bit environment for x32 Windows executable, as the 32-bit environment emulation is taken care of by Wine WOW64 itself.
|
||||
|
||||
That means you can just use Box64 (without Box32) to run x32 Windows executables. However, the downside is that the performance of WineD3D is pretty bad for 32-bit (use DXVK!).
|
||||
|
||||
4. **Arm64 Wine WOW64**
|
||||
|
||||
The executable architecture of **Arm64 Wine WOW64** is Arm64, and it runs
|
||||
x32, x64, Arm32, Arm64 Windows executables.
|
||||
|
||||
However, to run x32 and x64 ones, a cpu.dll is required, known as the
|
||||
WOW64 (for 32-bit) and Arm64EC (for 64-bit).
|
||||
|
||||
Box64 now supports 32-bit WOW64 DLL. You can have it compiled by enabling the `WOW64` CMake option. And we plan to support Arm64EC in the future.
|
||||
|
||||
## Wine installation
|
||||
|
||||
For x86 Wines, there are plenty of places to download, to name a few:
|
||||
|
||||
- https://github.com/Kron4ek/Wine-Builds (Wine \[WOW64\])
|
||||
- https://github.com/GloriousEggroll/proton-ge-custom (Proton, known as the Valve-optimized Wine)
|
||||
|
||||
After the download, just add the `bin` folder to your path in any way you like; Wine should work with Box64 just fine.
|
||||
|
||||
To install components like DXVK, d3dcompiler_xx, or cjkfonts, it's recommended to use Winetricks: https://github.com/Winetricks/winetricks
|
||||
|
||||
For Arm64 Wines, use of Hangover is recommended: https://github.com/AndreRH/hangover.
|
||||
+965
@@ -0,0 +1,965 @@
|
||||
=head1 NAME
|
||||
|
||||
box64 - Linux Userspace x86_64 Emulator with a twist
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<box64> [B<--help>] [B<--version>] I<executable>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<Box64> lets you run x86_64 Linux programs (such as games) on non-x86_64 Linux
|
||||
systems, like ARM (host system needs to be 64-bit little-endian). Since B<Box64>
|
||||
uses the native versions of some "system" libraries, like libc, libm, SDL, and
|
||||
OpenGL, it's easy to integrate and use with most applications, and performance
|
||||
can be surprisingly high in many cases. B<Box64> integrates with DynaRec (dynamic
|
||||
recompiler) for the ARM64 platform, providing a speed boost between 5 to 10
|
||||
times faster than using only the interpreter.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-h,--help>
|
||||
|
||||
Print box64 help and quit.
|
||||
|
||||
=item B<-v,--version>
|
||||
|
||||
Print box64 version and quit.
|
||||
|
||||
=back
|
||||
|
||||
=head1 BRIEF USAGE
|
||||
|
||||
There are many environment variables to control B<Box64>'s behaviour. In
|
||||
addition to environment variables, B<Box64> also looks for 2 places for rcfile:
|
||||
F</etc/box64.box64rc> and F<~/.box64rc>, in the format of .ini files.
|
||||
Settings priority: F<~/.box64rc> > F</etc/box64.box64rc> > environment variables.
|
||||
Example:
|
||||
|
||||
[factorio]
|
||||
BOX64_DYNAREC_SAFEFLAGS=0
|
||||
BOX64_DYNAREC_BIGBLOCK=2
|
||||
BOX64_DYNAREC_FORWARD=1024
|
||||
BOX64_DYNAREC_CALLRET=1
|
||||
|
||||
=head1 ENVIRONMENT VARIABLES
|
||||
|
||||
=over 8
|
||||
|
||||
|
||||
=item B<BOX64_ADDLIBS> =I<XXXX|XXXX:YYYY:ZZZZ>
|
||||
|
||||
Add extras to the needed libraries list, rarely needed.
|
||||
|
||||
* XXXX : Add library XXXX to the needed libraries list.
|
||||
* XXXX:YYYY:ZZZZ : Add library XXXX, YYYY and ZZZZ to the needed libraries list.
|
||||
|
||||
|
||||
=item B<BOX64_AES> =I<0|1>
|
||||
|
||||
Expose AES capabilities. Available in WowBox64.
|
||||
|
||||
* 0 : Do not expose AES capabilities.
|
||||
* 1 : Expose AES capabilities. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_ALLOWMISSINGLIBS> =I<0|1>
|
||||
|
||||
Allow missing libraries to be ignored.
|
||||
|
||||
* 0 : Do not allow missing libraries. [Default]
|
||||
* 1 : Allow missing libraries.
|
||||
|
||||
|
||||
=item B<BOX64_ARCH> =I<`arm64`|`la64`|`rv64`|`<empty>`>
|
||||
|
||||
Specify the architecture in rcfiles to which the current entry applies. This option only takes effect when used inside rcfiles.
|
||||
|
||||
* `arm64` : Only apply current entry for AArch64.
|
||||
* `la64` : Only apply current entry for LoongArch64.
|
||||
* `rv64` : Only apply current entry for RISC-V.
|
||||
* `<empty>` : Apply current entry for all architectures, will be replaced by more specific entries. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_ARGS> =I<XXXX|XXXX YYYY ZZZZ>
|
||||
|
||||
Arguments to pass to the guest program, only valid if there is no existing arguments.
|
||||
|
||||
* XXXX : Pass argument XXXX to the program.
|
||||
* XXXX YYYY ZZZZ : Pass arguments XXXX, YYYY and ZZZZ to the guest program.
|
||||
|
||||
|
||||
=item B<BOX64_AVX> =I<0|1|2>
|
||||
|
||||
Expose AVX extension to CPUID and cpuinfo file. Default value is 2 on Arm64 because it's fully implemented in DynaRec, 0 otherwise. Available in WowBox64.
|
||||
|
||||
* 0 : Do not expose AVX capabilities.
|
||||
* 1 : Expose AVX, BMI1, F16C and VAES extensions to CPUID and cpuinfo file.
|
||||
* 2 : All in 1, plus AVX2, BMI2, FMA, ADX,VPCLMULQDQ and RDRAND extensions.
|
||||
|
||||
|
||||
=item B<BOX64_BASH> =I<XXXX>
|
||||
|
||||
Path to the bash executable.
|
||||
|
||||
* XXXX : Use bash executable at path XXXX.
|
||||
|
||||
|
||||
=item B<BOX64_CPUTYPE> =I<0|1>
|
||||
|
||||
Specify the CPU type to emulate. Available in WowBox64.
|
||||
|
||||
* 0 : Emulate a Intel CPU Model. [Default]
|
||||
* 1 : Emulate a AMD CPU Model.
|
||||
|
||||
|
||||
=item B<BOX64_CRASHHANDLER> =I<0|1>
|
||||
|
||||
Use a dummy crash handler or not.
|
||||
|
||||
* 0 : Use emulated crashhandler.so library if needed.
|
||||
* 1 : Use an internal dummy (empty) crashhandler.so library. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DLSYM_ERROR> =I<0|1>
|
||||
|
||||
Enable or disable the logging of dlsym errors.
|
||||
|
||||
* 0 : Disable the logging of dlsym errors. [Default]
|
||||
* 1 : Enable the logging of dlsym errors.
|
||||
|
||||
|
||||
=item B<BOX64_DUMP> =I<0|1>
|
||||
|
||||
Dump elfloader debug information. Available in WowBox64.
|
||||
|
||||
* 0 : Do not dump elfloader debug information. [Default]
|
||||
* 1 : Dump elfloader debug information.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC> =I<0|1>
|
||||
|
||||
Enable/disable the Dynamic Recompiler (a.k.a DynaRec). This option defaults to 1 if it's enabled in the build options for a supported architecture. Available in WowBox64.
|
||||
|
||||
* 0 : Disable DynaRec.
|
||||
* 1 : Enable DynaRec.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_ALIGNED_ATOMICS> =I<0|1>
|
||||
|
||||
Generate aligned atomics only (only available on Arm64 for now). Available in WowBox64.
|
||||
|
||||
* 0 : Generate unaligned atomics handling code. [Default]
|
||||
* 1 : Generate aligned atomics only, which is faster and smaller code size, but will cause SIGBUS for LOCK prefixed opcodes operating on unaligned data addresses.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_BIGBLOCK> =I<0|1|2|3>
|
||||
|
||||
Enable building bigger DynaRec code blocks for better performance. Available in WowBox64.
|
||||
|
||||
* 0 : Do not try to build block as big as possible, suitable for programs using lots of threads and JIT, like Unity.
|
||||
* 1 : Build Dynarec block as big as possible.
|
||||
* 2 : Build Dynarec block bigger, do not stop when block overlaps, but only for blocks in elf memory. [Default]
|
||||
* 3 : Build Dynarec block bigger, do not stop when block overlaps, for all type of memory, useful for wine programs.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_BLEEDING_EDGE> =I<0|1>
|
||||
|
||||
Detect MonoBleedingEdge and apply conservative settings (Linux only).
|
||||
|
||||
* 0 : Do not detect MonoBleedingEdge.
|
||||
* 1 : Detect MonoBleedingEdge and apply BOX64_DYNAREC_BIGBLOCK=0 BOX64_DYNAREC_STRONGMEM=1 when detected. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_CALLRET> =I<0|1|2>
|
||||
|
||||
Optimize CALL/RET opcodes. Available in WowBox64.
|
||||
|
||||
* 0 : Do not optimize CALL/RET, use jump table. [Default]
|
||||
* 1 : Try to optimize CALL/RET, skipping the jump table when possible.
|
||||
* 2 : Try to optimize CALL/RET, skipping the jump table when possible, adding code to handle return to dirty/modified block. Does not work on WowBox64.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_DF> =I<0|1>
|
||||
|
||||
Enable or disable the use of deferred flags. Available in WowBox64.
|
||||
|
||||
* 0 : Disable the use of deferred flags.
|
||||
* 1 : Enable the use of deferred flags. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_DIRTY> =I<0|1|2>
|
||||
|
||||
Allow continue running a block that is unprotected and potentially dirty.
|
||||
|
||||
* 0 : Do not allow continue running a block that is unprotected and potentially dirty. [Default]
|
||||
* 1 : Allow continue to run a dynablock that write data in the same page as code. It can gets faster in loading time of some game but can also get unexpected crashes.
|
||||
* 2 : Will also, when it detect an HotPage, flag that page as NEVERCLEAN, and so it will not be write protected but Block build from that page will always be tested. It can be faster that way (but soem SMC case might not be trapped).
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_NOHOTPAGE> =I<0|1>
|
||||
|
||||
Disable detection of hot page (where code is executed and data written at the same time).
|
||||
|
||||
* 0 : Detect hot page [Default]
|
||||
* 1 : Do not detect hot page
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_HOTPAGE_ALT> =I<0|1>
|
||||
|
||||
Use alternative way to detect HotPages (legacy way).
|
||||
|
||||
* 0 : Detect hot page, using new method from v0.3.9+ [Default]
|
||||
* 1 : Use alternate method to detect HotPage (from v0.3.8 and earlier)
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_DIV0> =I<0|1>
|
||||
|
||||
Enable or disable the generation of division-by-zero exception. Available in WowBox64.
|
||||
|
||||
* 0 : Do not generate the division-by-zero exception. [Default]
|
||||
* 1 : Generate the division-by-zero exception.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_DUMP> =I<0|1|2>
|
||||
|
||||
Enable DynaRec dump. Available in WowBox64.
|
||||
|
||||
* 0 : Do not dump DynaRec blocks. [Default]
|
||||
* 1 : Dump DynaRec blocks.
|
||||
* 2 : Dump DynaRec blocks with some colors.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_DUMP_RANGE> =I<0xXXXXXXXX-0xYYYYYYYY>
|
||||
|
||||
Dump DynaRec blocks in the specified range. Available in WowBox64.
|
||||
|
||||
* 0xXXXXXXXX-0xYYYYYYYY : Define the range where dynablock gets dumped (inclusive-exclusive).
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_FASTNAN> =I<0|1>
|
||||
|
||||
Enable or disable fast NaN handling. Available in WowBox64.
|
||||
|
||||
* 0 : Precisely emulate the -NaN generation like on x86.
|
||||
* 1 : Do not do anything special with -NAN generation, faster. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_FASTROUND> =I<0|1|2>
|
||||
|
||||
Enable or disable fast rounding. Available in WowBox64.
|
||||
|
||||
* 0 : Generate float/double -> int rounding and use current rounding mode for float/double computation like on x86.
|
||||
* 1 : Do not do anything special with edge case rounding, faster. [Default]
|
||||
* 2 : Generate float/double -> int rounding using current rounding mode for float/double computation like on x86, but use fast int -> float/double conversion.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_FORWARD> =I<0|128|XXXX>
|
||||
|
||||
Define max allowed forward value when building block. Available in WowBox64.
|
||||
|
||||
* 0 : No forward value. When current block ends, do not try to go further even if there are previous forward jumps.
|
||||
* 128 : Allow up to 128 bytes of gap between end of the block and the next forward jump. [Default]
|
||||
* XXXX : Allow up to XXXX bytes of gap between end of the block and the next forward jump.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_GDBJIT> =I<0|1|2|3|0xXXXXXXX-0xYYYYYYY>
|
||||
|
||||
The GDBJIT debugging support, only available on build with `-DGDBJIT=ON`, enable it with gdb command: jit-reader-load /usr/local/lib/libbox64gdbjitreader.so.
|
||||
|
||||
* 0 : Dynarec will not generate GDBJIT debuginfo. [Default]
|
||||
* 1 : Dynarec will generate GDBJIT debuginfo.
|
||||
* 2 : Dynarec will generate detailed GDBJIT debuginfo with internal state.
|
||||
* 3 : Dynarec will register detailed GDBJIT debuginfo only for dynablocks that the guest program trap into, greatly improving performance.
|
||||
* 0xXXXXXXX-0xYYYYYYY : Define the range where Dynarec will generate detailed GDBJIT debuginfo with internal state.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_LOG> =I<0|1|2|3>
|
||||
|
||||
Disable or enable DynaRec logs. Available in WowBox64.
|
||||
|
||||
* 0 : Disable DynaRec logs. [Default]
|
||||
* 1 : Enable minimal DynaRec logs.
|
||||
* 2 : Enable debug level DynaRec logs.
|
||||
* 3 : Enable verbose level DynaRec logs.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_MISSING> =I<0|1|2>
|
||||
|
||||
Print missing opcodes. Available in WowBox64.
|
||||
|
||||
* 0 : Do not print the missing opcode. [Default]
|
||||
* 1 : Print missing opcodes.
|
||||
* 2 : Print the fallback to scalar opcodes, only valid on RISC-V.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_NATIVEFLAGS> =I<0|1>
|
||||
|
||||
Enable or disable the use of native flags. Available in WowBox64.
|
||||
|
||||
* 0 : Do not use native flags.
|
||||
* 1 : Use native flags when possible. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_PAUSE> =I<0|1|2|3>
|
||||
|
||||
Enable x86 PAUSE emulation, may help the performance of spinlocks. Available in WowBox64.
|
||||
|
||||
* 0 : Ignore x86 PAUSE instruction. [Default]
|
||||
* 1 : Use YIELD to emulate x86 PAUSE instruction.
|
||||
* 2 : Use WFI to emulate x86 PAUSE instruction.
|
||||
* 3 : Use SEVL+WFE to emulate x86 PAUSE instruction.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_PERFMAP> =I<0|1>
|
||||
|
||||
Generate map file for Linux perf tool.
|
||||
|
||||
* 0 : Dynarec will not generate perf map. [Default]
|
||||
* 1 : Dynarec will generate perf map.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_PURGE> =I<0|1>
|
||||
|
||||
Purge dynablocks that haven't been executed recently, based on tick age threshold (BOX64_DYNAREC_PURGE_AGE).
|
||||
|
||||
* 0 : Dynarec will not purge old unused dynablocks. [Default]
|
||||
* 1 : Dynarec will purge old unused dynablocks based on tick age.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_PURGE_AGE> =I<4096|XXXX>
|
||||
|
||||
Tick age threshold for dynablock purging (requires BOX64_DYNAREC_PURGE=1).
|
||||
|
||||
* 4096 : Default age threshold. [Default]
|
||||
* XXXX : Custom age threshold (range: 10-65536).
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_SAFEFLAGS> =I<0|1|2>
|
||||
|
||||
Behaviour of flags emulation on CALL/RET opcodes and other edge cases. Available in WowBox64.
|
||||
|
||||
* 0 : Treat CALL/RET as if it never needs any flags.
|
||||
* 1 : Most of RETs will need flags, most of CALLs will not. [Default]
|
||||
* 2 : All CALL/RET will need flags. All edge cases are also handled.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_STRONGMEM> =I<0|1|2|3>
|
||||
|
||||
Enable the emulation of x86 strong memory model. Available in WowBox64.
|
||||
|
||||
* 0 : Do not try anything special. [Default]
|
||||
* 1 : Enable some memory barriers when writing to memory to emulate the x86 strong memory model in a limited way.
|
||||
* 2 : All in 1, plus memory barriers on SIMD instructions.
|
||||
* 3 : All in 2, plus more memory barriers on a regular basis.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_TBB> =I<0|1>
|
||||
|
||||
Enable or disable libtbb detection.
|
||||
|
||||
* 0 : Do not detect libtbb.
|
||||
* 1 : Detect libtbb and apply conservative settings. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_TEST> =I<0|1|0xXXXXXXXX-0xYYYYYYYY>
|
||||
|
||||
Enable DynaRec execution comparison with the interpreter, very slow, only for testing. Available in WowBox64.
|
||||
|
||||
* 0 : No comparison. [Default]
|
||||
* 1 : Each opcode runs on interpreter and on Dynarec, regs and memory are compared and printed when they differ.
|
||||
* 0xXXXXXXXX-0xYYYYYYYY : Define the range where dynarec is tested (inclusive-exclusive).
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_TEST_NODUP> =I<0|1>
|
||||
|
||||
Enable deduplication of IP address where COSIM find a difference Available in WowBox64.
|
||||
|
||||
* 0 : Show all addresses in error [Default]
|
||||
* 1 : Show address in error only 1 time, even if dump might differs
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_TRACE> =I<0|1>
|
||||
|
||||
Enable or disable DynaRec trace.
|
||||
|
||||
* 0 : Do not trace DynaRec blocks. [Default]
|
||||
* 1 : Trace DynaRec blocks, will slow down the program a lot and generates huge logs.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_VOLATILE_METADATA> =I<0|1>
|
||||
|
||||
Use volatile metadata parsed from PE files, only valid for 64bit Windows games.
|
||||
|
||||
* 0 : Do not use volatile metadata.
|
||||
* 1 : Use volatile metadata, which will guide Box64 for better strong memory emulation. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_WAIT> =I<0|1>
|
||||
|
||||
Wait or not for the building of a DynaRec code block to be ready. Available in WowBox64.
|
||||
|
||||
* 0 : Do not wait and use interpreter instead, might speedup a bit on massive multithread or JIT programs.
|
||||
* 1 : Wait for a DynaRec code block to be ready. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_WEAKBARRIER> =I<0|1|2>
|
||||
|
||||
Tweak the memory barriers to reduce the performance impact by strong memory emualtion. Available in WowBox64.
|
||||
|
||||
* 0 : Use regular safe barrier.
|
||||
* 1 : Use weak barriers to have more performance boost. [Default]
|
||||
* 2 : All in 1, plus disabled the last write barriers.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_X87DOUBLE> =I<0|1|2>
|
||||
|
||||
Force the use of float/double for x87 emulation. Available in WowBox64.
|
||||
|
||||
* 0 : Try to use float when possible for x87 emulation. [Default]
|
||||
* 1 : Only use Double for x87 emulation.
|
||||
* 2 : Check Precision Control low precision on x87 emulation.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_INTERP_SIGNAL> =I<0|1>
|
||||
|
||||
Allow the use of Dynarec in Signal Handlers.
|
||||
|
||||
* 0 : Allow the use of Dynarec in signal handlers. [Default]
|
||||
* 1 : Only use the Interpreter for signal handlers (as it was in v0.3.8 and earlier).
|
||||
|
||||
|
||||
=item B<BOX64_DYNACACHE> =I<0|1|2>
|
||||
|
||||
Enable/disable the Dynamic Recompiler Cache (a.k.a DynaCache). This option defaults to 2 (to read cache if present but not generate any). DynaCache write file to home folder by default, and can grow without limit.
|
||||
|
||||
* 0 : Disable DynaCache.
|
||||
* 1 : Enable DynaCache.
|
||||
* 2 : Use DynaCache files if present, but do not generate new one. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_DYNACACHE_FOLDER> =I<XXXX>
|
||||
|
||||
Set the folder for DynaCache files. Default is $XDG_CACHE_HOME/box64 or $HOME/.cache/box64 if $XDG_CACHE_HOME is not set.
|
||||
|
||||
* XXXX : Use folder XXXX for DynaCache files.
|
||||
|
||||
|
||||
=item B<BOX64_DYNACACHE_MIN> =I<XXXX|350>
|
||||
|
||||
Minimum size, in KB, for a DynaCache to be written to disk. Default size is 350KB
|
||||
|
||||
* XXXX : Set a minimum size of XXXX KB of Dynarec code to write the dynacache to disk. Will not be saved to disk else.
|
||||
* 350 : A size of 350 KB is the default value. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_EMULATED_LIBS> =I<XXXX|XXXX:YYYY:ZZZZ>
|
||||
|
||||
Force the use of emulated libraries.
|
||||
|
||||
* XXXX : Force the use of emulated library XXXX.
|
||||
* XXXX:YYYY:ZZZZ : Force the use of emulated libraries XXXX, YYYY and ZZZZ.
|
||||
|
||||
|
||||
=item B<BOX64_ENV> =I<XXXX=yyyy>
|
||||
|
||||
Add an environment variable.
|
||||
|
||||
* XXXX=yyyy : Add environment variable XXXX with value yyyy.
|
||||
|
||||
|
||||
=item B<BOX64_ENV[1-5]> =I<XXXX=yyyy>
|
||||
|
||||
Add an environment variable.
|
||||
|
||||
* XXXX=yyyy : Add environment variable XXXX with value yyyy.
|
||||
|
||||
|
||||
=item B<BOX64_EXIT> =I<0|1>
|
||||
|
||||
Just exit, do not try to run the program.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Just exit.
|
||||
|
||||
|
||||
=item B<BOX64_FIX_64BIT_INODES> =I<0|1>
|
||||
|
||||
Fix 64bit inodes.
|
||||
|
||||
* 0 : Do not fix 64bit inodes. [Default]
|
||||
* 1 : Fix 64bit inodes.
|
||||
|
||||
|
||||
=item B<BOX64_IGNOREINT3> =I<0|1>
|
||||
|
||||
Ignore INT3 instructions.
|
||||
|
||||
* 0 : Trigger a TRAP signal if a handler is present. [Default]
|
||||
* 1 : Skip the opcode silently.
|
||||
|
||||
|
||||
=item B<BOX64_INSERT_ARGS> =I<XXXX|XXXX YYYY ZZZZ>
|
||||
|
||||
Prepend arguments to the command line.
|
||||
|
||||
* XXXX : Prepend argument XXXX to the program.
|
||||
* XXXX YYYY ZZZZ : Prepend arguments XXXX, YYYY and ZZZZ to the guest program.
|
||||
|
||||
|
||||
=item B<BOX64_INPROCESSGPU> =I<0|1>
|
||||
|
||||
Add --in-process-gpu argument to the guest program.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Add --in-process-gpu argument to the guest program.
|
||||
|
||||
|
||||
=item B<BOX64_JITGDB> =I<0|1|2|3>
|
||||
|
||||
Launch gdb or not for SIGSEGV, SIGILL, and SIGBUS.
|
||||
|
||||
* 0 : Just print the message when the signal is caught. [Default]
|
||||
* 1 : Launch gdb when a SIGSEGV, SIGILL or SIGBUS signal is trapped, attached to the offending process and go in an endless loop, waiting. Inside gdb, you need to find the correct thread yourself (the one with `my_box64signalhandler` in is stack), then probably need to `finish` 1 or 2 functions (inside `usleep(..)`) and then you'll be in `my_box64signalhandler`, just before the printf of the Segfault message. Then `set waiting=0` to exit the infinite loop.
|
||||
* 2 : Launch gdbserver when a SIGSEGV, SIGILL or SIGBUS signal is trapped, attached to the offending process, and go in an endless loop, waiting. Use `gdb /PATH/TO/box64` and then `target remote 127.0.0.1: 1234` to connect to the gdbserver (or use actual IP if not on the machine). After that, the procedure is the same as with `BOX64_JITGDB=1`.
|
||||
* 3 : Launch lldb when a SIGSEGV, SIGILL or SIGBUS signal is trapped, attached to the offending process and go in an endless loop, waiting.
|
||||
|
||||
|
||||
=item B<BOX64_JVM> =I<0|1>
|
||||
|
||||
Detect libjvm and apply conservative settings.
|
||||
|
||||
* 0 : Does nothing.
|
||||
* 1 : Detect libjvm, and apply BOX64_DYNAREC_BIGBLOCK=0 BOX64_DYNAREC_STRONGMEM=1 BOX64_SSE42=0 when detected. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_LD_LIBRARY_PATH> =I<XXXX>
|
||||
|
||||
Path to look for x86_64 libraries.
|
||||
|
||||
* XXXX : Add path XXXX to the library path.
|
||||
|
||||
|
||||
=item B<BOX64_LD_PRELOAD> =I<XXXX|XXXX:YYYY>
|
||||
|
||||
Force loading libraries with the binary.
|
||||
|
||||
* XXXX : Force the loading of library XXXX.
|
||||
* XXXX:YYYY : Force the loading of libraries XXXX and YYYY.
|
||||
|
||||
|
||||
=item B<BOX64_LIBCEF> =I<0|1>
|
||||
|
||||
Detect libcef and apply BOX64_MALLOC_HACK settings.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Detect libcef, and apply BOX64_MALLOC_HACK=2 if detected.
|
||||
|
||||
|
||||
=item B<BOX64_LIBGL> =I<libXXXX|/path/to/libXXXX>
|
||||
|
||||
Set the name for libGL.
|
||||
|
||||
* libXXXX : Set the name for libGL to libXXXX.
|
||||
* /path/to/libXXXX : Set the name and path for libGL to /path/to/libXXXX, you can also use SDL_VIDEO_GL_DRIVER.
|
||||
|
||||
|
||||
=item B<BOX64_LOAD_ADDR> =I<0xXXXXXXXX>
|
||||
|
||||
Set the address where the program is loaded, only active for PIE guest programs.
|
||||
|
||||
* 0xXXXXXXXX : Set the address where the program is loaded.
|
||||
|
||||
|
||||
=item B<BOX64_LOG> =I<0|1|2|3>
|
||||
|
||||
Enable or disable Box64 logs, default value is 0 if stdout is not terminal, 1 otherwise. Available in WowBox64.
|
||||
|
||||
* 0 : Disable Box64 logs.
|
||||
* 1 : Enable minimal Box64 logs.
|
||||
* 2 : Enable debug level Box64 logs.
|
||||
* 3 : Enable verbose level Box64 logs.
|
||||
|
||||
|
||||
=item B<BOX64_MALLOC_HACK> =I<0|1|2>
|
||||
|
||||
Behaviour when hooking malloc operators.
|
||||
|
||||
* 0 : Don't allow malloc operator to be redirected, rewriting code to use regular function. [Default]
|
||||
* 1 : Allow malloc operator to be redirected.
|
||||
* 2 : Like 0, but track special mmap/free (some redirected functions are inlined and cannot be redirected).
|
||||
|
||||
|
||||
=item B<BOX64_MAXCPU> =I<0|XXXX>
|
||||
|
||||
Maximum CPU cores exposed. Available in WowBox64.
|
||||
|
||||
* 0 : Use the actual number of CPU cores. [Default]
|
||||
* XXXX : Use XXXX CPU cores.
|
||||
|
||||
|
||||
=item B<BOX64_MMAP32> =I<0|1>
|
||||
|
||||
Force 32-bit compatible memory mappings on 64-bit programs that run 32-bit code (like Wine WOW64), can improve performance.
|
||||
|
||||
* 0 : Do not force 32-bit memory mappings.
|
||||
* 1 : Force 32-bit memory mappings. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_NOBANNER> =I<0|1>
|
||||
|
||||
Disable the Box64 banner. Available in WowBox64.
|
||||
|
||||
* 0 : Show the Box64 banner.
|
||||
* 1 : Do not show the Box64 banner.
|
||||
|
||||
|
||||
=item B<BOX64_NODYNAREC> =I<0xXXXXXXXX-0xYYYYYYYY>
|
||||
|
||||
Forbid dynablock creation in the address range specified, helpful for debugging behaviour difference between Dynarec and Interpreter. Available in WowBox64.
|
||||
|
||||
* 0xXXXXXXXX-0xYYYYYYYY : Define the range where dynablock creation is forbidden (inclusive-exclusive).
|
||||
|
||||
|
||||
=item B<BOX64_NODYNAREC_DELAY> =I<0|1>
|
||||
|
||||
Remove NoDynarec range after a delay. Available in WowBox64.
|
||||
|
||||
* 0 : Do not remove NoDynarec range. [Default]
|
||||
* 1 : Remove the NoDynarec range once 2 threads have been created.
|
||||
|
||||
|
||||
=item B<BOX64_DYNAREC_NOARCH> =I<0|1|2>
|
||||
|
||||
Remove Architecture metatdata from Dynarec blocks (used on signal). Available in WowBox64.
|
||||
|
||||
* 0 : Generate all architecture metadata for each blocks, including x87/mmx/SSE/AVX regs tracking. Wil use some more memory. [Default]
|
||||
* 1 : Generate only essential metadata for each blocks (flags, alignments), saving some memory, but some encrypted software might fails.
|
||||
* 2 : Do not generate metadata for blocks. Saving a bit more memory but might fails on signal handling.
|
||||
|
||||
|
||||
=item B<BOX64_NOGTK> =I<0|1>
|
||||
|
||||
Do not load wrapped GTK libraries.
|
||||
|
||||
* 0 : Load wrapped GTK libraries. [Default]
|
||||
* 1 : Do not load wrapped GTK libraries.
|
||||
|
||||
|
||||
=item B<BOX64_NOPULSE> =I<0|1>
|
||||
|
||||
Do not load PulseAudio libraries (both native and x86_64).
|
||||
|
||||
* 0 : Load PulseAudio libraries. [Default]
|
||||
* 1 : Do not load PulseAudio libraries.
|
||||
|
||||
|
||||
=item B<BOX64_NORCFILES> =I<0|1>
|
||||
|
||||
Do not load any rc files.
|
||||
|
||||
* 0 : Load rc files. [Default]
|
||||
* 1 : Do not load any rc files.
|
||||
|
||||
|
||||
=item B<BOX64_NOSANDBOX> =I<0|1>
|
||||
|
||||
Add --no-sandbox argument to the guest program.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Add --no-sandbox argument to the guest program.
|
||||
|
||||
|
||||
=item B<BOX64_NOSIGSEGV> =I<0|1>
|
||||
|
||||
Disable the handling of SIGSEGV.
|
||||
|
||||
* 0 : Let the x86 program set sighandler for SIGSEGV. [Default]
|
||||
* 1 : Disable the handling of SIGSEGV.
|
||||
|
||||
|
||||
=item B<BOX64_NOSIGILL> =I<0|1>
|
||||
|
||||
Disable the handling of SIGILL.
|
||||
|
||||
* 0 : Let the x86 program set sighandler for SIGILL. [Default]
|
||||
* 1 : Disable the handling of SIGILL.
|
||||
|
||||
|
||||
=item B<BOX64_NOVULKAN> =I<0|1>
|
||||
|
||||
Do not load Vulkan libraries.
|
||||
|
||||
* 0 : Load Vulkan libraries. [Default]
|
||||
* 1 : Do not load Vulkan libraries, both native and x86_64.
|
||||
|
||||
|
||||
=item B<BOX64_PATH> =I<XXXX>
|
||||
|
||||
Path to look for x86_64 binaries.
|
||||
|
||||
* XXXX : Add path XXXX to the binary path.
|
||||
|
||||
|
||||
=item B<BOX64_PCLMULQDQ> =I<0|1>
|
||||
|
||||
Expose PCLMULQDQ capabilities. Available in WowBox64.
|
||||
|
||||
* 0 : Do not expose PCLMULQDQ capabilities.
|
||||
* 1 : Expose PCLMULQDQ capabilities. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_PREFER_EMULATED> =I<0|1>
|
||||
|
||||
Prefer emulated libraries over native ones.
|
||||
|
||||
* 0 : Prefer native libraries over emulated ones. [Default]
|
||||
* 1 : Prefer emulated libraries over native ones.
|
||||
|
||||
|
||||
=item B<BOX64_PREFER_WRAPPED> =I<0|1>
|
||||
|
||||
Prefer wrapped libs first even if the lib is specified with absolute path.
|
||||
|
||||
* 0 : Prefer libs with absolute path over wrapped ones. [Default]
|
||||
* 1 : Prefer wrapped libs first even if the lib is specified with absolute path.
|
||||
|
||||
|
||||
=item B<BOX64_PROFILE> =I<safest|safe|default|fast|fastest>
|
||||
|
||||
Predefined sets of environment variables with compatibility or performance in mind. Available in WowBox64.
|
||||
|
||||
* safest : Profile with all the unsafe DynaRec optimizations disabled.
|
||||
* safe : Well, less safer than safest.
|
||||
* default : The default settings that most programs runs fine with a handy performance. [Default]
|
||||
* fast : Enable many unsafe optimizations, but also enable strongmem emulation.
|
||||
* fastest : Enable many unsafe optimizations to have a better performance.
|
||||
|
||||
|
||||
=item B<BOX64_PYTHON3> =I<XXXX>
|
||||
|
||||
Path to a python3 executable.
|
||||
|
||||
* XXXX : Use python3 executable at path XXXX.
|
||||
|
||||
|
||||
=item B<BOX64_RCFILE> =I<XXXX>
|
||||
|
||||
Path to the rc file to load.
|
||||
|
||||
* XXXX : Load the rc file XXXX, default rc files will not be loaded.
|
||||
|
||||
|
||||
=item B<BOX64_RDTSC_1GHZ> =I<0|1>
|
||||
|
||||
Use hardware counter for rdtsc if available.
|
||||
|
||||
* 0 : Use hardware counter for rdtsc opcode if available. [Default]
|
||||
* 1 : Use hardware counter for rdtsc if and only if precision is at least 1GHz.
|
||||
|
||||
|
||||
=item B<BOX64_RESERVE_HIGH> =I<0|1>
|
||||
|
||||
Reserve high memory area for the program, always enabled on Box32.
|
||||
|
||||
* 0 : Do not reserve high memory area for the program. [Default]
|
||||
* 1 : Reserve high memory area for the program.
|
||||
|
||||
|
||||
=item B<BOX64_ROLLING_LOG> =I<0|1|XXXX>
|
||||
|
||||
Show last few wrapped function call when a signal is caught.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Show last 16 wrapped function call when a signal is caught.
|
||||
* XXXX : Show last XXXX wrapped function call when a signal is caught.
|
||||
|
||||
|
||||
=item B<BOX64_SDL2_JGUID> =I<0|1>
|
||||
|
||||
Use a workaround for SDL_GetJoystickGUIDInfo function for wrapped SDL2.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Use a workaround for SDL_GetJoystickGUIDInfo function for wrapped SDL2.
|
||||
|
||||
|
||||
=item B<BOX64_SHAEXT> =I<0|1>
|
||||
|
||||
Expose SHAEXT (a.k.a. SHA_NI) capabilities. Available in WowBox64.
|
||||
|
||||
* 0 : Do not expose SHAEXT capabilities.
|
||||
* 1 : Expose SHAEXT capabilities. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_SHOWBT> =I<0|1>
|
||||
|
||||
Show native and emulated backtrace when a signal is caught.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Show native and emulated backtrace when a signal is caught.
|
||||
|
||||
|
||||
=item B<BOX64_SHOWSEGV> =I<0|1>
|
||||
|
||||
Always show SIGSEGV signal detailes.
|
||||
|
||||
* 0 : Does nothing. [Default]
|
||||
* 1 : Always show SIGSEGV signal detailes.
|
||||
|
||||
|
||||
=item B<BOX64_SSE_FLUSHTO0> =I<0|1>
|
||||
|
||||
Behaviour of SSE Flush to 0 flags. Also tracking SSE exception flags Available in WowBox64.
|
||||
|
||||
* 0 : Just track the flag. [Default]
|
||||
* 1 : Apply SSE Flush to 0 flag directly. Also reflect SSE exception flags in Dynarec (if available)
|
||||
|
||||
|
||||
=item B<BOX64_SSE42> =I<0|1>
|
||||
|
||||
Expose SSE4.2 capabilities. Available in WowBox64.
|
||||
|
||||
* 0 : Do not expose SSE4.2 capabilities.
|
||||
* 1 : Expose SSE4.2 capabilities. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_STEAM_VULKAN> =I<0|1>
|
||||
|
||||
Force Vulkan for Linux Steam UI.
|
||||
|
||||
* 0 : Do nothing. [Default]
|
||||
* 1 : Force Vulkan for Linux Steam UI.
|
||||
|
||||
|
||||
=item B<BOX64_SYNC_ROUNDING> =I<0|1>
|
||||
|
||||
Synchronize rounding mode between x86 and native.
|
||||
|
||||
* 0 : Do not synchronize rounding mode. [Default]
|
||||
* 1 : Synchronize rounding mode between x86 and native.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE_COLOR> =I<0|1>
|
||||
|
||||
Enable or disable colored trace output.
|
||||
|
||||
* 0 : Disable colored trace output. [Default]
|
||||
* 1 : Enable colored trace output.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE_EMM> =I<0|1>
|
||||
|
||||
Enable or disable EMM (i.e. MMX) trace output.
|
||||
|
||||
* 0 : Disable EMM trace output. [Default]
|
||||
* 1 : Enable EMM trace output.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE_FILE> =I<XXXX|XXXX%pid|stderr|stdout>
|
||||
|
||||
Send all log and trace to a file instead of `stdout`.
|
||||
|
||||
* XXXX : Send all log and trace to file XXXX.
|
||||
* XXXX%pid : Send all log and trace to file XXXX with pid appended.
|
||||
* stderr : Send all log and trace to `stderr`. [Default]
|
||||
* stdout : Send all log and trace to `stdout`.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE_INIT> =I<0|1|symbolname|0xXXXXXXX-0xYYYYYYY>
|
||||
|
||||
Same as BOX64_TRACE but starts the trace immediately.
|
||||
|
||||
* 0 : Disable trace output. [Default]
|
||||
* 1 : Enable trace output. Trace starts before the initialization of dependencies.
|
||||
* symbolname : Enable trace output for `symbolname` only. Trace starts before the initialization of dependencies.
|
||||
* 0xXXXXXXX-0xYYYYYYY : Enable trace output for the range of address (inclusive-exclusive). Trace starts before the initialization of dependencies.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE_START> =I<0|1|XXXX>
|
||||
|
||||
Start trace after N opcodes executed.
|
||||
|
||||
* 0 : Start trace immediately. [Default]
|
||||
* 1 : Start trace after 1 opcode executed.
|
||||
* XXXX : Start trace after XXXX opcodes executed.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE_XMM> =I<0|1>
|
||||
|
||||
Enable or disable XMM (i.e. SSE) trace output.
|
||||
|
||||
* 0 : Disable XMM trace output. [Default]
|
||||
* 1 : Enable XMM trace output.
|
||||
|
||||
|
||||
=item B<BOX64_TRACE> =I<0|1|symbolname|0xXXXXXXX-0xYYYYYYY>
|
||||
|
||||
Only available on box64 build with trace. Adds trace of all instructions executed, along with a register dump.
|
||||
|
||||
* 0 : Disable trace output. [Default]
|
||||
* 1 : Enable trace output.
|
||||
* symbolname : Enable trace output for `symbolname` only.
|
||||
* 0xXXXXXXX-0xYYYYYYY : Enable trace output for the range of address (inclusive-exclusive).
|
||||
|
||||
|
||||
=item B<BOX64_UNITYPLAYER> =I<0|1>
|
||||
|
||||
Detect UnityPlayer and apply conservative settings.
|
||||
|
||||
* 0 : Does nothing.
|
||||
* 1 : Detect UnityPlayer (Windows or Linux), and apply BOX64_UNITY=1 when detected. [Default]
|
||||
|
||||
|
||||
=item B<BOX64_UNITY> =I<0|1>
|
||||
|
||||
Games is a Unity one.
|
||||
|
||||
* 0 : Does nothing.
|
||||
* 1 : Unity Game, use special detecting code for Windows, apply BOX64_DYNAREC_STRONGMEM=1 for Linux [Default]
|
||||
|
||||
|
||||
=item B<BOX64_WRAP_EGL> =I<0|1>
|
||||
|
||||
Prefer wrapped libs for EGL and GLESv2.
|
||||
|
||||
* 0 : Prefer emulated libs for EGL and GLESv2. [Default]
|
||||
* 1 : Prefer wrapped libs for EGL and GLESv2.
|
||||
|
||||
|
||||
=item B<BOX64_X11GLX> =I<0|1>
|
||||
|
||||
Force Xorg GLX extension to be present.
|
||||
|
||||
* 0 : Do not force Xorg GLX extension to be present. [Default]
|
||||
* 1 : Require Xorg GLX extension when using XQueryExtension.
|
||||
|
||||
|
||||
=item B<BOX64_X11SYNC> =I<0|1>
|
||||
|
||||
Force synchronized operation on X11 display.
|
||||
|
||||
* 0 : Do not force synchronized operation on X11 display. [Default]
|
||||
* 1 : Force synchronized operation on X11 display.
|
||||
|
||||
|
||||
=item B<BOX64_X11THREADS> =I<0|1>
|
||||
|
||||
Call XInitThreads when loading X11. This is mostly for old Loki games with the Loki_Compat library.
|
||||
|
||||
* 0 : Do not call XInitThreads. [Default]
|
||||
* 1 : Call XInitThreads as soon as libX11 is loaded.
|
||||
|
||||
|
||||
=item B<BOX64_X87_NO80BITS> =I<0|1>
|
||||
|
||||
Behavoiur of x87 80bits long double. Available in WowBox64.
|
||||
|
||||
* 0 : Try to handle 80bits long double as precise as possible. [Default]
|
||||
* 1 : Use 64bits double for x87.
|
||||
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
+330
@@ -0,0 +1,330 @@
|
||||
# Usage: python gen.py
|
||||
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
from collections import defaultdict
|
||||
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
usage_file = os.path.join(script_dir, 'usage.json')
|
||||
|
||||
with open(usage_file, 'r') as file:
|
||||
data = json.load(file)
|
||||
|
||||
with open(os.path.join(script_dir, '../USAGE.md'), 'w') as md_file:
|
||||
md_file.write("""<!--- This file is generated by gen.py, do not edit it directly. -->
|
||||
Usage
|
||||
----
|
||||
|
||||
There are many environment variables to control Box64's behaviour, which will be listed below by category.
|
||||
|
||||
There are 2 types of Box64 builds: the Wine WOW64 build (WowBox64) and the regular Linux build. Beware only some of the environment variables are available in WowBox64.
|
||||
|
||||
### Configuration files
|
||||
|
||||
In addition to environment variables, if you're using the regular Linux build, Box64 also looks for 2 places for rcfile by default: the system-wide `/etc/box64.box64rc` and user-specific `~/.box64rc`.
|
||||
While in WowBox64, the configuration file is checked at `%USERPROFILE%/.box64rc` only.
|
||||
Settings priority follows this order (from highest to lowest): `~/.box64rc` > `/etc/box64.box64rc` > environment variables.
|
||||
|
||||
Example configuration:
|
||||
|
||||
```
|
||||
[factorio]
|
||||
BOX64_DYNAREC_SAFEFLAGS=0
|
||||
BOX64_DYNAREC_BIGBLOCK=2
|
||||
BOX64_DYNAREC_FORWARD=1024
|
||||
BOX64_DYNAREC_CALLRET=1
|
||||
```
|
||||
|
||||
This configuration will apply the specified settings application-wide to any executable named `factorio`.
|
||||
|
||||
### Advanced usage for Linux build
|
||||
|
||||
1. **Wildcard Matching**
|
||||
|
||||
Asterisks (`*`) can be used for basic pattern matching in application names. For instance, `[*setup*]` will match any program containing "setup" in its name. Note this implements simple wildcard matching rather than full regex support.
|
||||
2. **Custom Configuration File**
|
||||
|
||||
The `BOX64_RCFILE` environment variable can specify an alternative configuration file instead of the default `/etc/box64.box64rc`.
|
||||
3. **Per-File Settings**
|
||||
|
||||
Sections starting with `/` apply to specific files. For example:
|
||||
```
|
||||
[/d3d9.dll]
|
||||
BOX64_DYNAREC_SAFEFLAGS=0
|
||||
```
|
||||
These settings will only affect the `d3d9.dll` file. This syntax also works for **emulated** Linux libraries, e.g., `[/libstdc++.so.6]`.
|
||||
|
||||
----
|
||||
|
||||
""")
|
||||
|
||||
categories = defaultdict(list)
|
||||
for entry in data:
|
||||
categories[entry["category"]].append(entry)
|
||||
|
||||
# Put "Performance" at the top, then sort the rest alphabetically
|
||||
sorted_categories = sorted(categories.items(), key=lambda x: (x[0] != "Performance", x[0]))
|
||||
for category, entries in sorted_categories:
|
||||
md_file.write(f"## {category}\n\n")
|
||||
for entry in entries:
|
||||
md_file.write(f"### {entry['name']}\n\n{entry['description']}{' Available in WowBox64.' if entry['wine'] else ''}\n\n")
|
||||
for option in entry['options']:
|
||||
md_file.write(f" * {option['key']}: {option['description']} {'[Default]' if option['default'] else ''}\n")
|
||||
md_file.write("\n")
|
||||
|
||||
|
||||
with open(os.path.join(script_dir, '../box64.pod'), 'w') as pod_file:
|
||||
pod_file.write("""=head1 NAME
|
||||
|
||||
box64 - Linux Userspace x86_64 Emulator with a twist
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<box64> [B<--help>] [B<--version>] I<executable>
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
B<Box64> lets you run x86_64 Linux programs (such as games) on non-x86_64 Linux
|
||||
systems, like ARM (host system needs to be 64-bit little-endian). Since B<Box64>
|
||||
uses the native versions of some "system" libraries, like libc, libm, SDL, and
|
||||
OpenGL, it's easy to integrate and use with most applications, and performance
|
||||
can be surprisingly high in many cases. B<Box64> integrates with DynaRec (dynamic
|
||||
recompiler) for the ARM64 platform, providing a speed boost between 5 to 10
|
||||
times faster than using only the interpreter.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
=over 8
|
||||
|
||||
=item B<-h,--help>
|
||||
|
||||
Print box64 help and quit.
|
||||
|
||||
=item B<-v,--version>
|
||||
|
||||
Print box64 version and quit.
|
||||
|
||||
=back
|
||||
|
||||
=head1 BRIEF USAGE
|
||||
|
||||
There are many environment variables to control B<Box64>'s behaviour. In
|
||||
addition to environment variables, B<Box64> also looks for 2 places for rcfile:
|
||||
F</etc/box64.box64rc> and F<~/.box64rc>, in the format of .ini files.
|
||||
Settings priority: F<~/.box64rc> > F</etc/box64.box64rc> > environment variables.
|
||||
Example:
|
||||
|
||||
[factorio]
|
||||
BOX64_DYNAREC_SAFEFLAGS=0
|
||||
BOX64_DYNAREC_BIGBLOCK=2
|
||||
BOX64_DYNAREC_FORWARD=1024
|
||||
BOX64_DYNAREC_CALLRET=1
|
||||
|
||||
=head1 ENVIRONMENT VARIABLES
|
||||
|
||||
=over 8
|
||||
|
||||
""")
|
||||
|
||||
for entry in data:
|
||||
pod_file.write(f"\n=item B<{entry['name']}> =I<{ '|'.join(option['key'] for option in entry['options']) }>\n\n{entry['description']}{' Available in WowBox64.' if entry['wine'] else ''}\n\n")
|
||||
for option in entry['options']:
|
||||
pod_file.write(f" * {option['key']} : {option['description']} {'[Default]' if option['default'] else ''}\n")
|
||||
pod_file.write("\n")
|
||||
|
||||
pod_file.write("""
|
||||
=back
|
||||
|
||||
=cut
|
||||
""")
|
||||
|
||||
####################
|
||||
# Validation
|
||||
####################
|
||||
|
||||
PADDING = 30
|
||||
INCLUDE_BLANK = False
|
||||
|
||||
def get_usage_entry(usage, define):
|
||||
entry = list(e for e in usage if e["name"] == define)
|
||||
if len(entry) == 0:
|
||||
print(f"{define:<{PADDING}}: missing usage.json entry")
|
||||
elif len(entry) > 1:
|
||||
print(f"{define:<{PADDING}}: multiple usage entries found", len(entry))
|
||||
else:
|
||||
return entry[0]
|
||||
return None
|
||||
|
||||
# check `default` uniqueness
|
||||
for entry in data:
|
||||
i = list(d["default"] for d in entry["options"]).count(True)
|
||||
if i > 1:
|
||||
print(f"{entry['name']:<{PADDING}}: multiple default values usage.json")
|
||||
|
||||
|
||||
# regex to match env.h C code
|
||||
regex = {
|
||||
"INTEGER": re.compile(
|
||||
r"^\s*INTEGER\((?P<define>\w+), (?P<name>\w+), (?P<default>\w+), (?P<min>\w+), (?P<max>\w+), (?P<wine>\w+)\)"
|
||||
),
|
||||
"INTEGER64": re.compile(
|
||||
r"^\s*INTEGER64\((?P<define>\w+), (?P<name>\w+), (?P<default>\w+), (?P<wine>\w+)\)"
|
||||
),
|
||||
"BOOLEAN": re.compile(
|
||||
r"^\s*BOOLEAN\((?P<define>\w+), (?P<name>\w+), (?P<default>\w+), (?P<wine>\w+)\)"
|
||||
),
|
||||
"ADDRESS": re.compile(r"^\s*ADDRESS\((?P<define>\w+), (?P<name>\w+), (?P<wine>\w+)\)"),
|
||||
"STRING": re.compile(r"^\s*STRING\((?P<define>\w+), (?P<name>\w+), (?P<wine>\w+)\)"),
|
||||
}
|
||||
|
||||
env_file = os.path.join(script_dir, "../../src/include/env.h")
|
||||
with open(env_file, "r") as file:
|
||||
matches = {}
|
||||
for line in file.readlines():
|
||||
for t, r in regex.items():
|
||||
m = r.search(line)
|
||||
if m:
|
||||
# filter out comments and other non useful code
|
||||
if m.group("define") == "NAME":
|
||||
continue
|
||||
|
||||
if t not in matches:
|
||||
matches[t] = {}
|
||||
if (m.group("define") in matches[t]):
|
||||
# multiple definitions, no default
|
||||
matches[t][m.group("define")]['no_default'] = True
|
||||
break
|
||||
matches[t][m.group("define")] = m.groupdict()
|
||||
matches[t][m.group("define")]['no_default'] = False
|
||||
|
||||
for define, m in matches["INTEGER"].items():
|
||||
name = m["name"]
|
||||
default = None if m["no_default"] or not m["default"].isdigit() else int(m["default"])
|
||||
min = int(m["min"])
|
||||
max = int(m["max"])
|
||||
|
||||
# Check default in valid range
|
||||
if default and (default < min or default > max):
|
||||
print(f"{define:<{PADDING}}: default lays outside of min/max range")
|
||||
|
||||
# Check consistency with usage.json
|
||||
if e := get_usage_entry(data, define):
|
||||
# guess min/max values if possible
|
||||
min2 = max2 = None
|
||||
# blank means that the entry has an 'XXXX' entry which usually indicated that arbitrary values are valid
|
||||
blank = False
|
||||
default2 = None
|
||||
|
||||
if int(m["wine"]) != int(e["wine"]):
|
||||
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
|
||||
|
||||
for o in e["options"]:
|
||||
if o["key"] == "XXXX":
|
||||
blank = True
|
||||
continue
|
||||
|
||||
val = int(o["key"]) # not supposed to fail
|
||||
|
||||
min2 = min2 if min2 is not None and min2 < val else val
|
||||
max2 = max2 if max2 is not None and max2 > val else val
|
||||
|
||||
if o["default"]:
|
||||
default2 = val
|
||||
|
||||
if min2 and min2 != min:
|
||||
if not blank or (blank and INCLUDE_BLANK):
|
||||
print(
|
||||
f"{define:<{PADDING}}: min value mismatch: env.h={min}, usage.json={min2}{(' (possible false positive)' if blank else '')}"
|
||||
)
|
||||
if max2 and max2 != max:
|
||||
if not blank or (blank and INCLUDE_BLANK):
|
||||
print(
|
||||
f"{define:<{PADDING}}: max value mismatch: env.h={max}, usage.json={max2}{(' (possible false positive)' if blank else '')}"
|
||||
)
|
||||
if default2 != default:
|
||||
print(
|
||||
f"{define:<{PADDING}}: default value mismatch: env.h={default}, usage.json={default2}"
|
||||
)
|
||||
|
||||
for define, m in matches['INTEGER64'].items():
|
||||
# similar to INTEGER but without min/max
|
||||
name = m["name"]
|
||||
default = None if m["no_default"] or not m["default"].isdigit() else int(m["default"])
|
||||
|
||||
# Check consistency with usage.json
|
||||
if e := get_usage_entry(data, define):
|
||||
default2 = None
|
||||
|
||||
if int(m["wine"]) != int(e["wine"]):
|
||||
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
|
||||
|
||||
for o in e["options"]:
|
||||
if o["key"] == "XXXX":
|
||||
continue
|
||||
|
||||
val = int(o["key"])
|
||||
|
||||
if o["default"]:
|
||||
default2 = val
|
||||
|
||||
if default2 != default:
|
||||
print(
|
||||
f"{define:<{PADDING}}: default value mismatch: env.h={default}, usage.json={default2}"
|
||||
)
|
||||
|
||||
for define, m in matches["BOOLEAN"].items():
|
||||
name = m["name"]
|
||||
default = None if m["no_default"] or m["default"] not in ["0", "1"] else bool(m["default"])
|
||||
|
||||
# Check consistency with usage.json
|
||||
if e := get_usage_entry(data, define):
|
||||
default2 = None
|
||||
|
||||
if int(m["wine"]) != int(e["wine"]):
|
||||
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
|
||||
|
||||
for o in e["options"]:
|
||||
try:
|
||||
val = bool(o["key"])
|
||||
except ValueError:
|
||||
print(f"{define:<{PADDING}}: failed to parse boolean {o['key']}")
|
||||
|
||||
if o["default"]:
|
||||
default2 = val
|
||||
|
||||
if default2 != default:
|
||||
print(
|
||||
f"{define:<{PADDING}}: default value mismatch: env.h={default}, usage.json={default2}"
|
||||
)
|
||||
|
||||
# ADDRESS and STRING are not that interesting
|
||||
for define, m in matches["ADDRESS"].items():
|
||||
if e := get_usage_entry(data, define):
|
||||
if int(m["wine"]) != int(e["wine"]):
|
||||
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
|
||||
|
||||
for define, m in matches["STRING"].items():
|
||||
# skip BOX64_ENV[1-5] entries, they mismatch but this is fine
|
||||
if define.startswith("BOX64_ENV"):
|
||||
continue
|
||||
if e := get_usage_entry(data, define):
|
||||
if int(m["wine"]) != int(e["wine"]):
|
||||
print(f"{define:<{PADDING}}: wine mismatch: env.h={int(m['wine'])}, usage.json={int(e['wine'])}")
|
||||
|
||||
# check that everything from usage.json is in env.h
|
||||
for e in data:
|
||||
define = e["name"]
|
||||
|
||||
# skip BOX64_ENV[1-5] entries, they mismatch but this is fine
|
||||
if define.startswith("BOX64_ENV"):
|
||||
continue
|
||||
|
||||
found = False
|
||||
for t in matches:
|
||||
for d in matches[t]:
|
||||
if d == define:
|
||||
found = True
|
||||
|
||||
if not found:
|
||||
print(f"{define:<{PADDING}}: missing env.h entry")
|
||||
+2137
File diff suppressed because it is too large.
Load diff
Executable → Regular
File mode changed.
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Executable → Regular
File mode changed.
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 180 KiB |
Vendored
+71
@@ -0,0 +1,71 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/k_cos.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/*
|
||||
* __cos( x, y )
|
||||
* kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
*
|
||||
* Algorithm
|
||||
* 1. Since cos(-x) = cos(x), we need only to consider positive x.
|
||||
* 2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
|
||||
* 3. cos(x) is approximated by a polynomial of degree 14 on
|
||||
* [0,pi/4]
|
||||
* 4 14
|
||||
* cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
|
||||
* where the remez error is
|
||||
*
|
||||
* | 2 4 6 8 10 12 14 | -58
|
||||
* |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x +C6*x )| <= 2
|
||||
* | |
|
||||
*
|
||||
* 4 6 8 10 12 14
|
||||
* 4. let r = C1*x +C2*x +C3*x +C4*x +C5*x +C6*x , then
|
||||
* cos(x) ~ 1 - x*x/2 + r
|
||||
* since cos(x+y) ~ cos(x) - sin(x)*y
|
||||
* ~ cos(x) - x*y,
|
||||
* a correction term is necessary in cos(x) and hence
|
||||
* cos(x+y) = 1 - (x*x/2 - (r - x*y))
|
||||
* For better accuracy, rearrange to
|
||||
* cos(x+y) ~ w + (tmp + (r-x*y))
|
||||
* where w = 1 - x*x/2 and tmp is a tiny correction term
|
||||
* (1 - x*x/2 == w + tmp exactly in infinite precision).
|
||||
* The exactness of w + tmp in infinite precision depends on w
|
||||
* and tmp having the same precision as x. If they have extra
|
||||
* precision due to compiler bugs, then the extra precision is
|
||||
* only good provided it is retained in all terms of the final
|
||||
* expression for cos(). Retention happens in all cases tested
|
||||
* under FreeBSD, so don't pessimize things by forcibly clipping
|
||||
* any extra precision in w.
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
static const double
|
||||
C1 = 4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
|
||||
C2 = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
|
||||
C3 = 2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
|
||||
C4 = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
|
||||
C5 = 2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
|
||||
C6 = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
|
||||
|
||||
double __cos(double x, double y)
|
||||
{
|
||||
double_t hz,z,r,w;
|
||||
|
||||
z = x*x;
|
||||
w = z*z;
|
||||
r = z*(C1+z*(C2+z*C3)) + w*w*(C4+z*(C5+z*C6));
|
||||
hz = 0.5*z;
|
||||
w = 1.0-hz;
|
||||
return w + (((1.0-w)-hz) + (z*r-x*y));
|
||||
}
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
#include "libm.h"
|
||||
|
||||
double __math_divzero(uint32_t sign)
|
||||
{
|
||||
return fp_barrier(sign ? -1.0 : 1.0) / 0.0;
|
||||
}
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
#include "libm.h"
|
||||
|
||||
double __math_invalid(double x)
|
||||
{
|
||||
return (x - x) / (x - x);
|
||||
}
|
||||
Vendored
+190
@@ -0,0 +1,190 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/e_rem_pio2.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*
|
||||
* Optimized by Bruce D. Evans.
|
||||
*/
|
||||
/* __rem_pio2(x,y)
|
||||
*
|
||||
* return the remainder of x rem pi/2 in y[0]+y[1]
|
||||
* use __rem_pio2_large() for large x
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
#if FLT_EVAL_METHOD==0 || FLT_EVAL_METHOD==1
|
||||
#define EPS DBL_EPSILON
|
||||
#elif FLT_EVAL_METHOD==2
|
||||
#define EPS LDBL_EPSILON
|
||||
#endif
|
||||
|
||||
/*
|
||||
* invpio2: 53 bits of 2/pi
|
||||
* pio2_1: first 33 bit of pi/2
|
||||
* pio2_1t: pi/2 - pio2_1
|
||||
* pio2_2: second 33 bit of pi/2
|
||||
* pio2_2t: pi/2 - (pio2_1+pio2_2)
|
||||
* pio2_3: third 33 bit of pi/2
|
||||
* pio2_3t: pi/2 - (pio2_1+pio2_2+pio2_3)
|
||||
*/
|
||||
static const double
|
||||
toint = 1.5/EPS,
|
||||
pio4 = 0x1.921fb54442d18p-1,
|
||||
invpio2 = 6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
|
||||
pio2_1 = 1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
|
||||
pio2_1t = 6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
|
||||
pio2_2 = 6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
|
||||
pio2_2t = 2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
|
||||
pio2_3 = 2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
|
||||
pio2_3t = 8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
|
||||
|
||||
/* caller must handle the case when reduction is not needed: |x| ~<= pi/4 */
|
||||
int __rem_pio2(double x, double *y)
|
||||
{
|
||||
union {double f; uint64_t i;} u = {x};
|
||||
double_t z,w,t,r,fn;
|
||||
double tx[3],ty[2];
|
||||
uint32_t ix;
|
||||
int sign, n, ex, ey, i;
|
||||
|
||||
sign = u.i>>63;
|
||||
ix = u.i>>32 & 0x7fffffff;
|
||||
if (ix <= 0x400f6a7a) { /* |x| ~<= 5pi/4 */
|
||||
if ((ix & 0xfffff) == 0x921fb) /* |x| ~= pi/2 or 2pi/2 */
|
||||
goto medium; /* cancellation -- use medium case */
|
||||
if (ix <= 0x4002d97c) { /* |x| ~<= 3pi/4 */
|
||||
if (!sign) {
|
||||
z = x - pio2_1; /* one round good to 85 bits */
|
||||
y[0] = z - pio2_1t;
|
||||
y[1] = (z-y[0]) - pio2_1t;
|
||||
return 1;
|
||||
} else {
|
||||
z = x + pio2_1;
|
||||
y[0] = z + pio2_1t;
|
||||
y[1] = (z-y[0]) + pio2_1t;
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (!sign) {
|
||||
z = x - 2*pio2_1;
|
||||
y[0] = z - 2*pio2_1t;
|
||||
y[1] = (z-y[0]) - 2*pio2_1t;
|
||||
return 2;
|
||||
} else {
|
||||
z = x + 2*pio2_1;
|
||||
y[0] = z + 2*pio2_1t;
|
||||
y[1] = (z-y[0]) + 2*pio2_1t;
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ix <= 0x401c463b) { /* |x| ~<= 9pi/4 */
|
||||
if (ix <= 0x4015fdbc) { /* |x| ~<= 7pi/4 */
|
||||
if (ix == 0x4012d97c) /* |x| ~= 3pi/2 */
|
||||
goto medium;
|
||||
if (!sign) {
|
||||
z = x - 3*pio2_1;
|
||||
y[0] = z - 3*pio2_1t;
|
||||
y[1] = (z-y[0]) - 3*pio2_1t;
|
||||
return 3;
|
||||
} else {
|
||||
z = x + 3*pio2_1;
|
||||
y[0] = z + 3*pio2_1t;
|
||||
y[1] = (z-y[0]) + 3*pio2_1t;
|
||||
return -3;
|
||||
}
|
||||
} else {
|
||||
if (ix == 0x401921fb) /* |x| ~= 4pi/2 */
|
||||
goto medium;
|
||||
if (!sign) {
|
||||
z = x - 4*pio2_1;
|
||||
y[0] = z - 4*pio2_1t;
|
||||
y[1] = (z-y[0]) - 4*pio2_1t;
|
||||
return 4;
|
||||
} else {
|
||||
z = x + 4*pio2_1;
|
||||
y[0] = z + 4*pio2_1t;
|
||||
y[1] = (z-y[0]) + 4*pio2_1t;
|
||||
return -4;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ix < 0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */
|
||||
medium:
|
||||
/* rint(x/(pi/2)) */
|
||||
fn = rint(x * invpio2);
|
||||
n = (int32_t)fn;
|
||||
r = x - fn*pio2_1;
|
||||
w = fn*pio2_1t; /* 1st round, good to 85 bits */
|
||||
/* Matters with directed rounding. */
|
||||
if (predict_false(r - w < -pio4)) {
|
||||
n--;
|
||||
fn--;
|
||||
r = x - fn*pio2_1;
|
||||
w = fn*pio2_1t;
|
||||
} else if (predict_false(r - w > pio4)) {
|
||||
n++;
|
||||
fn++;
|
||||
r = x - fn*pio2_1;
|
||||
w = fn*pio2_1t;
|
||||
}
|
||||
y[0] = r - w;
|
||||
u.f = y[0];
|
||||
ey = u.i>>52 & 0x7ff;
|
||||
ex = ix>>20;
|
||||
if (ex - ey > 16) { /* 2nd round, good to 118 bits */
|
||||
t = r;
|
||||
w = fn*pio2_2;
|
||||
r = t - w;
|
||||
w = fn*pio2_2t - ((t-r)-w);
|
||||
y[0] = r - w;
|
||||
u.f = y[0];
|
||||
ey = u.i>>52 & 0x7ff;
|
||||
if (ex - ey > 49) { /* 3rd round, good to 151 bits, covers all cases */
|
||||
t = r;
|
||||
w = fn*pio2_3;
|
||||
r = t - w;
|
||||
w = fn*pio2_3t - ((t-r)-w);
|
||||
y[0] = r - w;
|
||||
}
|
||||
}
|
||||
y[1] = (r - y[0]) - w;
|
||||
return n;
|
||||
}
|
||||
/*
|
||||
* all other (large) arguments
|
||||
*/
|
||||
if (ix >= 0x7ff00000) { /* x is inf or NaN */
|
||||
y[0] = y[1] = x - x;
|
||||
return 0;
|
||||
}
|
||||
/* set z = scalbn(|x|,-ilogb(x)+23) */
|
||||
u.f = x;
|
||||
u.i &= (uint64_t)-1>>12;
|
||||
u.i |= (uint64_t)(0x3ff + 23)<<52;
|
||||
z = u.f;
|
||||
for (i=0; i < 2; i++) {
|
||||
tx[i] = (double)(int32_t)z;
|
||||
z = (z-tx[i])*0x1p24;
|
||||
}
|
||||
tx[i] = z;
|
||||
/* skip zero terms, first term is non-zero */
|
||||
while (tx[i] == 0.0)
|
||||
i--;
|
||||
n = __rem_pio2_large(tx,ty,(int)(ix>>20)-(0x3ff+23),i+1,1);
|
||||
if (sign) {
|
||||
y[0] = -ty[0];
|
||||
y[1] = -ty[1];
|
||||
return -n;
|
||||
}
|
||||
y[0] = ty[0];
|
||||
y[1] = ty[1];
|
||||
return n;
|
||||
}
|
||||
Vendored
+442
@@ -0,0 +1,442 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/k_rem_pio2.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/*
|
||||
* __rem_pio2_large(x,y,e0,nx,prec)
|
||||
* double x[],y[]; int e0,nx,prec;
|
||||
*
|
||||
* __rem_pio2_large return the last three digits of N with
|
||||
* y = x - N*pi/2
|
||||
* so that |y| < pi/2.
|
||||
*
|
||||
* The method is to compute the integer (mod 8) and fraction parts of
|
||||
* (2/pi)*x without doing the full multiplication. In general we
|
||||
* skip the part of the product that are known to be a huge integer (
|
||||
* more accurately, = 0 mod 8 ). Thus the number of operations are
|
||||
* independent of the exponent of the input.
|
||||
*
|
||||
* (2/pi) is represented by an array of 24-bit integers in ipio2[].
|
||||
*
|
||||
* Input parameters:
|
||||
* x[] The input value (must be positive) is broken into nx
|
||||
* pieces of 24-bit integers in double precision format.
|
||||
* x[i] will be the i-th 24 bit of x. The scaled exponent
|
||||
* of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
|
||||
* match x's up to 24 bits.
|
||||
*
|
||||
* Example of breaking a double positive z into x[0]+x[1]+x[2]:
|
||||
* e0 = ilogb(z)-23
|
||||
* z = scalbn(z,-e0)
|
||||
* for i = 0,1,2
|
||||
* x[i] = floor(z)
|
||||
* z = (z-x[i])*2**24
|
||||
*
|
||||
*
|
||||
* y[] ouput result in an array of double precision numbers.
|
||||
* The dimension of y[] is:
|
||||
* 24-bit precision 1
|
||||
* 53-bit precision 2
|
||||
* 64-bit precision 2
|
||||
* 113-bit precision 3
|
||||
* The actual value is the sum of them. Thus for 113-bit
|
||||
* precison, one may have to do something like:
|
||||
*
|
||||
* long double t,w,r_head, r_tail;
|
||||
* t = (long double)y[2] + (long double)y[1];
|
||||
* w = (long double)y[0];
|
||||
* r_head = t+w;
|
||||
* r_tail = w - (r_head - t);
|
||||
*
|
||||
* e0 The exponent of x[0]. Must be <= 16360 or you need to
|
||||
* expand the ipio2 table.
|
||||
*
|
||||
* nx dimension of x[]
|
||||
*
|
||||
* prec an integer indicating the precision:
|
||||
* 0 24 bits (single)
|
||||
* 1 53 bits (double)
|
||||
* 2 64 bits (extended)
|
||||
* 3 113 bits (quad)
|
||||
*
|
||||
* External function:
|
||||
* double scalbn(), floor();
|
||||
*
|
||||
*
|
||||
* Here is the description of some local variables:
|
||||
*
|
||||
* jk jk+1 is the initial number of terms of ipio2[] needed
|
||||
* in the computation. The minimum and recommended value
|
||||
* for jk is 3,4,4,6 for single, double, extended, and quad.
|
||||
* jk+1 must be 2 larger than you might expect so that our
|
||||
* recomputation test works. (Up to 24 bits in the integer
|
||||
* part (the 24 bits of it that we compute) and 23 bits in
|
||||
* the fraction part may be lost to cancelation before we
|
||||
* recompute.)
|
||||
*
|
||||
* jz local integer variable indicating the number of
|
||||
* terms of ipio2[] used.
|
||||
*
|
||||
* jx nx - 1
|
||||
*
|
||||
* jv index for pointing to the suitable ipio2[] for the
|
||||
* computation. In general, we want
|
||||
* ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
|
||||
* is an integer. Thus
|
||||
* e0-3-24*jv >= 0 or (e0-3)/24 >= jv
|
||||
* Hence jv = max(0,(e0-3)/24).
|
||||
*
|
||||
* jp jp+1 is the number of terms in PIo2[] needed, jp = jk.
|
||||
*
|
||||
* q[] double array with integral value, representing the
|
||||
* 24-bits chunk of the product of x and 2/pi.
|
||||
*
|
||||
* q0 the corresponding exponent of q[0]. Note that the
|
||||
* exponent for q[i] would be q0-24*i.
|
||||
*
|
||||
* PIo2[] double precision array, obtained by cutting pi/2
|
||||
* into 24 bits chunks.
|
||||
*
|
||||
* f[] ipio2[] in floating point
|
||||
*
|
||||
* iq[] integer array by breaking up q[] in 24-bits chunk.
|
||||
*
|
||||
* fq[] final product of x*(2/pi) in fq[0],..,fq[jk]
|
||||
*
|
||||
* ih integer. If >0 it indicates q[] is >= 0.5, hence
|
||||
* it also indicates the *sign* of the result.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Constants:
|
||||
* The hexadecimal values are the intended ones for the following
|
||||
* constants. The decimal values may be used, provided that the
|
||||
* compiler will convert from decimal to binary accurately enough
|
||||
* to produce the hexadecimal values shown.
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
static const int init_jk[] = {3,4,4,6}; /* initial value for jk */
|
||||
|
||||
/*
|
||||
* Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
|
||||
*
|
||||
* integer array, contains the (24*i)-th to (24*i+23)-th
|
||||
* bit of 2/pi after binary point. The corresponding
|
||||
* floating value is
|
||||
*
|
||||
* ipio2[i] * 2^(-24(i+1)).
|
||||
*
|
||||
* NB: This table must have at least (e0-3)/24 + jk terms.
|
||||
* For quad precision (e0 <= 16360, jk = 6), this is 686.
|
||||
*/
|
||||
static const int32_t ipio2[] = {
|
||||
0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
|
||||
0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
|
||||
0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
|
||||
0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
|
||||
0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
|
||||
0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
|
||||
0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
|
||||
0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
|
||||
0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
|
||||
0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
|
||||
0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
|
||||
|
||||
#if LDBL_MAX_EXP > 1024
|
||||
0x47C419, 0xC367CD, 0xDCE809, 0x2A8359, 0xC4768B, 0x961CA6,
|
||||
0xDDAF44, 0xD15719, 0x053EA5, 0xFF0705, 0x3F7E33, 0xE832C2,
|
||||
0xDE4F98, 0x327DBB, 0xC33D26, 0xEF6B1E, 0x5EF89F, 0x3A1F35,
|
||||
0xCAF27F, 0x1D87F1, 0x21907C, 0x7C246A, 0xFA6ED5, 0x772D30,
|
||||
0x433B15, 0xC614B5, 0x9D19C3, 0xC2C4AD, 0x414D2C, 0x5D000C,
|
||||
0x467D86, 0x2D71E3, 0x9AC69B, 0x006233, 0x7CD2B4, 0x97A7B4,
|
||||
0xD55537, 0xF63ED7, 0x1810A3, 0xFC764D, 0x2A9D64, 0xABD770,
|
||||
0xF87C63, 0x57B07A, 0xE71517, 0x5649C0, 0xD9D63B, 0x3884A7,
|
||||
0xCB2324, 0x778AD6, 0x23545A, 0xB91F00, 0x1B0AF1, 0xDFCE19,
|
||||
0xFF319F, 0x6A1E66, 0x615799, 0x47FBAC, 0xD87F7E, 0xB76522,
|
||||
0x89E832, 0x60BFE6, 0xCDC4EF, 0x09366C, 0xD43F5D, 0xD7DE16,
|
||||
0xDE3B58, 0x929BDE, 0x2822D2, 0xE88628, 0x4D58E2, 0x32CAC6,
|
||||
0x16E308, 0xCB7DE0, 0x50C017, 0xA71DF3, 0x5BE018, 0x34132E,
|
||||
0x621283, 0x014883, 0x5B8EF5, 0x7FB0AD, 0xF2E91E, 0x434A48,
|
||||
0xD36710, 0xD8DDAA, 0x425FAE, 0xCE616A, 0xA4280A, 0xB499D3,
|
||||
0xF2A606, 0x7F775C, 0x83C2A3, 0x883C61, 0x78738A, 0x5A8CAF,
|
||||
0xBDD76F, 0x63A62D, 0xCBBFF4, 0xEF818D, 0x67C126, 0x45CA55,
|
||||
0x36D9CA, 0xD2A828, 0x8D61C2, 0x77C912, 0x142604, 0x9B4612,
|
||||
0xC459C4, 0x44C5C8, 0x91B24D, 0xF31700, 0xAD43D4, 0xE54929,
|
||||
0x10D5FD, 0xFCBE00, 0xCC941E, 0xEECE70, 0xF53E13, 0x80F1EC,
|
||||
0xC3E7B3, 0x28F8C7, 0x940593, 0x3E71C1, 0xB3092E, 0xF3450B,
|
||||
0x9C1288, 0x7B20AB, 0x9FB52E, 0xC29247, 0x2F327B, 0x6D550C,
|
||||
0x90A772, 0x1FE76B, 0x96CB31, 0x4A1679, 0xE27941, 0x89DFF4,
|
||||
0x9794E8, 0x84E6E2, 0x973199, 0x6BED88, 0x365F5F, 0x0EFDBB,
|
||||
0xB49A48, 0x6CA467, 0x427271, 0x325D8D, 0xB8159F, 0x09E5BC,
|
||||
0x25318D, 0x3974F7, 0x1C0530, 0x010C0D, 0x68084B, 0x58EE2C,
|
||||
0x90AA47, 0x02E774, 0x24D6BD, 0xA67DF7, 0x72486E, 0xEF169F,
|
||||
0xA6948E, 0xF691B4, 0x5153D1, 0xF20ACF, 0x339820, 0x7E4BF5,
|
||||
0x6863B2, 0x5F3EDD, 0x035D40, 0x7F8985, 0x295255, 0xC06437,
|
||||
0x10D86D, 0x324832, 0x754C5B, 0xD4714E, 0x6E5445, 0xC1090B,
|
||||
0x69F52A, 0xD56614, 0x9D0727, 0x50045D, 0xDB3BB4, 0xC576EA,
|
||||
0x17F987, 0x7D6B49, 0xBA271D, 0x296996, 0xACCCC6, 0x5414AD,
|
||||
0x6AE290, 0x89D988, 0x50722C, 0xBEA404, 0x940777, 0x7030F3,
|
||||
0x27FC00, 0xA871EA, 0x49C266, 0x3DE064, 0x83DD97, 0x973FA3,
|
||||
0xFD9443, 0x8C860D, 0xDE4131, 0x9D3992, 0x8C70DD, 0xE7B717,
|
||||
0x3BDF08, 0x2B3715, 0xA0805C, 0x93805A, 0x921110, 0xD8E80F,
|
||||
0xAF806C, 0x4BFFDB, 0x0F9038, 0x761859, 0x15A562, 0xBBCB61,
|
||||
0xB989C7, 0xBD4010, 0x04F2D2, 0x277549, 0xF6B6EB, 0xBB22DB,
|
||||
0xAA140A, 0x2F2689, 0x768364, 0x333B09, 0x1A940E, 0xAA3A51,
|
||||
0xC2A31D, 0xAEEDAF, 0x12265C, 0x4DC26D, 0x9C7A2D, 0x9756C0,
|
||||
0x833F03, 0xF6F009, 0x8C402B, 0x99316D, 0x07B439, 0x15200C,
|
||||
0x5BC3D8, 0xC492F5, 0x4BADC6, 0xA5CA4E, 0xCD37A7, 0x36A9E6,
|
||||
0x9492AB, 0x6842DD, 0xDE6319, 0xEF8C76, 0x528B68, 0x37DBFC,
|
||||
0xABA1AE, 0x3115DF, 0xA1AE00, 0xDAFB0C, 0x664D64, 0xB705ED,
|
||||
0x306529, 0xBF5657, 0x3AFF47, 0xB9F96A, 0xF3BE75, 0xDF9328,
|
||||
0x3080AB, 0xF68C66, 0x15CB04, 0x0622FA, 0x1DE4D9, 0xA4B33D,
|
||||
0x8F1B57, 0x09CD36, 0xE9424E, 0xA4BE13, 0xB52333, 0x1AAAF0,
|
||||
0xA8654F, 0xA5C1D2, 0x0F3F0B, 0xCD785B, 0x76F923, 0x048B7B,
|
||||
0x721789, 0x53A6C6, 0xE26E6F, 0x00EBEF, 0x584A9B, 0xB7DAC4,
|
||||
0xBA66AA, 0xCFCF76, 0x1D02D1, 0x2DF1B1, 0xC1998C, 0x77ADC3,
|
||||
0xDA4886, 0xA05DF7, 0xF480C6, 0x2FF0AC, 0x9AECDD, 0xBC5C3F,
|
||||
0x6DDED0, 0x1FC790, 0xB6DB2A, 0x3A25A3, 0x9AAF00, 0x9353AD,
|
||||
0x0457B6, 0xB42D29, 0x7E804B, 0xA707DA, 0x0EAA76, 0xA1597B,
|
||||
0x2A1216, 0x2DB7DC, 0xFDE5FA, 0xFEDB89, 0xFDBE89, 0x6C76E4,
|
||||
0xFCA906, 0x70803E, 0x156E85, 0xFF87FD, 0x073E28, 0x336761,
|
||||
0x86182A, 0xEABD4D, 0xAFE7B3, 0x6E6D8F, 0x396795, 0x5BBF31,
|
||||
0x48D784, 0x16DF30, 0x432DC7, 0x356125, 0xCE70C9, 0xB8CB30,
|
||||
0xFD6CBF, 0xA200A4, 0xE46C05, 0xA0DD5A, 0x476F21, 0xD21262,
|
||||
0x845CB9, 0x496170, 0xE0566B, 0x015299, 0x375550, 0xB7D51E,
|
||||
0xC4F133, 0x5F6E13, 0xE4305D, 0xA92E85, 0xC3B21D, 0x3632A1,
|
||||
0xA4B708, 0xD4B1EA, 0x21F716, 0xE4698F, 0x77FF27, 0x80030C,
|
||||
0x2D408D, 0xA0CD4F, 0x99A520, 0xD3A2B3, 0x0A5D2F, 0x42F9B4,
|
||||
0xCBDA11, 0xD0BE7D, 0xC1DB9B, 0xBD17AB, 0x81A2CA, 0x5C6A08,
|
||||
0x17552E, 0x550027, 0xF0147F, 0x8607E1, 0x640B14, 0x8D4196,
|
||||
0xDEBE87, 0x2AFDDA, 0xB6256B, 0x34897B, 0xFEF305, 0x9EBFB9,
|
||||
0x4F6A68, 0xA82A4A, 0x5AC44F, 0xBCF82D, 0x985AD7, 0x95C7F4,
|
||||
0x8D4D0D, 0xA63A20, 0x5F57A4, 0xB13F14, 0x953880, 0x0120CC,
|
||||
0x86DD71, 0xB6DEC9, 0xF560BF, 0x11654D, 0x6B0701, 0xACB08C,
|
||||
0xD0C0B2, 0x485551, 0x0EFB1E, 0xC37295, 0x3B06A3, 0x3540C0,
|
||||
0x7BDC06, 0xCC45E0, 0xFA294E, 0xC8CAD6, 0x41F3E8, 0xDE647C,
|
||||
0xD8649B, 0x31BED9, 0xC397A4, 0xD45877, 0xC5E369, 0x13DAF0,
|
||||
0x3C3ABA, 0x461846, 0x5F7555, 0xF5BDD2, 0xC6926E, 0x5D2EAC,
|
||||
0xED440E, 0x423E1C, 0x87C461, 0xE9FD29, 0xF3D6E7, 0xCA7C22,
|
||||
0x35916F, 0xC5E008, 0x8DD7FF, 0xE26A6E, 0xC6FDB0, 0xC10893,
|
||||
0x745D7C, 0xB2AD6B, 0x9D6ECD, 0x7B723E, 0x6A11C6, 0xA9CFF7,
|
||||
0xDF7329, 0xBAC9B5, 0x5100B7, 0x0DB2E2, 0x24BA74, 0x607DE5,
|
||||
0x8AD874, 0x2C150D, 0x0C1881, 0x94667E, 0x162901, 0x767A9F,
|
||||
0xBEFDFD, 0xEF4556, 0x367ED9, 0x13D9EC, 0xB9BA8B, 0xFC97C4,
|
||||
0x27A831, 0xC36EF1, 0x36C594, 0x56A8D8, 0xB5A8B4, 0x0ECCCF,
|
||||
0x2D8912, 0x34576F, 0x89562C, 0xE3CE99, 0xB920D6, 0xAA5E6B,
|
||||
0x9C2A3E, 0xCC5F11, 0x4A0BFD, 0xFBF4E1, 0x6D3B8E, 0x2C86E2,
|
||||
0x84D4E9, 0xA9B4FC, 0xD1EEEF, 0xC9352E, 0x61392F, 0x442138,
|
||||
0xC8D91B, 0x0AFC81, 0x6A4AFB, 0xD81C2F, 0x84B453, 0x8C994E,
|
||||
0xCC2254, 0xDC552A, 0xD6C6C0, 0x96190B, 0xB8701A, 0x649569,
|
||||
0x605A26, 0xEE523F, 0x0F117F, 0x11B5F4, 0xF5CBFC, 0x2DBC34,
|
||||
0xEEBC34, 0xCC5DE8, 0x605EDD, 0x9B8E67, 0xEF3392, 0xB817C9,
|
||||
0x9B5861, 0xBC57E1, 0xC68351, 0x103ED8, 0x4871DD, 0xDD1C2D,
|
||||
0xA118AF, 0x462C21, 0xD7F359, 0x987AD9, 0xC0549E, 0xFA864F,
|
||||
0xFC0656, 0xAE79E5, 0x362289, 0x22AD38, 0xDC9367, 0xAAE855,
|
||||
0x382682, 0x9BE7CA, 0xA40D51, 0xB13399, 0x0ED7A9, 0x480569,
|
||||
0xF0B265, 0xA7887F, 0x974C88, 0x36D1F9, 0xB39221, 0x4A827B,
|
||||
0x21CF98, 0xDC9F40, 0x5547DC, 0x3A74E1, 0x42EB67, 0xDF9DFE,
|
||||
0x5FD45E, 0xA4677B, 0x7AACBA, 0xA2F655, 0x23882B, 0x55BA41,
|
||||
0x086E59, 0x862A21, 0x834739, 0xE6E389, 0xD49EE5, 0x40FB49,
|
||||
0xE956FF, 0xCA0F1C, 0x8A59C5, 0x2BFA94, 0xC5C1D3, 0xCFC50F,
|
||||
0xAE5ADB, 0x86C547, 0x624385, 0x3B8621, 0x94792C, 0x876110,
|
||||
0x7B4C2A, 0x1A2C80, 0x12BF43, 0x902688, 0x893C78, 0xE4C4A8,
|
||||
0x7BDBE5, 0xC23AC4, 0xEAF426, 0x8A67F7, 0xBF920D, 0x2BA365,
|
||||
0xB1933D, 0x0B7CBD, 0xDC51A4, 0x63DD27, 0xDDE169, 0x19949A,
|
||||
0x9529A8, 0x28CE68, 0xB4ED09, 0x209F44, 0xCA984E, 0x638270,
|
||||
0x237C7E, 0x32B90F, 0x8EF5A7, 0xE75614, 0x08F121, 0x2A9DB5,
|
||||
0x4D7E6F, 0x5119A5, 0xABF9B5, 0xD6DF82, 0x61DD96, 0x023616,
|
||||
0x9F3AC4, 0xA1A283, 0x6DED72, 0x7A8D39, 0xA9B882, 0x5C326B,
|
||||
0x5B2746, 0xED3400, 0x7700D2, 0x55F4FC, 0x4D5901, 0x8071E0,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const double PIo2[] = {
|
||||
1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
|
||||
7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
|
||||
5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
|
||||
3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
|
||||
1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
|
||||
1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
|
||||
2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
|
||||
2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
|
||||
};
|
||||
|
||||
int __rem_pio2_large(double *x, double *y, int e0, int nx, int prec)
|
||||
{
|
||||
int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
|
||||
double z,fw,f[20],fq[20],q[20];
|
||||
|
||||
/* initialize jk*/
|
||||
jk = init_jk[prec];
|
||||
jp = jk;
|
||||
|
||||
/* determine jx,jv,q0, note that 3>q0 */
|
||||
jx = nx-1;
|
||||
jv = (e0-3)/24; if(jv<0) jv=0;
|
||||
q0 = e0-24*(jv+1);
|
||||
|
||||
/* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
|
||||
j = jv-jx; m = jx+jk;
|
||||
for (i=0; i<=m; i++,j++)
|
||||
f[i] = j<0 ? 0.0 : (double)ipio2[j];
|
||||
|
||||
/* compute q[0],q[1],...q[jk] */
|
||||
for (i=0; i<=jk; i++) {
|
||||
for (j=0,fw=0.0; j<=jx; j++)
|
||||
fw += x[j]*f[jx+i-j];
|
||||
q[i] = fw;
|
||||
}
|
||||
|
||||
jz = jk;
|
||||
recompute:
|
||||
/* distill q[] into iq[] reversingly */
|
||||
for (i=0,j=jz,z=q[jz]; j>0; i++,j--) {
|
||||
fw = (double)(int32_t)(0x1p-24*z);
|
||||
iq[i] = (int32_t)(z - 0x1p24*fw);
|
||||
z = q[j-1]+fw;
|
||||
}
|
||||
|
||||
/* compute n */
|
||||
z = scalbn(z,q0); /* actual value of z */
|
||||
z -= 8.0*floor(z*0.125); /* trim off integer >= 8 */
|
||||
n = (int32_t)z;
|
||||
z -= (double)n;
|
||||
ih = 0;
|
||||
if (q0 > 0) { /* need iq[jz-1] to determine n */
|
||||
i = iq[jz-1]>>(24-q0); n += i;
|
||||
iq[jz-1] -= i<<(24-q0);
|
||||
ih = iq[jz-1]>>(23-q0);
|
||||
}
|
||||
else if (q0 == 0) ih = iq[jz-1]>>23;
|
||||
else if (z >= 0.5) ih = 2;
|
||||
|
||||
if (ih > 0) { /* q > 0.5 */
|
||||
n += 1; carry = 0;
|
||||
for (i=0; i<jz; i++) { /* compute 1-q */
|
||||
j = iq[i];
|
||||
if (carry == 0) {
|
||||
if (j != 0) {
|
||||
carry = 1;
|
||||
iq[i] = 0x1000000 - j;
|
||||
}
|
||||
} else
|
||||
iq[i] = 0xffffff - j;
|
||||
}
|
||||
if (q0 > 0) { /* rare case: chance is 1 in 12 */
|
||||
switch(q0) {
|
||||
case 1:
|
||||
iq[jz-1] &= 0x7fffff; break;
|
||||
case 2:
|
||||
iq[jz-1] &= 0x3fffff; break;
|
||||
}
|
||||
}
|
||||
if (ih == 2) {
|
||||
z = 1.0 - z;
|
||||
if (carry != 0)
|
||||
z -= scalbn(1.0,q0);
|
||||
}
|
||||
}
|
||||
|
||||
/* check if recomputation is needed */
|
||||
if (z == 0.0) {
|
||||
j = 0;
|
||||
for (i=jz-1; i>=jk; i--) j |= iq[i];
|
||||
if (j == 0) { /* need recomputation */
|
||||
for (k=1; iq[jk-k]==0; k++); /* k = no. of terms needed */
|
||||
|
||||
for (i=jz+1; i<=jz+k; i++) { /* add q[jz+1] to q[jz+k] */
|
||||
f[jx+i] = (double)ipio2[jv+i];
|
||||
for (j=0,fw=0.0; j<=jx; j++)
|
||||
fw += x[j]*f[jx+i-j];
|
||||
q[i] = fw;
|
||||
}
|
||||
jz += k;
|
||||
goto recompute;
|
||||
}
|
||||
}
|
||||
|
||||
/* chop off zero terms */
|
||||
if (z == 0.0) {
|
||||
jz -= 1;
|
||||
q0 -= 24;
|
||||
while (iq[jz] == 0) {
|
||||
jz--;
|
||||
q0 -= 24;
|
||||
}
|
||||
} else { /* break z into 24-bit if necessary */
|
||||
z = scalbn(z,-q0);
|
||||
if (z >= 0x1p24) {
|
||||
fw = (double)(int32_t)(0x1p-24*z);
|
||||
iq[jz] = (int32_t)(z - 0x1p24*fw);
|
||||
jz += 1;
|
||||
q0 += 24;
|
||||
iq[jz] = (int32_t)fw;
|
||||
} else
|
||||
iq[jz] = (int32_t)z;
|
||||
}
|
||||
|
||||
/* convert integer "bit" chunk to floating-point value */
|
||||
fw = scalbn(1.0,q0);
|
||||
for (i=jz; i>=0; i--) {
|
||||
q[i] = fw*(double)iq[i];
|
||||
fw *= 0x1p-24;
|
||||
}
|
||||
|
||||
/* compute PIo2[0,...,jp]*q[jz,...,0] */
|
||||
for(i=jz; i>=0; i--) {
|
||||
for (fw=0.0,k=0; k<=jp && k<=jz-i; k++)
|
||||
fw += PIo2[k]*q[i+k];
|
||||
fq[jz-i] = fw;
|
||||
}
|
||||
|
||||
/* compress fq[] into y[] */
|
||||
switch(prec) {
|
||||
case 0:
|
||||
fw = 0.0;
|
||||
for (i=jz; i>=0; i--)
|
||||
fw += fq[i];
|
||||
y[0] = ih==0 ? fw : -fw;
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
fw = 0.0;
|
||||
for (i=jz; i>=0; i--)
|
||||
fw += fq[i];
|
||||
// TODO: drop excess precision here once double_t is used
|
||||
fw = (double)fw;
|
||||
y[0] = ih==0 ? fw : -fw;
|
||||
fw = fq[0]-fw;
|
||||
for (i=1; i<=jz; i++)
|
||||
fw += fq[i];
|
||||
y[1] = ih==0 ? fw : -fw;
|
||||
break;
|
||||
case 3: /* painful */
|
||||
for (i=jz; i>0; i--) {
|
||||
fw = fq[i-1]+fq[i];
|
||||
fq[i] += fq[i-1]-fw;
|
||||
fq[i-1] = fw;
|
||||
}
|
||||
for (i=jz; i>1; i--) {
|
||||
fw = fq[i-1]+fq[i];
|
||||
fq[i] += fq[i-1]-fw;
|
||||
fq[i-1] = fw;
|
||||
}
|
||||
for (fw=0.0,i=jz; i>=2; i--)
|
||||
fw += fq[i];
|
||||
if (ih==0) {
|
||||
y[0] = fq[0]; y[1] = fq[1]; y[2] = fw;
|
||||
} else {
|
||||
y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
|
||||
}
|
||||
}
|
||||
return n&7;
|
||||
}
|
||||
Vendored
+64
@@ -0,0 +1,64 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/k_sin.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunSoft, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/* __sin( x, y, iy)
|
||||
* kernel sin function on ~[-pi/4, pi/4] (except on -0), pi/4 ~ 0.7854
|
||||
* Input x is assumed to be bounded by ~pi/4 in magnitude.
|
||||
* Input y is the tail of x.
|
||||
* Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
|
||||
*
|
||||
* Algorithm
|
||||
* 1. Since sin(-x) = -sin(x), we need only to consider positive x.
|
||||
* 2. Callers must return sin(-0) = -0 without calling here since our
|
||||
* odd polynomial is not evaluated in a way that preserves -0.
|
||||
* Callers may do the optimization sin(x) ~ x for tiny x.
|
||||
* 3. sin(x) is approximated by a polynomial of degree 13 on
|
||||
* [0,pi/4]
|
||||
* 3 13
|
||||
* sin(x) ~ x + S1*x + ... + S6*x
|
||||
* where
|
||||
*
|
||||
* |sin(x) 2 4 6 8 10 12 | -58
|
||||
* |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x +S6*x )| <= 2
|
||||
* | x |
|
||||
*
|
||||
* 4. sin(x+y) = sin(x) + sin'(x')*y
|
||||
* ~ sin(x) + (1-x*x/2)*y
|
||||
* For better accuracy, let
|
||||
* 3 2 2 2 2
|
||||
* r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
|
||||
* then 3 2
|
||||
* sin(x) = x + (S1*x + (x *(r-y/2)+y))
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
static const double
|
||||
S1 = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
|
||||
S2 = 8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
|
||||
S3 = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
|
||||
S4 = 2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
|
||||
S5 = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
|
||||
S6 = 1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
|
||||
|
||||
double __sin(double x, double y, int iy)
|
||||
{
|
||||
double_t z,r,v,w;
|
||||
|
||||
z = x*x;
|
||||
w = z*z;
|
||||
r = S2 + z*(S3 + z*S4) + z*w*(S5 + z*S6);
|
||||
v = z*x;
|
||||
if (iy == 0)
|
||||
return x + v*(S1 + z*r);
|
||||
else
|
||||
return x - ((z*(0.5*y - v*r) - y) - v*S1);
|
||||
}
|
||||
Vendored
+79
@@ -0,0 +1,79 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_cos.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/* cos(x)
|
||||
* Return cosine function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __sin ... sine function on [-pi/4,pi/4]
|
||||
* __cos ... cosine function on [-pi/4,pi/4]
|
||||
* __rem_pio2 ... argument reduction routine
|
||||
*
|
||||
* Method.
|
||||
* Let S,C and T denote the sin, cos and tan respectively on
|
||||
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
|
||||
* in [-pi/4 , +pi/4], and let n = k mod 4.
|
||||
* We have
|
||||
*
|
||||
* n sin(x) cos(x) tan(x)
|
||||
* ----------------------------------------------------------
|
||||
* 0 S C T
|
||||
* 1 C -S -1/T
|
||||
* 2 -S -C T
|
||||
* 3 -C S -1/T
|
||||
* ----------------------------------------------------------
|
||||
*
|
||||
* Special cases:
|
||||
* Let trig be any of sin, cos, or tan.
|
||||
* trig(+-INF) is NaN, with signals;
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
double __cdecl cos(double x)
|
||||
{
|
||||
double y[2];
|
||||
uint32_t ix;
|
||||
unsigned n;
|
||||
|
||||
GET_HIGH_WORD(ix, x);
|
||||
ix &= 0x7fffffff;
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
if (ix <= 0x3fe921fb) {
|
||||
if (ix < 0x3e46a09e) { /* |x| < 2**-27 * sqrt(2) */
|
||||
/* raise inexact if x!=0 */
|
||||
FORCE_EVAL(x + 0x1p120f);
|
||||
return 1.0;
|
||||
}
|
||||
return __cos(x, 0);
|
||||
}
|
||||
|
||||
/* cos(Inf or NaN) is NaN */
|
||||
if (isinf(x))
|
||||
return math_error(_DOMAIN, "cos", x, 0, x - x);
|
||||
if (ix >= 0x7ff00000)
|
||||
return x-x;
|
||||
|
||||
/* argument reduction */
|
||||
n = __rem_pio2(x, y);
|
||||
switch (n&3) {
|
||||
case 0: return __cos(y[0], y[1]);
|
||||
case 1: return -__sin(y[0], y[1], 1);
|
||||
case 2: return -__cos(y[0], y[1]);
|
||||
default:
|
||||
return __sin(y[0], y[1], 1);
|
||||
}
|
||||
}
|
||||
Vendored
+130
@@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Double-precision 2^x function.
|
||||
*
|
||||
* Copyright (c) 2018, Arm Limited.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include "libm.h"
|
||||
#include "exp_data.h"
|
||||
|
||||
#define N (1 << EXP_TABLE_BITS)
|
||||
#define Shift __exp_data.exp2_shift
|
||||
#define T __exp_data.tab
|
||||
#define C1 __exp_data.exp2_poly[0]
|
||||
#define C2 __exp_data.exp2_poly[1]
|
||||
#define C3 __exp_data.exp2_poly[2]
|
||||
#define C4 __exp_data.exp2_poly[3]
|
||||
#define C5 __exp_data.exp2_poly[4]
|
||||
|
||||
/* Handle cases that may overflow or underflow when computing the result that
|
||||
is scale*(1+TMP) without intermediate rounding. The bit representation of
|
||||
scale is in SBITS, however it has a computed exponent that may have
|
||||
overflown into the sign bit so that needs to be adjusted before using it as
|
||||
a double. (int32_t)KI is the k used in the argument reduction and exponent
|
||||
adjustment of scale, positive k here means the result may overflow and
|
||||
negative k means the result may underflow. */
|
||||
static inline double specialcase(double_t tmp, uint64_t sbits, uint64_t ki)
|
||||
{
|
||||
double_t scale, y;
|
||||
|
||||
if ((ki & 0x80000000) == 0) {
|
||||
/* k > 0, the exponent of scale might have overflowed by 1. */
|
||||
sbits -= 1ull << 52;
|
||||
scale = asdouble(sbits);
|
||||
y = 2 * (scale + scale * tmp);
|
||||
return eval_as_double(y);
|
||||
}
|
||||
/* k < 0, need special care in the subnormal range. */
|
||||
sbits += 1022ull << 52;
|
||||
scale = asdouble(sbits);
|
||||
y = scale + scale * tmp;
|
||||
if (y < 1.0) {
|
||||
/* Round y to the right precision before scaling it into the subnormal
|
||||
range to avoid double rounding that can cause 0.5+E/2 ulp error where
|
||||
E is the worst-case ulp error outside the subnormal range. So this
|
||||
is only useful if the goal is better than 1 ulp worst-case error. */
|
||||
double_t hi, lo;
|
||||
lo = scale - y + scale * tmp;
|
||||
hi = 1.0 + y;
|
||||
lo = 1.0 - hi + y + lo;
|
||||
y = eval_as_double(hi + lo) - 1.0;
|
||||
/* Avoid -0.0 with downward rounding. */
|
||||
if (WANT_ROUNDING && y == 0.0)
|
||||
y = 0.0;
|
||||
/* The underflow exception needs to be signaled explicitly. */
|
||||
fp_force_eval(fp_barrier(0x1p-1022) * 0x1p-1022);
|
||||
}
|
||||
y = 0x1p-1022 * y;
|
||||
return eval_as_double(y);
|
||||
}
|
||||
|
||||
/* Top 12 bits of a double (sign and exponent bits). */
|
||||
static inline uint32_t top12(double x)
|
||||
{
|
||||
return asuint64(x) >> 52;
|
||||
}
|
||||
|
||||
double __cdecl exp2(double x)
|
||||
{
|
||||
uint32_t abstop;
|
||||
uint64_t ki, idx, top, sbits;
|
||||
double_t kd, r, r2, scale, tail, tmp;
|
||||
|
||||
abstop = top12(x) & 0x7ff;
|
||||
if (predict_false(abstop - top12(0x1p-54) >= top12(512.0) - top12(0x1p-54))) {
|
||||
if (abstop - top12(0x1p-54) >= 0x80000000)
|
||||
/* Avoid spurious underflow for tiny x. */
|
||||
/* Note: 0 is common input. */
|
||||
return WANT_ROUNDING ? 1.0 + x : 1.0;
|
||||
if (abstop >= top12(1024.0)) {
|
||||
if (asuint64(x) == asuint64(-INFINITY))
|
||||
return 0.0;
|
||||
if (abstop >= top12(INFINITY))
|
||||
return 1.0 + x;
|
||||
if (!(asuint64(x) >> 63)) {
|
||||
errno = ERANGE;
|
||||
return fp_barrier(DBL_MAX) * DBL_MAX;
|
||||
}
|
||||
else if (x <= -2147483648.0) {
|
||||
fp_barrier(x + 0x1p120f);
|
||||
return 0;
|
||||
}
|
||||
else if (asuint64(x) >= asuint64(-1075.0)) {
|
||||
errno = ERANGE;
|
||||
fp_barrier(x + 0x1p120f);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (2 * asuint64(x) > 2 * asuint64(928.0))
|
||||
/* Large x is special cased below. */
|
||||
abstop = 0;
|
||||
}
|
||||
|
||||
/* exp2(x) = 2^(k/N) * 2^r, with 2^r in [2^(-1/2N),2^(1/2N)]. */
|
||||
/* x = k/N + r, with int k and r in [-1/2N, 1/2N]. */
|
||||
kd = eval_as_double(x + Shift);
|
||||
ki = asuint64(kd); /* k. */
|
||||
kd -= Shift; /* k/N for int k. */
|
||||
r = x - kd;
|
||||
/* 2^(k/N) ~= scale * (1 + tail). */
|
||||
idx = 2 * (ki % N);
|
||||
top = ki << (52 - EXP_TABLE_BITS);
|
||||
tail = asdouble(T[idx]);
|
||||
/* This is only a valid scale when -1023*N < k < 1024*N. */
|
||||
sbits = T[idx + 1] + top;
|
||||
/* exp2(x) = 2^(k/N) * 2^r ~= scale + scale * (tail + 2^r - 1). */
|
||||
/* Evaluation is optimized assuming superscalar pipelined execution. */
|
||||
r2 = r * r;
|
||||
/* Without fma the worst case error is 0.5/N ulp larger. */
|
||||
/* Worst case error is less than 0.5+0.86/N+(abs poly error * 2^53) ulp. */
|
||||
tmp = tail + r * C1 + r2 * (C2 + r * C3) + r2 * r2 * (C4 + r * C5);
|
||||
if (predict_false(abstop == 0))
|
||||
return specialcase(tmp, sbits, ki);
|
||||
scale = asdouble(sbits);
|
||||
/* Note: tmp == 0 or |tmp| > 2^-65 and scale > 2^-928, so there
|
||||
is no spurious underflow here even without fma. */
|
||||
return eval_as_double(scale + scale * tmp);
|
||||
}
|
||||
Vendored
+182
@@ -0,0 +1,182 @@
|
||||
/*
|
||||
* Shared data between exp, exp2 and pow.
|
||||
*
|
||||
* Copyright (c) 2018, Arm Limited.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "exp_data.h"
|
||||
|
||||
#define N (1 << EXP_TABLE_BITS)
|
||||
|
||||
const struct exp_data __exp_data = {
|
||||
// N/ln2
|
||||
.invln2N = 0x1.71547652b82fep0 * N,
|
||||
// -ln2/N
|
||||
.negln2hiN = -0x1.62e42fefa0000p-8,
|
||||
.negln2loN = -0x1.cf79abc9e3b3ap-47,
|
||||
// Used for rounding when !TOINT_INTRINSICS
|
||||
#if EXP_USE_TOINT_NARROW
|
||||
.shift = 0x1800000000.8p0,
|
||||
#else
|
||||
.shift = 0x1.8p52,
|
||||
#endif
|
||||
// exp polynomial coefficients.
|
||||
.poly = {
|
||||
// abs error: 1.555*2^-66
|
||||
// ulp error: 0.509 (0.511 without fma)
|
||||
// if |x| < ln2/256+eps
|
||||
// abs error if |x| < ln2/256+0x1p-15: 1.09*2^-65
|
||||
// abs error if |x| < ln2/128: 1.7145*2^-56
|
||||
0x1.ffffffffffdbdp-2,
|
||||
0x1.555555555543cp-3,
|
||||
0x1.55555cf172b91p-5,
|
||||
0x1.1111167a4d017p-7,
|
||||
},
|
||||
.exp2_shift = 0x1.8p52 / N,
|
||||
// exp2 polynomial coefficients.
|
||||
.exp2_poly = {
|
||||
// abs error: 1.2195*2^-65
|
||||
// ulp error: 0.507 (0.511 without fma)
|
||||
// if |x| < 1/256
|
||||
// abs error if |x| < 1/128: 1.9941*2^-56
|
||||
0x1.62e42fefa39efp-1,
|
||||
0x1.ebfbdff82c424p-3,
|
||||
0x1.c6b08d70cf4b5p-5,
|
||||
0x1.3b2abd24650ccp-7,
|
||||
0x1.5d7e09b4e3a84p-10,
|
||||
},
|
||||
// 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N)
|
||||
// tab[2*k] = asuint64(T[k])
|
||||
// tab[2*k+1] = asuint64(H[k]) - (k << 52)/N
|
||||
.tab = {
|
||||
0x0, 0x3ff0000000000000,
|
||||
0x3c9b3b4f1a88bf6e, 0x3feff63da9fb3335,
|
||||
0xbc7160139cd8dc5d, 0x3fefec9a3e778061,
|
||||
0xbc905e7a108766d1, 0x3fefe315e86e7f85,
|
||||
0x3c8cd2523567f613, 0x3fefd9b0d3158574,
|
||||
0xbc8bce8023f98efa, 0x3fefd06b29ddf6de,
|
||||
0x3c60f74e61e6c861, 0x3fefc74518759bc8,
|
||||
0x3c90a3e45b33d399, 0x3fefbe3ecac6f383,
|
||||
0x3c979aa65d837b6d, 0x3fefb5586cf9890f,
|
||||
0x3c8eb51a92fdeffc, 0x3fefac922b7247f7,
|
||||
0x3c3ebe3d702f9cd1, 0x3fefa3ec32d3d1a2,
|
||||
0xbc6a033489906e0b, 0x3fef9b66affed31b,
|
||||
0xbc9556522a2fbd0e, 0x3fef9301d0125b51,
|
||||
0xbc5080ef8c4eea55, 0x3fef8abdc06c31cc,
|
||||
0xbc91c923b9d5f416, 0x3fef829aaea92de0,
|
||||
0x3c80d3e3e95c55af, 0x3fef7a98c8a58e51,
|
||||
0xbc801b15eaa59348, 0x3fef72b83c7d517b,
|
||||
0xbc8f1ff055de323d, 0x3fef6af9388c8dea,
|
||||
0x3c8b898c3f1353bf, 0x3fef635beb6fcb75,
|
||||
0xbc96d99c7611eb26, 0x3fef5be084045cd4,
|
||||
0x3c9aecf73e3a2f60, 0x3fef54873168b9aa,
|
||||
0xbc8fe782cb86389d, 0x3fef4d5022fcd91d,
|
||||
0x3c8a6f4144a6c38d, 0x3fef463b88628cd6,
|
||||
0x3c807a05b0e4047d, 0x3fef3f49917ddc96,
|
||||
0x3c968efde3a8a894, 0x3fef387a6e756238,
|
||||
0x3c875e18f274487d, 0x3fef31ce4fb2a63f,
|
||||
0x3c80472b981fe7f2, 0x3fef2b4565e27cdd,
|
||||
0xbc96b87b3f71085e, 0x3fef24dfe1f56381,
|
||||
0x3c82f7e16d09ab31, 0x3fef1e9df51fdee1,
|
||||
0xbc3d219b1a6fbffa, 0x3fef187fd0dad990,
|
||||
0x3c8b3782720c0ab4, 0x3fef1285a6e4030b,
|
||||
0x3c6e149289cecb8f, 0x3fef0cafa93e2f56,
|
||||
0x3c834d754db0abb6, 0x3fef06fe0a31b715,
|
||||
0x3c864201e2ac744c, 0x3fef0170fc4cd831,
|
||||
0x3c8fdd395dd3f84a, 0x3feefc08b26416ff,
|
||||
0xbc86a3803b8e5b04, 0x3feef6c55f929ff1,
|
||||
0xbc924aedcc4b5068, 0x3feef1a7373aa9cb,
|
||||
0xbc9907f81b512d8e, 0x3feeecae6d05d866,
|
||||
0xbc71d1e83e9436d2, 0x3feee7db34e59ff7,
|
||||
0xbc991919b3ce1b15, 0x3feee32dc313a8e5,
|
||||
0x3c859f48a72a4c6d, 0x3feedea64c123422,
|
||||
0xbc9312607a28698a, 0x3feeda4504ac801c,
|
||||
0xbc58a78f4817895b, 0x3feed60a21f72e2a,
|
||||
0xbc7c2c9b67499a1b, 0x3feed1f5d950a897,
|
||||
0x3c4363ed60c2ac11, 0x3feece086061892d,
|
||||
0x3c9666093b0664ef, 0x3feeca41ed1d0057,
|
||||
0x3c6ecce1daa10379, 0x3feec6a2b5c13cd0,
|
||||
0x3c93ff8e3f0f1230, 0x3feec32af0d7d3de,
|
||||
0x3c7690cebb7aafb0, 0x3feebfdad5362a27,
|
||||
0x3c931dbdeb54e077, 0x3feebcb299fddd0d,
|
||||
0xbc8f94340071a38e, 0x3feeb9b2769d2ca7,
|
||||
0xbc87deccdc93a349, 0x3feeb6daa2cf6642,
|
||||
0xbc78dec6bd0f385f, 0x3feeb42b569d4f82,
|
||||
0xbc861246ec7b5cf6, 0x3feeb1a4ca5d920f,
|
||||
0x3c93350518fdd78e, 0x3feeaf4736b527da,
|
||||
0x3c7b98b72f8a9b05, 0x3feead12d497c7fd,
|
||||
0x3c9063e1e21c5409, 0x3feeab07dd485429,
|
||||
0x3c34c7855019c6ea, 0x3feea9268a5946b7,
|
||||
0x3c9432e62b64c035, 0x3feea76f15ad2148,
|
||||
0xbc8ce44a6199769f, 0x3feea5e1b976dc09,
|
||||
0xbc8c33c53bef4da8, 0x3feea47eb03a5585,
|
||||
0xbc845378892be9ae, 0x3feea34634ccc320,
|
||||
0xbc93cedd78565858, 0x3feea23882552225,
|
||||
0x3c5710aa807e1964, 0x3feea155d44ca973,
|
||||
0xbc93b3efbf5e2228, 0x3feea09e667f3bcd,
|
||||
0xbc6a12ad8734b982, 0x3feea012750bdabf,
|
||||
0xbc6367efb86da9ee, 0x3fee9fb23c651a2f,
|
||||
0xbc80dc3d54e08851, 0x3fee9f7df9519484,
|
||||
0xbc781f647e5a3ecf, 0x3fee9f75e8ec5f74,
|
||||
0xbc86ee4ac08b7db0, 0x3fee9f9a48a58174,
|
||||
0xbc8619321e55e68a, 0x3fee9feb564267c9,
|
||||
0x3c909ccb5e09d4d3, 0x3feea0694fde5d3f,
|
||||
0xbc7b32dcb94da51d, 0x3feea11473eb0187,
|
||||
0x3c94ecfd5467c06b, 0x3feea1ed0130c132,
|
||||
0x3c65ebe1abd66c55, 0x3feea2f336cf4e62,
|
||||
0xbc88a1c52fb3cf42, 0x3feea427543e1a12,
|
||||
0xbc9369b6f13b3734, 0x3feea589994cce13,
|
||||
0xbc805e843a19ff1e, 0x3feea71a4623c7ad,
|
||||
0xbc94d450d872576e, 0x3feea8d99b4492ed,
|
||||
0x3c90ad675b0e8a00, 0x3feeaac7d98a6699,
|
||||
0x3c8db72fc1f0eab4, 0x3feeace5422aa0db,
|
||||
0xbc65b6609cc5e7ff, 0x3feeaf3216b5448c,
|
||||
0x3c7bf68359f35f44, 0x3feeb1ae99157736,
|
||||
0xbc93091fa71e3d83, 0x3feeb45b0b91ffc6,
|
||||
0xbc5da9b88b6c1e29, 0x3feeb737b0cdc5e5,
|
||||
0xbc6c23f97c90b959, 0x3feeba44cbc8520f,
|
||||
0xbc92434322f4f9aa, 0x3feebd829fde4e50,
|
||||
0xbc85ca6cd7668e4b, 0x3feec0f170ca07ba,
|
||||
0x3c71affc2b91ce27, 0x3feec49182a3f090,
|
||||
0x3c6dd235e10a73bb, 0x3feec86319e32323,
|
||||
0xbc87c50422622263, 0x3feecc667b5de565,
|
||||
0x3c8b1c86e3e231d5, 0x3feed09bec4a2d33,
|
||||
0xbc91bbd1d3bcbb15, 0x3feed503b23e255d,
|
||||
0x3c90cc319cee31d2, 0x3feed99e1330b358,
|
||||
0x3c8469846e735ab3, 0x3feede6b5579fdbf,
|
||||
0xbc82dfcd978e9db4, 0x3feee36bbfd3f37a,
|
||||
0x3c8c1a7792cb3387, 0x3feee89f995ad3ad,
|
||||
0xbc907b8f4ad1d9fa, 0x3feeee07298db666,
|
||||
0xbc55c3d956dcaeba, 0x3feef3a2b84f15fb,
|
||||
0xbc90a40e3da6f640, 0x3feef9728de5593a,
|
||||
0xbc68d6f438ad9334, 0x3feeff76f2fb5e47,
|
||||
0xbc91eee26b588a35, 0x3fef05b030a1064a,
|
||||
0x3c74ffd70a5fddcd, 0x3fef0c1e904bc1d2,
|
||||
0xbc91bdfbfa9298ac, 0x3fef12c25bd71e09,
|
||||
0x3c736eae30af0cb3, 0x3fef199bdd85529c,
|
||||
0x3c8ee3325c9ffd94, 0x3fef20ab5fffd07a,
|
||||
0x3c84e08fd10959ac, 0x3fef27f12e57d14b,
|
||||
0x3c63cdaf384e1a67, 0x3fef2f6d9406e7b5,
|
||||
0x3c676b2c6c921968, 0x3fef3720dcef9069,
|
||||
0xbc808a1883ccb5d2, 0x3fef3f0b555dc3fa,
|
||||
0xbc8fad5d3ffffa6f, 0x3fef472d4a07897c,
|
||||
0xbc900dae3875a949, 0x3fef4f87080d89f2,
|
||||
0x3c74a385a63d07a7, 0x3fef5818dcfba487,
|
||||
0xbc82919e2040220f, 0x3fef60e316c98398,
|
||||
0x3c8e5a50d5c192ac, 0x3fef69e603db3285,
|
||||
0x3c843a59ac016b4b, 0x3fef7321f301b460,
|
||||
0xbc82d52107b43e1f, 0x3fef7c97337b9b5f,
|
||||
0xbc892ab93b470dc9, 0x3fef864614f5a129,
|
||||
0x3c74b604603a88d3, 0x3fef902ee78b3ff6,
|
||||
0x3c83c5ec519d7271, 0x3fef9a51fbc74c83,
|
||||
0xbc8ff7128fd391f0, 0x3fefa4afa2a490da,
|
||||
0xbc8dae98e223747d, 0x3fefaf482d8e67f1,
|
||||
0x3c8ec3bc41aa2008, 0x3fefba1bee615a27,
|
||||
0x3c842b94c3a9eb32, 0x3fefc52b376bba97,
|
||||
0x3c8a64a931d185ee, 0x3fefd0765b6e4540,
|
||||
0xbc8e37bae43be3ed, 0x3fefdbfdad9cbe14,
|
||||
0x3c77893b4d91cd9d, 0x3fefe7c1819e90d8,
|
||||
0x3c5305c14160cc89, 0x3feff3c22b8f71f1,
|
||||
},
|
||||
};
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Arm Limited.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
#ifndef _EXP_DATA_H
|
||||
#define _EXP_DATA_H
|
||||
|
||||
#include <features.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define EXP_TABLE_BITS 7
|
||||
#define EXP_POLY_ORDER 5
|
||||
#define EXP_USE_TOINT_NARROW 0
|
||||
#define EXP2_POLY_ORDER 5
|
||||
extern hidden const struct exp_data {
|
||||
double invln2N;
|
||||
double shift;
|
||||
double negln2hiN;
|
||||
double negln2loN;
|
||||
double poly[4]; /* Last four coefficients. */
|
||||
double exp2_shift;
|
||||
double exp2_poly[EXP2_POLY_ORDER];
|
||||
uint64_t tab[2*(1 << EXP_TABLE_BITS)];
|
||||
} __exp_data;
|
||||
|
||||
#endif
|
||||
Vendored
+202
@@ -0,0 +1,202 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_expm1.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/* expm1(x)
|
||||
* Returns exp(x)-1, the exponential of x minus 1.
|
||||
*
|
||||
* Method
|
||||
* 1. Argument reduction:
|
||||
* Given x, find r and integer k such that
|
||||
*
|
||||
* x = k*ln2 + r, |r| <= 0.5*ln2 ~ 0.34658
|
||||
*
|
||||
* Here a correction term c will be computed to compensate
|
||||
* the error in r when rounded to a floating-point number.
|
||||
*
|
||||
* 2. Approximating expm1(r) by a special rational function on
|
||||
* the interval [0,0.34658]:
|
||||
* Since
|
||||
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 - r^4/360 + ...
|
||||
* we define R1(r*r) by
|
||||
* r*(exp(r)+1)/(exp(r)-1) = 2+ r^2/6 * R1(r*r)
|
||||
* That is,
|
||||
* R1(r**2) = 6/r *((exp(r)+1)/(exp(r)-1) - 2/r)
|
||||
* = 6/r * ( 1 + 2.0*(1/(exp(r)-1) - 1/r))
|
||||
* = 1 - r^2/60 + r^4/2520 - r^6/100800 + ...
|
||||
* We use a special Remez algorithm on [0,0.347] to generate
|
||||
* a polynomial of degree 5 in r*r to approximate R1. The
|
||||
* maximum error of this polynomial approximation is bounded
|
||||
* by 2**-61. In other words,
|
||||
* R1(z) ~ 1.0 + Q1*z + Q2*z**2 + Q3*z**3 + Q4*z**4 + Q5*z**5
|
||||
* where Q1 = -1.6666666666666567384E-2,
|
||||
* Q2 = 3.9682539681370365873E-4,
|
||||
* Q3 = -9.9206344733435987357E-6,
|
||||
* Q4 = 2.5051361420808517002E-7,
|
||||
* Q5 = -6.2843505682382617102E-9;
|
||||
* z = r*r,
|
||||
* with error bounded by
|
||||
* | 5 | -61
|
||||
* | 1.0+Q1*z+...+Q5*z - R1(z) | <= 2
|
||||
* | |
|
||||
*
|
||||
* expm1(r) = exp(r)-1 is then computed by the following
|
||||
* specific way which minimize the accumulation rounding error:
|
||||
* 2 3
|
||||
* r r [ 3 - (R1 + R1*r/2) ]
|
||||
* expm1(r) = r + --- + --- * [--------------------]
|
||||
* 2 2 [ 6 - r*(3 - R1*r/2) ]
|
||||
*
|
||||
* To compensate the error in the argument reduction, we use
|
||||
* expm1(r+c) = expm1(r) + c + expm1(r)*c
|
||||
* ~ expm1(r) + c + r*c
|
||||
* Thus c+r*c will be added in as the correction terms for
|
||||
* expm1(r+c). Now rearrange the term to avoid optimization
|
||||
* screw up:
|
||||
* ( 2 2 )
|
||||
* ({ ( r [ R1 - (3 - R1*r/2) ] ) } r )
|
||||
* expm1(r+c)~r - ({r*(--- * [--------------------]-c)-c} - --- )
|
||||
* ({ ( 2 [ 6 - r*(3 - R1*r/2) ] ) } 2 )
|
||||
* ( )
|
||||
*
|
||||
* = r - E
|
||||
* 3. Scale back to obtain expm1(x):
|
||||
* From step 1, we have
|
||||
* expm1(x) = either 2^k*[expm1(r)+1] - 1
|
||||
* = or 2^k*[expm1(r) + (1-2^-k)]
|
||||
* 4. Implementation notes:
|
||||
* (A). To save one multiplication, we scale the coefficient Qi
|
||||
* to Qi*2^i, and replace z by (x^2)/2.
|
||||
* (B). To achieve maximum accuracy, we compute expm1(x) by
|
||||
* (i) if x < -56*ln2, return -1.0, (raise inexact if x!=inf)
|
||||
* (ii) if k=0, return r-E
|
||||
* (iii) if k=-1, return 0.5*(r-E)-0.5
|
||||
* (iv) if k=1 if r < -0.25, return 2*((r+0.5)- E)
|
||||
* else return 1.0+2.0*(r-E);
|
||||
* (v) if (k<-2||k>56) return 2^k(1-(E-r)) - 1 (or exp(x)-1)
|
||||
* (vi) if k <= 20, return 2^k((1-2^-k)-(E-r)), else
|
||||
* (vii) return 2^k(1-((E+2^-k)-r))
|
||||
*
|
||||
* Special cases:
|
||||
* expm1(INF) is INF, expm1(NaN) is NaN;
|
||||
* expm1(-INF) is -1, and
|
||||
* for finite argument, only expm1(0)=0 is exact.
|
||||
*
|
||||
* Accuracy:
|
||||
* according to an error analysis, the error is always less than
|
||||
* 1 ulp (unit in the last place).
|
||||
*
|
||||
* Misc. info.
|
||||
* For IEEE double
|
||||
* if x > 7.09782712893383973096e+02 then expm1(x) overflow
|
||||
*
|
||||
* Constants:
|
||||
* The hexadecimal values are the intended ones for the following
|
||||
* constants. The decimal values may be used, provided that the
|
||||
* compiler will convert from decimal to binary accurately enough
|
||||
* to produce the hexadecimal values shown.
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
static const double
|
||||
o_threshold = 7.09782712893383973096e+02, /* 0x40862E42, 0xFEFA39EF */
|
||||
ln2_hi = 6.93147180369123816490e-01, /* 0x3fe62e42, 0xfee00000 */
|
||||
ln2_lo = 1.90821492927058770002e-10, /* 0x3dea39ef, 0x35793c76 */
|
||||
invln2 = 1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
|
||||
/* Scaled Q's: Qn_here = 2**n * Qn_above, for R(2*z) where z = hxs = x*x/2: */
|
||||
Q1 = -3.33333333333331316428e-02, /* BFA11111 111110F4 */
|
||||
Q2 = 1.58730158725481460165e-03, /* 3F5A01A0 19FE5585 */
|
||||
Q3 = -7.93650757867487942473e-05, /* BF14CE19 9EAADBB7 */
|
||||
Q4 = 4.00821782732936239552e-06, /* 3ED0CFCA 86E65239 */
|
||||
Q5 = -2.01099218183624371326e-07; /* BE8AFDB7 6E09C32D */
|
||||
|
||||
double __cdecl expm1(double x)
|
||||
{
|
||||
double_t y,hi,lo,c,t,e,hxs,hfx,r1,twopk;
|
||||
union {double f; uint64_t i;} u = {x};
|
||||
uint32_t hx = u.i>>32 & 0x7fffffff;
|
||||
int k, sign = u.i>>63;
|
||||
|
||||
/* filter out huge and non-finite argument */
|
||||
if (hx >= 0x4043687A) { /* if |x|>=56*ln2 */
|
||||
if (isnan(x))
|
||||
return x;
|
||||
if (isinf(x))
|
||||
return sign ? -1 : x;
|
||||
if (sign)
|
||||
return math_error(_UNDERFLOW, "exp", x, 0, -1);
|
||||
if (x > o_threshold) {
|
||||
return math_error(_OVERFLOW, "exp", x, 0, x * 0x1p1023);
|
||||
}
|
||||
}
|
||||
|
||||
/* argument reduction */
|
||||
if (hx > 0x3fd62e42) { /* if |x| > 0.5 ln2 */
|
||||
if (hx < 0x3FF0A2B2) { /* and |x| < 1.5 ln2 */
|
||||
if (!sign) {
|
||||
hi = x - ln2_hi;
|
||||
lo = ln2_lo;
|
||||
k = 1;
|
||||
} else {
|
||||
hi = x + ln2_hi;
|
||||
lo = -ln2_lo;
|
||||
k = -1;
|
||||
}
|
||||
} else {
|
||||
k = invln2*x + (sign ? -0.5 : 0.5);
|
||||
t = k;
|
||||
hi = x - t*ln2_hi; /* t*ln2_hi is exact here */
|
||||
lo = t*ln2_lo;
|
||||
}
|
||||
x = hi-lo;
|
||||
c = (hi-x)-lo;
|
||||
} else if (hx < 0x3c900000) { /* |x| < 2**-54, return x */
|
||||
if (hx < 0x00100000)
|
||||
FORCE_EVAL((float)x);
|
||||
return x;
|
||||
} else
|
||||
k = 0;
|
||||
|
||||
/* x is now in primary range */
|
||||
hfx = 0.5*x;
|
||||
hxs = x*hfx;
|
||||
r1 = 1.0+hxs*(Q1+hxs*(Q2+hxs*(Q3+hxs*(Q4+hxs*Q5))));
|
||||
t = 3.0-r1*hfx;
|
||||
e = hxs*((r1-t)/(6.0 - x*t));
|
||||
if (k == 0) /* c is 0 */
|
||||
return x - (x*e-hxs);
|
||||
e = x*(e-c) - c;
|
||||
e -= hxs;
|
||||
/* exp(x) ~ 2^k (x_reduced - e + 1) */
|
||||
if (k == -1)
|
||||
return 0.5*(x-e) - 0.5;
|
||||
if (k == 1) {
|
||||
if (x < -0.25)
|
||||
return -2.0*(e-(x+0.5));
|
||||
return 1.0+2.0*(x-e);
|
||||
}
|
||||
u.i = (uint64_t)(0x3ff + k)<<52; /* 2^k */
|
||||
twopk = u.f;
|
||||
if (k < 0 || k > 56) { /* suffice to return exp(x)-1 */
|
||||
y = x - e + 1.0;
|
||||
if (k == 1024)
|
||||
y = y*2.0*0x1p1023;
|
||||
else
|
||||
y = y*twopk;
|
||||
return y - 1.0;
|
||||
}
|
||||
u.i = (uint64_t)(0x3ff - k)<<52; /* 2^-k */
|
||||
if (k < 20)
|
||||
y = (x-e+(1-u.f))*twopk;
|
||||
else
|
||||
y = (x-(e+u.f)+1)*twopk;
|
||||
return y;
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
|
||||
double __cdecl frexp(double x, int *e)
|
||||
{
|
||||
union { double d; uint64_t i; } y = { x };
|
||||
int ee = y.i>>52 & 0x7ff;
|
||||
|
||||
if (!ee) {
|
||||
if (x) {
|
||||
x = frexp(x*0x1p64, e);
|
||||
*e -= 64;
|
||||
} else *e = 0;
|
||||
return x;
|
||||
} else if (ee == 0x7ff) {
|
||||
return x;
|
||||
}
|
||||
|
||||
*e = ee - 0x3fe;
|
||||
y.i &= 0x800fffffffffffffull;
|
||||
y.i |= 0x3fe0000000000000ull;
|
||||
return y.d;
|
||||
}
|
||||
Vendored
+8
@@ -0,0 +1,8 @@
|
||||
#ifndef FEATURES_H
|
||||
#define FEATURES_H
|
||||
|
||||
#define weak
|
||||
#define hidden
|
||||
#define weak_alias(old, new)
|
||||
|
||||
#endif
|
||||
Vendored
+282
@@ -0,0 +1,282 @@
|
||||
#ifndef _LIBM_H
|
||||
#define _LIBM_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <float.h>
|
||||
#include <math.h>
|
||||
#include <errno.h>
|
||||
#include <features.h>
|
||||
|
||||
typedef float float_t;
|
||||
typedef double double_t;
|
||||
|
||||
hidden double math_error(int type, const char *name, double arg1, double arg2, double retval);
|
||||
|
||||
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
union ldshape {
|
||||
long double f;
|
||||
struct {
|
||||
uint64_t m;
|
||||
uint16_t se;
|
||||
} i;
|
||||
};
|
||||
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
|
||||
/* This is the m68k variant of 80-bit long double, and this definition only works
|
||||
* on archs where the alignment requirement of uint64_t is <= 4. */
|
||||
union ldshape {
|
||||
long double f;
|
||||
struct {
|
||||
uint16_t se;
|
||||
uint16_t pad;
|
||||
uint64_t m;
|
||||
} i;
|
||||
};
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
union ldshape {
|
||||
long double f;
|
||||
struct {
|
||||
uint64_t lo;
|
||||
uint32_t mid;
|
||||
uint16_t top;
|
||||
uint16_t se;
|
||||
} i;
|
||||
struct {
|
||||
uint64_t lo;
|
||||
uint64_t hi;
|
||||
} i2;
|
||||
};
|
||||
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 && __BYTE_ORDER == __BIG_ENDIAN
|
||||
union ldshape {
|
||||
long double f;
|
||||
struct {
|
||||
uint16_t se;
|
||||
uint16_t top;
|
||||
uint32_t mid;
|
||||
uint64_t lo;
|
||||
} i;
|
||||
struct {
|
||||
uint64_t hi;
|
||||
uint64_t lo;
|
||||
} i2;
|
||||
};
|
||||
#else
|
||||
#error Unsupported long double representation
|
||||
#endif
|
||||
|
||||
/* Support non-nearest rounding mode. */
|
||||
#define WANT_ROUNDING 1
|
||||
/* Support signaling NaNs. */
|
||||
#define WANT_SNAN 0
|
||||
|
||||
#if WANT_SNAN
|
||||
#error SNaN is unsupported
|
||||
#else
|
||||
#define issignalingf_inline(x) 0
|
||||
#define issignaling_inline(x) 0
|
||||
#endif
|
||||
|
||||
#ifndef TOINT_INTRINSICS
|
||||
#define TOINT_INTRINSICS 0
|
||||
#endif
|
||||
|
||||
#if TOINT_INTRINSICS
|
||||
/* Round x to nearest int in all rounding modes, ties have to be rounded
|
||||
consistently with converttoint so the results match. If the result
|
||||
would be outside of [-2^31, 2^31-1] then the semantics is unspecified. */
|
||||
static double_t roundtoint(double_t);
|
||||
|
||||
/* Convert x to nearest int in all rounding modes, ties have to be rounded
|
||||
consistently with roundtoint. If the result is not representible in an
|
||||
int32_t then the semantics is unspecified. */
|
||||
static int32_t converttoint(double_t);
|
||||
#endif
|
||||
|
||||
/* Helps static branch prediction so hot path can be better optimized. */
|
||||
#ifdef __GNUC__
|
||||
#define predict_true(x) __builtin_expect(!!(x), 1)
|
||||
#define predict_false(x) __builtin_expect(x, 0)
|
||||
#else
|
||||
#define predict_true(x) (x)
|
||||
#define predict_false(x) (x)
|
||||
#endif
|
||||
|
||||
/* Evaluate an expression as the specified type. With standard excess
|
||||
precision handling a type cast or assignment is enough (with
|
||||
-ffloat-store an assignment is required, in old compilers argument
|
||||
passing and return statement may not drop excess precision).
|
||||
|
||||
If compiled without -ffloat-store or -fexcess-precision=standard,
|
||||
an extra volatile qualifier here will force limiting the precision. */
|
||||
|
||||
static inline float eval_as_float(float x)
|
||||
{
|
||||
volatile float y = x;
|
||||
return y;
|
||||
}
|
||||
|
||||
static inline double eval_as_double(double x)
|
||||
{
|
||||
volatile double y = x;
|
||||
return y;
|
||||
}
|
||||
|
||||
/* fp_barrier returns its input, but limits code transformations
|
||||
as if it had a side-effect (e.g. observable io) and returned
|
||||
an arbitrary value. */
|
||||
|
||||
#ifndef fp_barrierf
|
||||
#define fp_barrierf fp_barrierf
|
||||
static inline float fp_barrierf(float x)
|
||||
{
|
||||
volatile float y = x;
|
||||
return y;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef fp_barrier
|
||||
#define fp_barrier fp_barrier
|
||||
static inline double fp_barrier(double x)
|
||||
{
|
||||
volatile double y = x;
|
||||
return y;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef fp_barrierl
|
||||
#define fp_barrierl fp_barrierl
|
||||
static inline long double fp_barrierl(long double x)
|
||||
{
|
||||
volatile long double y = x;
|
||||
return y;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* fp_force_eval ensures that the input value is computed when that's
|
||||
otherwise unused. To prevent the constant folding of the input
|
||||
expression, an additional fp_barrier may be needed or a compilation
|
||||
mode that does so (e.g. -frounding-math in gcc). Then it can be
|
||||
used to evaluate an expression for its fenv side-effects only. */
|
||||
|
||||
#ifndef fp_force_evalf
|
||||
#define fp_force_evalf fp_force_evalf
|
||||
static inline void fp_force_evalf(float x)
|
||||
{
|
||||
volatile float y;
|
||||
y = x;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef fp_force_eval
|
||||
#define fp_force_eval fp_force_eval
|
||||
static inline void fp_force_eval(double x)
|
||||
{
|
||||
volatile double y;
|
||||
y = x;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef fp_force_evall
|
||||
#define fp_force_evall fp_force_evall
|
||||
static inline void fp_force_evall(long double x)
|
||||
{
|
||||
volatile long double y;
|
||||
y = x;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define FORCE_EVAL(x) do { \
|
||||
if (sizeof(x) == sizeof(float)) { \
|
||||
fp_force_evalf(x); \
|
||||
} else if (sizeof(x) == sizeof(double)) { \
|
||||
fp_force_eval(x); \
|
||||
} else { \
|
||||
fp_force_evall(x); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define asuint(f) ((union{float _f; uint32_t _i;}){f})._i
|
||||
#define asfloat(i) ((union{uint32_t _i; float _f;}){i})._f
|
||||
#define asuint64(f) ((union{double _f; uint64_t _i;}){f})._i
|
||||
#define asdouble(i) ((union{uint64_t _i; double _f;}){i})._f
|
||||
|
||||
#define EXTRACT_WORDS(hi,lo,d) \
|
||||
do { \
|
||||
uint64_t __u = asuint64(d); \
|
||||
(hi) = __u >> 32; \
|
||||
(lo) = (uint32_t)__u; \
|
||||
} while (0)
|
||||
|
||||
#define GET_HIGH_WORD(hi,d) \
|
||||
do { \
|
||||
(hi) = asuint64(d) >> 32; \
|
||||
} while (0)
|
||||
|
||||
#define GET_LOW_WORD(lo,d) \
|
||||
do { \
|
||||
(lo) = (uint32_t)asuint64(d); \
|
||||
} while (0)
|
||||
|
||||
#define INSERT_WORDS(d,hi,lo) \
|
||||
do { \
|
||||
(d) = asdouble(((uint64_t)(hi)<<32) | (uint32_t)(lo)); \
|
||||
} while (0)
|
||||
|
||||
#define SET_HIGH_WORD(d,hi) \
|
||||
INSERT_WORDS(d, hi, (uint32_t)asuint64(d))
|
||||
|
||||
#define SET_LOW_WORD(d,lo) \
|
||||
INSERT_WORDS(d, asuint64(d)>>32, lo)
|
||||
|
||||
#define GET_FLOAT_WORD(w,d) \
|
||||
do { \
|
||||
(w) = asuint(d); \
|
||||
} while (0)
|
||||
|
||||
#define SET_FLOAT_WORD(d,w) \
|
||||
do { \
|
||||
(d) = asfloat(w); \
|
||||
} while (0)
|
||||
|
||||
hidden int __rem_pio2_large(double*,double*,int,int,int);
|
||||
|
||||
hidden int __rem_pio2(double,double*);
|
||||
hidden double __sin(double,double,int);
|
||||
hidden double __cos(double,double);
|
||||
hidden double __tan(double,double,int);
|
||||
hidden double __expo2(double,double);
|
||||
|
||||
hidden int __rem_pio2f(float,double*);
|
||||
hidden float __sindf(double);
|
||||
hidden float __cosdf(double);
|
||||
hidden float __tandf(double,int);
|
||||
hidden float __expo2f(float,float);
|
||||
|
||||
hidden int __rem_pio2l(long double, long double *);
|
||||
hidden long double __sinl(long double, long double, int);
|
||||
hidden long double __cosl(long double, long double);
|
||||
hidden long double __tanl(long double, long double, int);
|
||||
|
||||
hidden long double __polevll(long double, const long double *, int);
|
||||
hidden long double __p1evll(long double, const long double *, int);
|
||||
|
||||
extern int __signgam;
|
||||
hidden double __lgamma_r(double, int *);
|
||||
hidden float __lgammaf_r(float, int *);
|
||||
|
||||
/* error handling functions */
|
||||
hidden float __math_xflowf(uint32_t, float);
|
||||
hidden float __math_uflowf(uint32_t);
|
||||
hidden float __math_oflowf(uint32_t);
|
||||
hidden float __math_divzerof(uint32_t);
|
||||
hidden float __math_invalidf(float);
|
||||
hidden double __math_xflow(uint32_t, double);
|
||||
hidden double __math_uflow(uint32_t);
|
||||
hidden double __math_oflow(uint32_t);
|
||||
hidden double __math_divzero(uint32_t);
|
||||
hidden double __math_invalid(double);
|
||||
#if LDBL_MANT_DIG != DBL_MANT_DIG
|
||||
hidden long double __math_invalidl(long double);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Vendored
+6
@@ -0,0 +1,6 @@
|
||||
#include <math.h>
|
||||
|
||||
double __cdecl ldexp(double x, int n)
|
||||
{
|
||||
return scalbn(x, n);
|
||||
}
|
||||
Vendored
+126
@@ -0,0 +1,126 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_log1p.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/* double log1p(double x)
|
||||
* Return the natural logarithm of 1+x.
|
||||
*
|
||||
* Method :
|
||||
* 1. Argument Reduction: find k and f such that
|
||||
* 1+x = 2^k * (1+f),
|
||||
* where sqrt(2)/2 < 1+f < sqrt(2) .
|
||||
*
|
||||
* Note. If k=0, then f=x is exact. However, if k!=0, then f
|
||||
* may not be representable exactly. In that case, a correction
|
||||
* term is need. Let u=1+x rounded. Let c = (1+x)-u, then
|
||||
* log(1+x) - log(u) ~ c/u. Thus, we proceed to compute log(u),
|
||||
* and add back the correction term c/u.
|
||||
* (Note: when x > 2**53, one can simply return log(x))
|
||||
*
|
||||
* 2. Approximation of log(1+f): See log.c
|
||||
*
|
||||
* 3. Finally, log1p(x) = k*ln2 + log(1+f) + c/u. See log.c
|
||||
*
|
||||
* Special cases:
|
||||
* log1p(x) is NaN with signal if x < -1 (including -INF) ;
|
||||
* log1p(+INF) is +INF; log1p(-1) is -INF with signal;
|
||||
* log1p(NaN) is that NaN with no signal.
|
||||
*
|
||||
* Accuracy:
|
||||
* according to an error analysis, the error is always less than
|
||||
* 1 ulp (unit in the last place).
|
||||
*
|
||||
* Constants:
|
||||
* The hexadecimal values are the intended ones for the following
|
||||
* constants. The decimal values may be used, provided that the
|
||||
* compiler will convert from decimal to binary accurately enough
|
||||
* to produce the hexadecimal values shown.
|
||||
*
|
||||
* Note: Assuming log() return accurate answer, the following
|
||||
* algorithm can be used to compute log1p(x) to within a few ULP:
|
||||
*
|
||||
* u = 1+x;
|
||||
* if(u==1.0) return x ; else
|
||||
* return log(u)*(x/(u-1.0));
|
||||
*
|
||||
* See HP-15C Advanced Functions Handbook, p.193.
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
static const double
|
||||
ln2_hi = 6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
|
||||
ln2_lo = 1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
|
||||
Lg1 = 6.666666666666735130e-01, /* 3FE55555 55555593 */
|
||||
Lg2 = 3.999999999940941908e-01, /* 3FD99999 9997FA04 */
|
||||
Lg3 = 2.857142874366239149e-01, /* 3FD24924 94229359 */
|
||||
Lg4 = 2.222219843214978396e-01, /* 3FCC71C5 1D8E78AF */
|
||||
Lg5 = 1.818357216161805012e-01, /* 3FC74664 96CB03DE */
|
||||
Lg6 = 1.531383769920937332e-01, /* 3FC39A09 D078C69F */
|
||||
Lg7 = 1.479819860511658591e-01; /* 3FC2F112 DF3E5244 */
|
||||
|
||||
double __cdecl log1p(double x)
|
||||
{
|
||||
union {double f; uint64_t i;} u = {x};
|
||||
double_t hfsq,f,c,s,z,R,w,t1,t2,dk;
|
||||
uint32_t hx,hu;
|
||||
int k;
|
||||
|
||||
hx = u.i>>32;
|
||||
k = 1;
|
||||
if (hx < 0x3fda827a || hx>>31) { /* 1+x < sqrt(2)+ */
|
||||
if (hx >= 0xbff00000) { /* x <= -1.0 */
|
||||
if (x == -1) {
|
||||
errno = ERANGE;
|
||||
return x/0.0; /* log1p(-1) = -inf */
|
||||
}
|
||||
errno = EDOM;
|
||||
return (x-x)/0.0; /* log1p(x<-1) = NaN */
|
||||
}
|
||||
if (hx<<1 < 0x3ca00000<<1) { /* |x| < 2**-53 */
|
||||
fp_barrier(x + 0x1p120f);
|
||||
/* underflow if subnormal */
|
||||
if ((hx&0x7ff00000) == 0)
|
||||
FORCE_EVAL((float)x);
|
||||
return x;
|
||||
}
|
||||
if (hx <= 0xbfd2bec4) { /* sqrt(2)/2- <= 1+x < sqrt(2)+ */
|
||||
k = 0;
|
||||
c = 0;
|
||||
f = x;
|
||||
}
|
||||
} else if (hx >= 0x7ff00000)
|
||||
return x;
|
||||
if (k) {
|
||||
u.f = 1 + x;
|
||||
hu = u.i>>32;
|
||||
hu += 0x3ff00000 - 0x3fe6a09e;
|
||||
k = (int)(hu>>20) - 0x3ff;
|
||||
/* correction term ~ log(1+x)-log(u), avoid underflow in c/u */
|
||||
if (k < 54) {
|
||||
c = k >= 2 ? 1-(u.f-x) : x-(u.f-1);
|
||||
c /= u.f;
|
||||
} else
|
||||
c = 0;
|
||||
/* reduce u into [sqrt(2)/2, sqrt(2)] */
|
||||
hu = (hu&0x000fffff) + 0x3fe6a09e;
|
||||
u.i = (uint64_t)hu<<32 | (u.i&0xffffffff);
|
||||
f = u.f - 1;
|
||||
}
|
||||
hfsq = 0.5*f*f;
|
||||
s = f/(2.0+f);
|
||||
z = s*s;
|
||||
w = z*z;
|
||||
t1 = w*(Lg2+w*(Lg4+w*Lg6));
|
||||
t2 = z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
|
||||
R = t2 + t1;
|
||||
dk = k;
|
||||
return s*(hfsq+R) + (dk*ln2_lo+c) - hfsq + f + dk*ln2_hi;
|
||||
}
|
||||
Vendored
+128
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Double-precision log2(x) function.
|
||||
*
|
||||
* Copyright (c) 2018, Arm Limited.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include "libm.h"
|
||||
#include "log2_data.h"
|
||||
|
||||
#define T __log2_data.tab
|
||||
#define T2 __log2_data.tab2
|
||||
#define B __log2_data.poly1
|
||||
#define A __log2_data.poly
|
||||
#define InvLn2hi __log2_data.invln2hi
|
||||
#define InvLn2lo __log2_data.invln2lo
|
||||
#define N (1 << LOG2_TABLE_BITS)
|
||||
#define OFF 0x3fe6000000000000
|
||||
|
||||
/* Top 16 bits of a double. */
|
||||
static inline uint32_t top16(double x)
|
||||
{
|
||||
return asuint64(x) >> 48;
|
||||
}
|
||||
|
||||
double __cdecl log2(double x)
|
||||
{
|
||||
double_t z, r, r2, r4, y, invc, logc, kd, hi, lo, t1, t2, t3, p;
|
||||
uint64_t ix, iz, tmp;
|
||||
uint32_t top;
|
||||
int k, i;
|
||||
|
||||
ix = asuint64(x);
|
||||
top = top16(x);
|
||||
#define LO asuint64(1.0 - 0x1.5b51p-5)
|
||||
#define HI asuint64(1.0 + 0x1.6ab2p-5)
|
||||
if (predict_false(ix - LO < HI - LO)) {
|
||||
/* Handle close to 1.0 inputs separately. */
|
||||
/* Fix sign of zero with downward rounding when x==1. */
|
||||
if (WANT_ROUNDING && predict_false(ix == asuint64(1.0)))
|
||||
return 0;
|
||||
r = x - 1.0;
|
||||
#if __FP_FAST_FMA
|
||||
hi = r * InvLn2hi;
|
||||
lo = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -hi);
|
||||
#else
|
||||
double_t rhi, rlo;
|
||||
rhi = asdouble(asuint64(r) & -1ULL << 32);
|
||||
rlo = r - rhi;
|
||||
hi = rhi * InvLn2hi;
|
||||
lo = rlo * InvLn2hi + r * InvLn2lo;
|
||||
#endif
|
||||
r2 = r * r; /* rounding error: 0x1p-62. */
|
||||
r4 = r2 * r2;
|
||||
/* Worst-case error is less than 0.54 ULP (0.55 ULP without fma). */
|
||||
p = r2 * (B[0] + r * B[1]);
|
||||
y = hi + p;
|
||||
lo += hi - y + p;
|
||||
lo += r4 * (B[2] + r * B[3] + r2 * (B[4] + r * B[5]) +
|
||||
r4 * (B[6] + r * B[7] + r2 * (B[8] + r * B[9])));
|
||||
y += lo;
|
||||
return eval_as_double(y);
|
||||
}
|
||||
if (predict_false(top - 0x0010 >= 0x7ff0 - 0x0010)) {
|
||||
/* x < 0x1p-1022 or inf or nan. */
|
||||
if (ix * 2 == 0) {
|
||||
errno = ERANGE;
|
||||
return __math_divzero(1);
|
||||
}
|
||||
if (ix == asuint64(INFINITY)) /* log(inf) == inf. */
|
||||
return x;
|
||||
if ((top & 0x7ff0) == 0x7ff0 && (ix & 0xfffffffffffffULL))
|
||||
return x;
|
||||
if (top & 0x8000) {
|
||||
errno = EDOM;
|
||||
return __math_invalid(x);
|
||||
}
|
||||
/* x is subnormal, normalize it. */
|
||||
ix = asuint64(x * 0x1p52);
|
||||
ix -= 52ULL << 52;
|
||||
}
|
||||
|
||||
/* x = 2^k z; where z is in range [OFF,2*OFF) and exact.
|
||||
The range is split into N subintervals.
|
||||
The ith subinterval contains z and c is near its center. */
|
||||
tmp = ix - OFF;
|
||||
i = (tmp >> (52 - LOG2_TABLE_BITS)) % N;
|
||||
k = (int64_t)tmp >> 52; /* arithmetic shift */
|
||||
iz = ix - (tmp & 0xfffULL << 52);
|
||||
invc = T[i].invc;
|
||||
logc = T[i].logc;
|
||||
z = asdouble(iz);
|
||||
kd = (double_t)k;
|
||||
|
||||
/* log2(x) = log2(z/c) + log2(c) + k. */
|
||||
/* r ~= z/c - 1, |r| < 1/(2*N). */
|
||||
#if __FP_FAST_FMA
|
||||
/* rounding error: 0x1p-55/N. */
|
||||
r = __builtin_fma(z, invc, -1.0);
|
||||
t1 = r * InvLn2hi;
|
||||
t2 = r * InvLn2lo + __builtin_fma(r, InvLn2hi, -t1);
|
||||
#else
|
||||
double_t rhi, rlo;
|
||||
/* rounding error: 0x1p-55/N + 0x1p-65. */
|
||||
r = (z - T2[i].chi - T2[i].clo) * invc;
|
||||
rhi = asdouble(asuint64(r) & -1ULL << 32);
|
||||
rlo = r - rhi;
|
||||
t1 = rhi * InvLn2hi;
|
||||
t2 = rlo * InvLn2hi + r * InvLn2lo;
|
||||
#endif
|
||||
|
||||
/* hi + lo = r/ln2 + log2(c) + k. */
|
||||
t3 = kd + logc;
|
||||
hi = t3 + t1;
|
||||
lo = t3 - hi + t1 + t2;
|
||||
|
||||
/* log2(r+1) = r/ln2 + r^2*poly(r). */
|
||||
/* Evaluation is optimized assuming superscalar pipelined execution. */
|
||||
r2 = r * r; /* rounding error: 0x1p-54/N^2. */
|
||||
r4 = r2 * r2;
|
||||
/* Worst-case error if |y| > 0x1p-4: 0.547 ULP (0.550 ULP without fma).
|
||||
~ 0.5 + 2/N/ln2 + abs-poly-error*0x1p56 ULP (+ 0.003 ULP without fma). */
|
||||
p = A[0] + r * A[1] + r2 * (A[2] + r * A[3]) + r4 * (A[4] + r * A[5]);
|
||||
y = lo + r2 * p + hi;
|
||||
return eval_as_double(y);
|
||||
}
|
||||
Vendored
+201
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
* Data for log2.
|
||||
*
|
||||
* Copyright (c) 2018, Arm Limited.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "log2_data.h"
|
||||
|
||||
#define N (1 << LOG2_TABLE_BITS)
|
||||
|
||||
const struct log2_data __log2_data = {
|
||||
// First coefficient: 0x1.71547652b82fe1777d0ffda0d24p0
|
||||
.invln2hi = 0x1.7154765200000p+0,
|
||||
.invln2lo = 0x1.705fc2eefa200p-33,
|
||||
.poly1 = {
|
||||
// relative error: 0x1.2fad8188p-63
|
||||
// in -0x1.5b51p-5 0x1.6ab2p-5
|
||||
-0x1.71547652b82fep-1,
|
||||
0x1.ec709dc3a03f7p-2,
|
||||
-0x1.71547652b7c3fp-2,
|
||||
0x1.2776c50f05be4p-2,
|
||||
-0x1.ec709dd768fe5p-3,
|
||||
0x1.a61761ec4e736p-3,
|
||||
-0x1.7153fbc64a79bp-3,
|
||||
0x1.484d154f01b4ap-3,
|
||||
-0x1.289e4a72c383cp-3,
|
||||
0x1.0b32f285aee66p-3,
|
||||
},
|
||||
.poly = {
|
||||
// relative error: 0x1.a72c2bf8p-58
|
||||
// abs error: 0x1.67a552c8p-66
|
||||
// in -0x1.f45p-8 0x1.f45p-8
|
||||
-0x1.71547652b8339p-1,
|
||||
0x1.ec709dc3a04bep-2,
|
||||
-0x1.7154764702ffbp-2,
|
||||
0x1.2776c50034c48p-2,
|
||||
-0x1.ec7b328ea92bcp-3,
|
||||
0x1.a6225e117f92ep-3,
|
||||
},
|
||||
/* Algorithm:
|
||||
|
||||
x = 2^k z
|
||||
log2(x) = k + log2(c) + log2(z/c)
|
||||
log2(z/c) = poly(z/c - 1)
|
||||
|
||||
where z is in [1.6p-1; 1.6p0] which is split into N subintervals and z falls
|
||||
into the ith one, then table entries are computed as
|
||||
|
||||
tab[i].invc = 1/c
|
||||
tab[i].logc = (double)log2(c)
|
||||
tab2[i].chi = (double)c
|
||||
tab2[i].clo = (double)(c - (double)c)
|
||||
|
||||
where c is near the center of the subinterval and is chosen by trying +-2^29
|
||||
floating point invc candidates around 1/center and selecting one for which
|
||||
|
||||
1) the rounding error in 0x1.8p10 + logc is 0,
|
||||
2) the rounding error in z - chi - clo is < 0x1p-64 and
|
||||
3) the rounding error in (double)log2(c) is minimized (< 0x1p-68).
|
||||
|
||||
Note: 1) ensures that k + logc can be computed without rounding error, 2)
|
||||
ensures that z/c - 1 can be computed as (z - chi - clo)*invc with close to a
|
||||
single rounding error when there is no fast fma for z*invc - 1, 3) ensures
|
||||
that logc + poly(z/c - 1) has small error, however near x == 1 when
|
||||
|log2(x)| < 0x1p-4, this is not enough so that is special cased. */
|
||||
.tab = {
|
||||
{0x1.724286bb1acf8p+0, -0x1.1095feecdb000p-1},
|
||||
{0x1.6e1f766d2cca1p+0, -0x1.08494bd76d000p-1},
|
||||
{0x1.6a13d0e30d48ap+0, -0x1.00143aee8f800p-1},
|
||||
{0x1.661ec32d06c85p+0, -0x1.efec5360b4000p-2},
|
||||
{0x1.623fa951198f8p+0, -0x1.dfdd91ab7e000p-2},
|
||||
{0x1.5e75ba4cf026cp+0, -0x1.cffae0cc79000p-2},
|
||||
{0x1.5ac055a214fb8p+0, -0x1.c043811fda000p-2},
|
||||
{0x1.571ed0f166e1ep+0, -0x1.b0b67323ae000p-2},
|
||||
{0x1.53909590bf835p+0, -0x1.a152f5a2db000p-2},
|
||||
{0x1.5014fed61adddp+0, -0x1.9217f5af86000p-2},
|
||||
{0x1.4cab88e487bd0p+0, -0x1.8304db0719000p-2},
|
||||
{0x1.49539b4334feep+0, -0x1.74189f9a9e000p-2},
|
||||
{0x1.460cbdfafd569p+0, -0x1.6552bb5199000p-2},
|
||||
{0x1.42d664ee4b953p+0, -0x1.56b23a29b1000p-2},
|
||||
{0x1.3fb01111dd8a6p+0, -0x1.483650f5fa000p-2},
|
||||
{0x1.3c995b70c5836p+0, -0x1.39de937f6a000p-2},
|
||||
{0x1.3991c4ab6fd4ap+0, -0x1.2baa1538d6000p-2},
|
||||
{0x1.3698e0ce099b5p+0, -0x1.1d98340ca4000p-2},
|
||||
{0x1.33ae48213e7b2p+0, -0x1.0fa853a40e000p-2},
|
||||
{0x1.30d191985bdb1p+0, -0x1.01d9c32e73000p-2},
|
||||
{0x1.2e025cab271d7p+0, -0x1.e857da2fa6000p-3},
|
||||
{0x1.2b404cf13cd82p+0, -0x1.cd3c8633d8000p-3},
|
||||
{0x1.288b02c7ccb50p+0, -0x1.b26034c14a000p-3},
|
||||
{0x1.25e2263944de5p+0, -0x1.97c1c2f4fe000p-3},
|
||||
{0x1.234563d8615b1p+0, -0x1.7d6023f800000p-3},
|
||||
{0x1.20b46e33eaf38p+0, -0x1.633a71a05e000p-3},
|
||||
{0x1.1e2eefdcda3ddp+0, -0x1.494f5e9570000p-3},
|
||||
{0x1.1bb4a580b3930p+0, -0x1.2f9e424e0a000p-3},
|
||||
{0x1.19453847f2200p+0, -0x1.162595afdc000p-3},
|
||||
{0x1.16e06c0d5d73cp+0, -0x1.f9c9a75bd8000p-4},
|
||||
{0x1.1485f47b7e4c2p+0, -0x1.c7b575bf9c000p-4},
|
||||
{0x1.12358ad0085d1p+0, -0x1.960c60ff48000p-4},
|
||||
{0x1.0fef00f532227p+0, -0x1.64ce247b60000p-4},
|
||||
{0x1.0db2077d03a8fp+0, -0x1.33f78b2014000p-4},
|
||||
{0x1.0b7e6d65980d9p+0, -0x1.0387d1a42c000p-4},
|
||||
{0x1.0953efe7b408dp+0, -0x1.a6f9208b50000p-5},
|
||||
{0x1.07325cac53b83p+0, -0x1.47a954f770000p-5},
|
||||
{0x1.05197e40d1b5cp+0, -0x1.d23a8c50c0000p-6},
|
||||
{0x1.03091c1208ea2p+0, -0x1.16a2629780000p-6},
|
||||
{0x1.0101025b37e21p+0, -0x1.720f8d8e80000p-8},
|
||||
{0x1.fc07ef9caa76bp-1, 0x1.6fe53b1500000p-7},
|
||||
{0x1.f4465d3f6f184p-1, 0x1.11ccce10f8000p-5},
|
||||
{0x1.ecc079f84107fp-1, 0x1.c4dfc8c8b8000p-5},
|
||||
{0x1.e573a99975ae8p-1, 0x1.3aa321e574000p-4},
|
||||
{0x1.de5d6f0bd3de6p-1, 0x1.918a0d08b8000p-4},
|
||||
{0x1.d77b681ff38b3p-1, 0x1.e72e9da044000p-4},
|
||||
{0x1.d0cb5724de943p-1, 0x1.1dcd2507f6000p-3},
|
||||
{0x1.ca4b2dc0e7563p-1, 0x1.476ab03dea000p-3},
|
||||
{0x1.c3f8ee8d6cb51p-1, 0x1.7074377e22000p-3},
|
||||
{0x1.bdd2b4f020c4cp-1, 0x1.98ede8ba94000p-3},
|
||||
{0x1.b7d6c006015cap-1, 0x1.c0db86ad2e000p-3},
|
||||
{0x1.b20366e2e338fp-1, 0x1.e840aafcee000p-3},
|
||||
{0x1.ac57026295039p-1, 0x1.0790ab4678000p-2},
|
||||
{0x1.a6d01bc2731ddp-1, 0x1.1ac056801c000p-2},
|
||||
{0x1.a16d3bc3ff18bp-1, 0x1.2db11d4fee000p-2},
|
||||
{0x1.9c2d14967feadp-1, 0x1.406464ec58000p-2},
|
||||
{0x1.970e4f47c9902p-1, 0x1.52dbe093af000p-2},
|
||||
{0x1.920fb3982bcf2p-1, 0x1.651902050d000p-2},
|
||||
{0x1.8d30187f759f1p-1, 0x1.771d2cdeaf000p-2},
|
||||
{0x1.886e5ebb9f66dp-1, 0x1.88e9c857d9000p-2},
|
||||
{0x1.83c97b658b994p-1, 0x1.9a80155e16000p-2},
|
||||
{0x1.7f405ffc61022p-1, 0x1.abe186ed3d000p-2},
|
||||
{0x1.7ad22181415cap-1, 0x1.bd0f2aea0e000p-2},
|
||||
{0x1.767dcf99eff8cp-1, 0x1.ce0a43dbf4000p-2},
|
||||
},
|
||||
#if !__FP_FAST_FMA
|
||||
.tab2 = {
|
||||
{0x1.6200012b90a8ep-1, 0x1.904ab0644b605p-55},
|
||||
{0x1.66000045734a6p-1, 0x1.1ff9bea62f7a9p-57},
|
||||
{0x1.69fffc325f2c5p-1, 0x1.27ecfcb3c90bap-55},
|
||||
{0x1.6e00038b95a04p-1, 0x1.8ff8856739326p-55},
|
||||
{0x1.71fffe09994e3p-1, 0x1.afd40275f82b1p-55},
|
||||
{0x1.7600015590e1p-1, -0x1.2fd75b4238341p-56},
|
||||
{0x1.7a00012655bd5p-1, 0x1.808e67c242b76p-56},
|
||||
{0x1.7e0003259e9a6p-1, -0x1.208e426f622b7p-57},
|
||||
{0x1.81fffedb4b2d2p-1, -0x1.402461ea5c92fp-55},
|
||||
{0x1.860002dfafcc3p-1, 0x1.df7f4a2f29a1fp-57},
|
||||
{0x1.89ffff78c6b5p-1, -0x1.e0453094995fdp-55},
|
||||
{0x1.8e00039671566p-1, -0x1.a04f3bec77b45p-55},
|
||||
{0x1.91fffe2bf1745p-1, -0x1.7fa34400e203cp-56},
|
||||
{0x1.95fffcc5c9fd1p-1, -0x1.6ff8005a0695dp-56},
|
||||
{0x1.9a0003bba4767p-1, 0x1.0f8c4c4ec7e03p-56},
|
||||
{0x1.9dfffe7b92da5p-1, 0x1.e7fd9478c4602p-55},
|
||||
{0x1.a1fffd72efdafp-1, -0x1.a0c554dcdae7ep-57},
|
||||
{0x1.a5fffde04ff95p-1, 0x1.67da98ce9b26bp-55},
|
||||
{0x1.a9fffca5e8d2bp-1, -0x1.284c9b54c13dep-55},
|
||||
{0x1.adfffddad03eap-1, 0x1.812c8ea602e3cp-58},
|
||||
{0x1.b1ffff10d3d4dp-1, -0x1.efaddad27789cp-55},
|
||||
{0x1.b5fffce21165ap-1, 0x1.3cb1719c61237p-58},
|
||||
{0x1.b9fffd950e674p-1, 0x1.3f7d94194cep-56},
|
||||
{0x1.be000139ca8afp-1, 0x1.50ac4215d9bcp-56},
|
||||
{0x1.c20005b46df99p-1, 0x1.beea653e9c1c9p-57},
|
||||
{0x1.c600040b9f7aep-1, -0x1.c079f274a70d6p-56},
|
||||
{0x1.ca0006255fd8ap-1, -0x1.a0b4076e84c1fp-56},
|
||||
{0x1.cdfffd94c095dp-1, 0x1.8f933f99ab5d7p-55},
|
||||
{0x1.d1ffff975d6cfp-1, -0x1.82c08665fe1bep-58},
|
||||
{0x1.d5fffa2561c93p-1, -0x1.b04289bd295f3p-56},
|
||||
{0x1.d9fff9d228b0cp-1, 0x1.70251340fa236p-55},
|
||||
{0x1.de00065bc7e16p-1, -0x1.5011e16a4d80cp-56},
|
||||
{0x1.e200002f64791p-1, 0x1.9802f09ef62ep-55},
|
||||
{0x1.e600057d7a6d8p-1, -0x1.e0b75580cf7fap-56},
|
||||
{0x1.ea00027edc00cp-1, -0x1.c848309459811p-55},
|
||||
{0x1.ee0006cf5cb7cp-1, -0x1.f8027951576f4p-55},
|
||||
{0x1.f2000782b7dccp-1, -0x1.f81d97274538fp-55},
|
||||
{0x1.f6000260c450ap-1, -0x1.071002727ffdcp-59},
|
||||
{0x1.f9fffe88cd533p-1, -0x1.81bdce1fda8bp-58},
|
||||
{0x1.fdfffd50f8689p-1, 0x1.7f91acb918e6ep-55},
|
||||
{0x1.0200004292367p+0, 0x1.b7ff365324681p-54},
|
||||
{0x1.05fffe3e3d668p+0, 0x1.6fa08ddae957bp-55},
|
||||
{0x1.0a0000a85a757p+0, -0x1.7e2de80d3fb91p-58},
|
||||
{0x1.0e0001a5f3fccp+0, -0x1.1823305c5f014p-54},
|
||||
{0x1.11ffff8afbaf5p+0, -0x1.bfabb6680bac2p-55},
|
||||
{0x1.15fffe54d91adp+0, -0x1.d7f121737e7efp-54},
|
||||
{0x1.1a00011ac36e1p+0, 0x1.c000a0516f5ffp-54},
|
||||
{0x1.1e00019c84248p+0, -0x1.082fbe4da5dap-54},
|
||||
{0x1.220000ffe5e6ep+0, -0x1.8fdd04c9cfb43p-55},
|
||||
{0x1.26000269fd891p+0, 0x1.cfe2a7994d182p-55},
|
||||
{0x1.2a00029a6e6dap+0, -0x1.00273715e8bc5p-56},
|
||||
{0x1.2dfffe0293e39p+0, 0x1.b7c39dab2a6f9p-54},
|
||||
{0x1.31ffff7dcf082p+0, 0x1.df1336edc5254p-56},
|
||||
{0x1.35ffff05a8b6p+0, -0x1.e03564ccd31ebp-54},
|
||||
{0x1.3a0002e0eaeccp+0, 0x1.5f0e74bd3a477p-56},
|
||||
{0x1.3e000043bb236p+0, 0x1.c7dcb149d8833p-54},
|
||||
{0x1.4200002d187ffp+0, 0x1.e08afcf2d3d28p-56},
|
||||
{0x1.460000d387cb1p+0, 0x1.20837856599a6p-55},
|
||||
{0x1.4a00004569f89p+0, -0x1.9fa5c904fbcd2p-55},
|
||||
{0x1.4e000043543f3p+0, -0x1.81125ed175329p-56},
|
||||
{0x1.51fffcc027f0fp+0, 0x1.883d8847754dcp-54},
|
||||
{0x1.55ffffd87b36fp+0, -0x1.709e731d02807p-55},
|
||||
{0x1.59ffff21df7bap+0, 0x1.7f79f68727b02p-55},
|
||||
{0x1.5dfffebfc3481p+0, -0x1.180902e30e93ep-54},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* Copyright (c) 2018, Arm Limited.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
#ifndef _LOG2_DATA_H
|
||||
#define _LOG2_DATA_H
|
||||
|
||||
#include <features.h>
|
||||
|
||||
#define LOG2_TABLE_BITS 6
|
||||
#define LOG2_POLY_ORDER 7
|
||||
#define LOG2_POLY1_ORDER 11
|
||||
extern hidden const struct log2_data {
|
||||
double invln2hi;
|
||||
double invln2lo;
|
||||
double poly[LOG2_POLY_ORDER - 1];
|
||||
double poly1[LOG2_POLY1_ORDER - 1];
|
||||
struct {
|
||||
double invc, logc;
|
||||
} tab[1 << LOG2_TABLE_BITS];
|
||||
#if !__FP_FAST_FMA
|
||||
struct {
|
||||
double chi, clo;
|
||||
} tab2[1 << LOG2_TABLE_BITS];
|
||||
#endif
|
||||
} __log2_data;
|
||||
|
||||
#endif
|
||||
Vendored
+34
@@ -0,0 +1,34 @@
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include "libm.h"
|
||||
|
||||
double __cdecl scalbn(double x, int n)
|
||||
{
|
||||
union {double f; uint64_t i;} u;
|
||||
double_t y = x;
|
||||
|
||||
if (n > 1023) {
|
||||
y *= 0x1p1023;
|
||||
n -= 1023;
|
||||
if (n > 1023) {
|
||||
y *= 0x1p1023;
|
||||
n -= 1023;
|
||||
if (n > 1023)
|
||||
n = 1023;
|
||||
}
|
||||
} else if (n < -1022) {
|
||||
/* make sure final n < -53 to avoid double
|
||||
rounding in the subnormal range */
|
||||
y *= 0x1p-1022 * 0x1p53;
|
||||
n += 1022 - 53;
|
||||
if (n < -1022) {
|
||||
y *= 0x1p-1022 * 0x1p53;
|
||||
n += 1022 - 53;
|
||||
if (n < -1022)
|
||||
n = -1022;
|
||||
}
|
||||
}
|
||||
u.i = (uint64_t)(0x3ff+n)<<52;
|
||||
x = y * u.f;
|
||||
return x;
|
||||
}
|
||||
Vendored
+80
@@ -0,0 +1,80 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/* sin(x)
|
||||
* Return sine function of x.
|
||||
*
|
||||
* kernel function:
|
||||
* __sin ... sine function on [-pi/4,pi/4]
|
||||
* __cos ... cose function on [-pi/4,pi/4]
|
||||
* __rem_pio2 ... argument reduction routine
|
||||
*
|
||||
* Method.
|
||||
* Let S,C and T denote the sin, cos and tan respectively on
|
||||
* [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
|
||||
* in [-pi/4 , +pi/4], and let n = k mod 4.
|
||||
* We have
|
||||
*
|
||||
* n sin(x) cos(x) tan(x)
|
||||
* ----------------------------------------------------------
|
||||
* 0 S C T
|
||||
* 1 C -S -1/T
|
||||
* 2 -S -C T
|
||||
* 3 -C S -1/T
|
||||
* ----------------------------------------------------------
|
||||
*
|
||||
* Special cases:
|
||||
* Let trig be any of sin, cos, or tan.
|
||||
* trig(+-INF) is NaN, with signals;
|
||||
* trig(NaN) is that NaN;
|
||||
*
|
||||
* Accuracy:
|
||||
* TRIG(x) returns trig(x) nearly rounded
|
||||
*/
|
||||
|
||||
#include "libm.h"
|
||||
|
||||
double __cdecl sin(double x)
|
||||
{
|
||||
double y[2];
|
||||
uint32_t ix;
|
||||
unsigned n;
|
||||
|
||||
/* High word of x. */
|
||||
GET_HIGH_WORD(ix, x);
|
||||
ix &= 0x7fffffff;
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
if (ix <= 0x3fe921fb) {
|
||||
if (ix < 0x3e500000) { /* |x| < 2**-26 */
|
||||
/* raise inexact if x != 0 and underflow if subnormal*/
|
||||
FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
|
||||
return x;
|
||||
}
|
||||
return __sin(x, 0.0, 0);
|
||||
}
|
||||
|
||||
/* sin(Inf or NaN) is NaN */
|
||||
if (isinf(x))
|
||||
return math_error(_DOMAIN, "sin", x, 0, x - x);
|
||||
if (ix >= 0x7ff00000)
|
||||
return x - x;
|
||||
|
||||
/* argument reduction needed */
|
||||
n = __rem_pio2(x, y);
|
||||
switch (n&3) {
|
||||
case 0: return __sin(y[0], y[1], 1);
|
||||
case 1: return __cos(y[0], y[1]);
|
||||
case 2: return -__sin(y[0], y[1], 1);
|
||||
default:
|
||||
return -__cos(y[0], y[1]);
|
||||
}
|
||||
}
|
||||
Vendored
+69
@@ -0,0 +1,69 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_sin.c */
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include "libm.h"
|
||||
|
||||
void __cdecl sincos(double x, double *sin, double *cos)
|
||||
{
|
||||
double y[2], s, c;
|
||||
uint32_t ix;
|
||||
unsigned n;
|
||||
|
||||
GET_HIGH_WORD(ix, x);
|
||||
ix &= 0x7fffffff;
|
||||
|
||||
/* |x| ~< pi/4 */
|
||||
if (ix <= 0x3fe921fb) {
|
||||
/* if |x| < 2**-27 * sqrt(2) */
|
||||
if (ix < 0x3e46a09e) {
|
||||
/* raise inexact if x!=0 and underflow if subnormal */
|
||||
FORCE_EVAL(ix < 0x00100000 ? x/0x1p120f : x+0x1p120f);
|
||||
*sin = x;
|
||||
*cos = 1.0;
|
||||
return;
|
||||
}
|
||||
*sin = __sin(x, 0.0, 0);
|
||||
*cos = __cos(x, 0.0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* sincos(Inf or NaN) is NaN */
|
||||
if (ix >= 0x7ff00000) {
|
||||
*sin = *cos = x - x;
|
||||
return;
|
||||
}
|
||||
|
||||
/* argument reduction needed */
|
||||
n = __rem_pio2(x, y);
|
||||
s = __sin(y[0], y[1], 1);
|
||||
c = __cos(y[0], y[1]);
|
||||
switch (n&3) {
|
||||
case 0:
|
||||
*sin = s;
|
||||
*cos = c;
|
||||
break;
|
||||
case 1:
|
||||
*sin = c;
|
||||
*cos = -s;
|
||||
break;
|
||||
case 2:
|
||||
*sin = -s;
|
||||
*cos = -c;
|
||||
break;
|
||||
case 3:
|
||||
default:
|
||||
*sin = -c;
|
||||
*cos = s;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Vendored
+158
@@ -0,0 +1,158 @@
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
#include "libm.h"
|
||||
#include "sqrt_data.h"
|
||||
|
||||
#define FENV_SUPPORT 1
|
||||
|
||||
/* returns a*b*2^-32 - e, with error 0 <= e < 1. */
|
||||
static inline uint32_t mul32(uint32_t a, uint32_t b)
|
||||
{
|
||||
return (uint64_t)a*b >> 32;
|
||||
}
|
||||
|
||||
/* returns a*b*2^-64 - e, with error 0 <= e < 3. */
|
||||
static inline uint64_t mul64(uint64_t a, uint64_t b)
|
||||
{
|
||||
uint64_t ahi = a>>32;
|
||||
uint64_t alo = a&0xffffffff;
|
||||
uint64_t bhi = b>>32;
|
||||
uint64_t blo = b&0xffffffff;
|
||||
return ahi*bhi + (ahi*blo >> 32) + (alo*bhi >> 32);
|
||||
}
|
||||
|
||||
double __cdecl sqrt(double x)
|
||||
{
|
||||
uint64_t ix, top, m;
|
||||
|
||||
/* special case handling. */
|
||||
ix = asuint64(x);
|
||||
top = ix >> 52;
|
||||
if (predict_false(top - 0x001 >= 0x7ff - 0x001)) {
|
||||
/* x < 0x1p-1022 or inf or nan. */
|
||||
if (ix * 2 == 0)
|
||||
return x;
|
||||
if (ix == 0x7ff0000000000000)
|
||||
return x;
|
||||
if (ix > 0x7ff0000000000000)
|
||||
return math_error(_DOMAIN, "sqrt", x, 0, (x - x) / (x - x));
|
||||
/* x is subnormal, normalize it. */
|
||||
ix = asuint64(x * 0x1p52);
|
||||
top = ix >> 52;
|
||||
top -= 52;
|
||||
}
|
||||
|
||||
/* argument reduction:
|
||||
x = 4^e m; with integer e, and m in [1, 4)
|
||||
m: fixed point representation [2.62]
|
||||
2^e is the exponent part of the result. */
|
||||
int even = top & 1;
|
||||
m = (ix << 11) | 0x8000000000000000;
|
||||
if (even) m >>= 1;
|
||||
top = (top + 0x3ff) >> 1;
|
||||
|
||||
/* approximate r ~ 1/sqrt(m) and s ~ sqrt(m) when m in [1,4)
|
||||
|
||||
initial estimate:
|
||||
7bit table lookup (1bit exponent and 6bit significand).
|
||||
|
||||
iterative approximation:
|
||||
using 2 goldschmidt iterations with 32bit int arithmetics
|
||||
and a final iteration with 64bit int arithmetics.
|
||||
|
||||
details:
|
||||
|
||||
the relative error (e = r0 sqrt(m)-1) of a linear estimate
|
||||
(r0 = a m + b) is |e| < 0.085955 ~ 0x1.6p-4 at best,
|
||||
a table lookup is faster and needs one less iteration
|
||||
6 bit lookup table (128b) gives |e| < 0x1.f9p-8
|
||||
7 bit lookup table (256b) gives |e| < 0x1.fdp-9
|
||||
for single and double prec 6bit is enough but for quad
|
||||
prec 7bit is needed (or modified iterations). to avoid
|
||||
one more iteration >=13bit table would be needed (16k).
|
||||
|
||||
a newton-raphson iteration for r is
|
||||
w = r*r
|
||||
u = 3 - m*w
|
||||
r = r*u/2
|
||||
can use a goldschmidt iteration for s at the end or
|
||||
s = m*r
|
||||
|
||||
first goldschmidt iteration is
|
||||
s = m*r
|
||||
u = 3 - s*r
|
||||
r = r*u/2
|
||||
s = s*u/2
|
||||
next goldschmidt iteration is
|
||||
u = 3 - s*r
|
||||
r = r*u/2
|
||||
s = s*u/2
|
||||
and at the end r is not computed only s.
|
||||
|
||||
they use the same amount of operations and converge at the
|
||||
same quadratic rate, i.e. if
|
||||
r1 sqrt(m) - 1 = e, then
|
||||
r2 sqrt(m) - 1 = -3/2 e^2 - 1/2 e^3
|
||||
the advantage of goldschmidt is that the mul for s and r
|
||||
are independent (computed in parallel), however it is not
|
||||
"self synchronizing": it only uses the input m in the
|
||||
first iteration so rounding errors accumulate. at the end
|
||||
or when switching to larger precision arithmetics rounding
|
||||
errors dominate so the first iteration should be used.
|
||||
|
||||
the fixed point representations are
|
||||
m: 2.30 r: 0.32, s: 2.30, d: 2.30, u: 2.30, three: 2.30
|
||||
and after switching to 64 bit
|
||||
m: 2.62 r: 0.64, s: 2.62, d: 2.62, u: 2.62, three: 2.62 */
|
||||
|
||||
static const uint64_t three = 0xc0000000;
|
||||
uint64_t r, s, d, u, i;
|
||||
|
||||
i = (ix >> 46) % 128;
|
||||
r = (uint32_t)__rsqrt_tab[i] << 16;
|
||||
/* |r sqrt(m) - 1| < 0x1.fdp-9 */
|
||||
s = mul32(m>>32, r);
|
||||
/* |s/sqrt(m) - 1| < 0x1.fdp-9 */
|
||||
d = mul32(s, r);
|
||||
u = three - d;
|
||||
r = mul32(r, u) << 1;
|
||||
/* |r sqrt(m) - 1| < 0x1.7bp-16 */
|
||||
s = mul32(s, u) << 1;
|
||||
/* |s/sqrt(m) - 1| < 0x1.7bp-16 */
|
||||
d = mul32(s, r);
|
||||
u = three - d;
|
||||
r = mul32(r, u) << 1;
|
||||
/* |r sqrt(m) - 1| < 0x1.3704p-29 (measured worst-case) */
|
||||
r = r << 32;
|
||||
s = mul64(m, r);
|
||||
d = mul64(s, r);
|
||||
u = (three<<32) - d;
|
||||
s = mul64(s, u); /* repr: 3.61 */
|
||||
/* -0x1p-57 < s - sqrt(m) < 0x1.8001p-61 */
|
||||
s = (s - 2) >> 9; /* repr: 12.52 */
|
||||
/* -0x1.09p-52 < s - sqrt(m) < -0x1.fffcp-63 */
|
||||
|
||||
/* s < sqrt(m) < s + 0x1.09p-52,
|
||||
compute nearest rounded result:
|
||||
the nearest result to 52 bits is either s or s+0x1p-52,
|
||||
we can decide by comparing (2^52 s + 0.5)^2 to 2^104 m. */
|
||||
uint64_t d0, d1, d2;
|
||||
double y, t;
|
||||
d0 = (m << 42) - s*s;
|
||||
d1 = s - d0;
|
||||
d2 = d1 + s + 1;
|
||||
s += d1 >> 63;
|
||||
s &= 0x000fffffffffffff;
|
||||
s |= top << 52;
|
||||
y = asdouble(s);
|
||||
if (FENV_SUPPORT) {
|
||||
/* handle rounding modes and inexact exception:
|
||||
only (s+1)^2 == 2^42 m case is exact otherwise
|
||||
add a tiny value to cause the fenv effects. */
|
||||
uint64_t tiny = predict_false(d2==0) ? 0 : 0x0010000000000000;
|
||||
tiny |= (d1^d2) & 0x8000000000000000;
|
||||
t = asdouble(tiny);
|
||||
y = eval_as_double(y + t);
|
||||
}
|
||||
return y;
|
||||
}
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
#include "sqrt_data.h"
|
||||
const uint16_t __rsqrt_tab[128] = {
|
||||
0xb451,0xb2f0,0xb196,0xb044,0xaef9,0xadb6,0xac79,0xab43,
|
||||
0xaa14,0xa8eb,0xa7c8,0xa6aa,0xa592,0xa480,0xa373,0xa26b,
|
||||
0xa168,0xa06a,0x9f70,0x9e7b,0x9d8a,0x9c9d,0x9bb5,0x9ad1,
|
||||
0x99f0,0x9913,0x983a,0x9765,0x9693,0x95c4,0x94f8,0x9430,
|
||||
0x936b,0x92a9,0x91ea,0x912e,0x9075,0x8fbe,0x8f0a,0x8e59,
|
||||
0x8daa,0x8cfe,0x8c54,0x8bac,0x8b07,0x8a64,0x89c4,0x8925,
|
||||
0x8889,0x87ee,0x8756,0x86c0,0x862b,0x8599,0x8508,0x8479,
|
||||
0x83ec,0x8361,0x82d8,0x8250,0x81c9,0x8145,0x80c2,0x8040,
|
||||
0xff02,0xfd0e,0xfb25,0xf947,0xf773,0xf5aa,0xf3ea,0xf234,
|
||||
0xf087,0xeee3,0xed47,0xebb3,0xea27,0xe8a3,0xe727,0xe5b2,
|
||||
0xe443,0xe2dc,0xe17a,0xe020,0xdecb,0xdd7d,0xdc34,0xdaf1,
|
||||
0xd9b3,0xd87b,0xd748,0xd61a,0xd4f1,0xd3cd,0xd2ad,0xd192,
|
||||
0xd07b,0xcf69,0xce5b,0xcd51,0xcc4a,0xcb48,0xca4a,0xc94f,
|
||||
0xc858,0xc764,0xc674,0xc587,0xc49d,0xc3b7,0xc2d4,0xc1f4,
|
||||
0xc116,0xc03c,0xbf65,0xbe90,0xbdbe,0xbcef,0xbc23,0xbb59,
|
||||
0xba91,0xb9cc,0xb90a,0xb84a,0xb78c,0xb6d0,0xb617,0xb560,
|
||||
};
|
||||
Vendored
+13
@@ -0,0 +1,13 @@
|
||||
#ifndef _SQRT_DATA_H
|
||||
#define _SQRT_DATA_H
|
||||
|
||||
#include <features.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* if x in [1,2): i = (int)(64*x);
|
||||
if x in [2,4): i = (int)(32*x-64);
|
||||
__rsqrt_tab[i]*2^-16 is estimating 1/sqrt(x) with small relative error:
|
||||
|__rsqrt_tab[i]*0x1p-16*sqrt(x) - 1| < -0x1.fdp-9 < 2^-8 */
|
||||
extern hidden const uint16_t __rsqrt_tab[128];
|
||||
|
||||
#endif
|
||||
Vendored
+83
@@ -0,0 +1,83 @@
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
#include "libm.h"
|
||||
#include "sqrt_data.h"
|
||||
|
||||
#define FENV_SUPPORT 1
|
||||
|
||||
static inline uint32_t mul32(uint32_t a, uint32_t b)
|
||||
{
|
||||
return (uint64_t)a*b >> 32;
|
||||
}
|
||||
|
||||
/* see sqrt.c for more detailed comments. */
|
||||
|
||||
float __cdecl sqrtf(float x)
|
||||
{
|
||||
uint32_t ix, m, m1, m0, even, ey;
|
||||
|
||||
ix = asuint(x);
|
||||
if (predict_false(ix - 0x00800000 >= 0x7f800000 - 0x00800000)) {
|
||||
/* x < 0x1p-126 or inf or nan. */
|
||||
if (ix * 2 == 0)
|
||||
return x;
|
||||
if (ix == 0x7f800000)
|
||||
return x;
|
||||
if (ix > 0x7f800000)
|
||||
return math_error(_DOMAIN, "sqrtf", x, 0, (x - x) / (x - x));
|
||||
/* x is subnormal, normalize it. */
|
||||
ix = asuint(x * 0x1p23f);
|
||||
ix -= 23 << 23;
|
||||
}
|
||||
|
||||
/* x = 4^e m; with int e and m in [1, 4). */
|
||||
even = ix & 0x00800000;
|
||||
m1 = (ix << 8) | 0x80000000;
|
||||
m0 = (ix << 7) & 0x7fffffff;
|
||||
m = even ? m0 : m1;
|
||||
|
||||
/* 2^e is the exponent part of the return value. */
|
||||
ey = ix >> 1;
|
||||
ey += 0x3f800000 >> 1;
|
||||
ey &= 0x7f800000;
|
||||
|
||||
/* compute r ~ 1/sqrt(m), s ~ sqrt(m) with 2 goldschmidt iterations. */
|
||||
static const uint32_t three = 0xc0000000;
|
||||
uint32_t r, s, d, u, i;
|
||||
i = (ix >> 17) % 128;
|
||||
r = (uint32_t)__rsqrt_tab[i] << 16;
|
||||
/* |r*sqrt(m) - 1| < 0x1p-8 */
|
||||
s = mul32(m, r);
|
||||
/* |s/sqrt(m) - 1| < 0x1p-8 */
|
||||
d = mul32(s, r);
|
||||
u = three - d;
|
||||
r = mul32(r, u) << 1;
|
||||
/* |r*sqrt(m) - 1| < 0x1.7bp-16 */
|
||||
s = mul32(s, u) << 1;
|
||||
/* |s/sqrt(m) - 1| < 0x1.7bp-16 */
|
||||
d = mul32(s, r);
|
||||
u = three - d;
|
||||
s = mul32(s, u);
|
||||
/* -0x1.03p-28 < s/sqrt(m) - 1 < 0x1.fp-31 */
|
||||
s = (s - 1)>>6;
|
||||
/* s < sqrt(m) < s + 0x1.08p-23 */
|
||||
|
||||
/* compute nearest rounded result. */
|
||||
uint32_t d0, d1, d2;
|
||||
float y, t;
|
||||
d0 = (m << 16) - s*s;
|
||||
d1 = s - d0;
|
||||
d2 = d1 + s + 1;
|
||||
s += d1 >> 31;
|
||||
s &= 0x007fffff;
|
||||
s |= ey;
|
||||
y = asfloat(s);
|
||||
if (FENV_SUPPORT) {
|
||||
/* handle rounding and inexact exception. */
|
||||
uint32_t tiny = predict_false(d2==0) ? 0 : 0x01000000;
|
||||
tiny |= (d1^d2) & 0x80000000;
|
||||
t = asfloat(tiny);
|
||||
y = eval_as_float(y + t);
|
||||
}
|
||||
return y;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
#include "gdbjit.h"
|
||||
#include <stdio.h>
|
||||
|
||||
static char block_name_buffer[16];
|
||||
|
||||
static enum gdb_status read_debug_info(struct gdb_reader_funcs* self, struct gdb_symbol_callbacks* cbs, void* memory, long memory_sz)
|
||||
{
|
||||
gdbjit_block_t* block = (gdbjit_block_t*)memory;
|
||||
|
||||
struct gdb_object* object = cbs->object_open(cbs);
|
||||
struct gdb_symtab* symtab = cbs->symtab_open(cbs, object, block->filename);
|
||||
sprintf(block_name_buffer, "%x", block->x64start);
|
||||
cbs->block_open(cbs, symtab, NULL, block->start, block->end, block_name_buffer);
|
||||
|
||||
cbs->line_mapping_add(cbs, symtab, block->nlines, block->lines);
|
||||
|
||||
cbs->symtab_close(cbs, symtab);
|
||||
cbs->object_close(cbs, object);
|
||||
|
||||
return GDB_SUCCESS;
|
||||
}
|
||||
|
||||
enum gdb_status unwind_frame(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs)
|
||||
{
|
||||
return GDB_SUCCESS;
|
||||
}
|
||||
|
||||
struct gdb_frame_id get_frame_id(struct gdb_reader_funcs* self, struct gdb_unwind_callbacks* cbs)
|
||||
{
|
||||
struct gdb_frame_id frame = {0xdeadbeef, 0};
|
||||
return frame;
|
||||
}
|
||||
|
||||
void destroy_reader(struct gdb_reader_funcs* self) {}
|
||||
|
||||
__attribute__((visibility("default"))) struct gdb_reader_funcs* gdb_init_reader(void)
|
||||
{
|
||||
static struct gdb_reader_funcs funcs = {GDB_READER_INTERFACE_VERSION, NULL, read_debug_info, unwind_frame, get_frame_id, destroy_reader};
|
||||
return &funcs;
|
||||
}
|
||||
|
||||
__attribute__((visibility("default"))) int plugin_is_GPL_compatible (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
# create necessary directories
|
||||
mkdir -p ~/steam/tmp # makes both ~/steam and ~/steam/tmp in one cmd
|
||||
cd ~/steam/tmp
|
||||
|
||||
# download latest deb and unpack
|
||||
curl -LO https://cdn.cloudflare.steamstatic.com/client/installer/steam.deb
|
||||
ar x steam.deb
|
||||
tar xf data.tar.xz
|
||||
|
||||
# move deb contents to steam folder
|
||||
mv ./usr/* ..
|
||||
cd .. && rm -rf ./tmp
|
||||
|
||||
# create run script
|
||||
echo '#!/bin/bash
|
||||
export STEAMOS=1
|
||||
export STEAM_RUNTIME=1
|
||||
export PROTON_USE_WOW64=1
|
||||
export DBUS_FATAL_WARNINGS=0
|
||||
~/steam/bin/steam $@' > steam
|
||||
|
||||
# make script executable and move
|
||||
chmod +x steam
|
||||
sudo mv steam /usr/local/bin/
|
||||
|
||||
echo "Script complete."
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-arm64-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
@@ -15,30 +15,22 @@ source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-arm64-git}"
|
||||
cd "${srcdir}/${pkgname%-arm64-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-arm64-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
fi
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-arm64-git}/build"
|
||||
cd "${srcdir}/${pkgname%-arm64-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-arm64-git}/build"
|
||||
cd "${srcdir}/${pkgname%-arm64-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-arm64-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-arm64-git}-git" "${pkgname%-arm64-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-arm64-git}-git" "${pkgname%-arm64-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-arm64-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-arm64-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-arm64-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-arm64-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-asahi-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-asahi-git}-git" "${pkgname%-asahi-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-asahi-git}-git" "${pkgname%-asahi-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-asahi-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-asahi-git}"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DM1=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-asahi-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-asahi-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-lx2160a-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
@@ -15,30 +15,22 @@ source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-lx2160a-git}"
|
||||
cd "${srcdir}/${pkgname%-lx2160a-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-lx2160a-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DLX2160A=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
fi
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DLX2160A=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-lx2160a-git}/build"
|
||||
cd "${srcdir}/${pkgname%-lx2160a-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-lx2160a-git}/build"
|
||||
cd "${srcdir}/${pkgname%-lx2160a-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-lx2160a-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-lx2160a-git}-git" "${pkgname%-lx2160a-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-lx2160a-git}-git" "${pkgname%-lx2160a-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-lx2160a-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-lx2160a-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DLX2160A=1 -DCMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-lx2160a-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-lx2160a-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-odroid-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-odroid-git}-git" "${pkgname%-odroid-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-odroid-git}-git" "${pkgname%-odroid-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-odroid-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-odroid-git}"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DODROIDN2=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-odroid-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-odroid-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-phytium-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-phytium-git}-git" "${pkgname%-phytium-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-phytium-git}-git" "${pkgname%-phytium-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-phytium-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-phytium-git}"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DPHYTIUM=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-phytium-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-phytium-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-rpi-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
_pimodel=`tr -d '\0' < /sys/firmware/devicetree/base/model`
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-rpi-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rpi-git}"
|
||||
# Check for Pi version number
|
||||
if [[ ${_pimodel} =~ "Raspberry Pi 4" ]]; then
|
||||
_piversion=4
|
||||
elif [[ ${_pimodel} =~ "Raspberry Pi 3" ]]; then
|
||||
_piversion=3
|
||||
else
|
||||
# This RPI is not supported or this device is not a pi.
|
||||
# We should cancel then the build.
|
||||
echo -e "\033[01m\033[01;31m==> ERROR:\033[00;01m Your device is not supported! This script is for RPi model 4/3 (2/1/0 isn't supported).\033[00m"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "\033[01m\033[01;34m==> INFO:\033[00;01m Your detected Pi verion number is: \033[01;31m${_piversion}\033[01m.\033[00m"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DRPI${_piversion}ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-rpi-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-rpi-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box86-rk3399-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-rk3399-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rk3399-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-rk3399-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-rk3399-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box86-rk3399-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rk3399-git}-git" "${pkgname%-rk3399-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-rk3399-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rk3399-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DRK3399=1 -DCMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-rk3399-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-rk3399-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-rk3xxx-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rk3xxx-git}-git" "${pkgname%-rk3xxx-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rk3xxx-git}-git" "${pkgname%-rk3xxx-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
_rkmodel=`tr -d '\0' < /proc/device-tree/compatible`
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-rk3xxx-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rk3xxx-git}"
|
||||
# Check for RockChip version number
|
||||
if [[ ${_rkmodel} =~ "rk3326" ]]; then
|
||||
_rksuffix=3326
|
||||
elif [[ ${_rkmodel} =~ "rk3399" ]]; then
|
||||
_rksuffix=3399
|
||||
elif [[ ${_rkmodel} =~ "rk3588" ]]; then
|
||||
_rksuffix=3588
|
||||
else
|
||||
# This RKxxxx is not supported or this device is not RockChip based.
|
||||
# We should cancel then the build.
|
||||
echo -e "\033[01m\033[01;31m==> ERROR:\033[00;01m Your device is not supported! This script is for RockChip model 3326/3399/3588.\033[00m"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "\033[01m\033[01;34m==> INFO:\033[00;01m Your detected RockChip verion number is: \033[01;31m${_rksuffix}\033[01m.\033[00m"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DRK${_rksuffix}=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-rk3xxx-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-rk3xxx-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-rpi-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-rpi-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rpi-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-rpi-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-rpi-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-rpi-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rpi-git}-git" "${pkgname%-rpi-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-rpi-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rpi-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-rpi-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-rpi-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-rv64-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('riscv64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-rv64-git}-git" "${pkgname%-rv64-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rv64-git}-git" "${pkgname%-rv64-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-rv64-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rv64-git}"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DRV64=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-rv64-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-rv64-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-sd845-git
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-sd845-git}-git" "${pkgname%-sd845-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-sd845-git}-git" "${pkgname%-sd845-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "${srcdir}/${pkgname%-sd845-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-sd845-git}"
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DSD845=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "${srcdir}/${pkgname%-sd845-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/${pkgname%-sd845-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-tegra-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
@@ -15,30 +15,22 @@ source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-tegra-git}"
|
||||
cd "${srcdir}/${pkgname%-tegra-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-tegra-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
fi
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-tegra-git}/build"
|
||||
cd "${srcdir}/${pkgname%-tegra-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-tegra-git}/build"
|
||||
cd "${srcdir}/${pkgname%-tegra-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-tegra-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
optdepends=('gl4es: OpenGL 2 for GLES 2 devices')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-tegra-git}-git" "${pkgname%-tegra-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-tegra-git}-git" "${pkgname%-tegra-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-tegra-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-tegra-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DTEGRAX1=1 -DCMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-tegra-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-tegra-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-x64-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgver=r2431.60c6858
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
arch=('x86_64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
@@ -14,30 +14,22 @@ source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-x64-git}"
|
||||
cd "${srcdir}/${pkgname%-x64-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-x64-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
fi
|
||||
[[ ! -d ./build ]] && mkdir build
|
||||
cmake -B build -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-x64-git}/build"
|
||||
cd "${srcdir}/${pkgname%-x64-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-x64-git}/build"
|
||||
cd "${srcdir}/${pkgname%-x64-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
# Maintainer: Jai-JAP <[email protected]>
|
||||
# Author: Sebastien Chevalier <[email protected]>
|
||||
pkgname=box64-x64-git
|
||||
pkgver=r1495.e6e9fae
|
||||
pkgrel=1
|
||||
pkgdesc="Linux Userspace x86_64 Emulator with a twist, targeted at ARM64 Linux devices."
|
||||
arch=('aarch64')
|
||||
url="https://github.com/ptitSeb/box64"
|
||||
license=('MIT')
|
||||
makedepends=('git' 'cmake' 'make')
|
||||
provides=("${pkgname%-git}" "${pkgname%-x64-git}-git" "${pkgname%-x64-git}")
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-x64-git}-git" "${pkgname%-x64-git}")
|
||||
source=('git+https://github.com/ptitSeb/box64')
|
||||
md5sums=('SKIP')
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-x64-git}"
|
||||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-x64-git}"
|
||||
if [[ ! -d ./build ]]; then
|
||||
mkdir build && cd build
|
||||
cmake .. -DLD80BITS=1 -DNOALIGN=1 -DCMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "$srcdir/${pkgname%-x64-git}/build"
|
||||
make -j$(nproc)
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "$srcdir/${pkgname%-x64-git}/build"
|
||||
make DESTDIR="${pkgdir}/" install
|
||||
# /usr/local/bin isn't in PATH by the default,
|
||||
# we should move it to /usr/bin
|
||||
cd ${pkgdir}
|
||||
mv usr/local/bin/ usr/bin/
|
||||
# cleanup when dir is empty
|
||||
rmdir usr/local || exit 0
|
||||
}
|
||||
+3
-1
@@ -4,6 +4,8 @@
|
||||
Just download the `PKGBUILD-<your-platform>` (no need to download the whole repository), go to directory where you downloaded and type:
|
||||
```sh
|
||||
mv ./PKGBUILD-<your-platform> ./PKGBUILD
|
||||
# use the below line if you need a DEBUG build
|
||||
# sed -i 's/RelWithDebInfo/Debug/g' ./PKGBUILD
|
||||
cd ..
|
||||
makepkg -si
|
||||
```
|
||||
@@ -12,7 +14,7 @@ This will copy the PKGBUILD for your platform (where you type your platform name
|
||||
In the future, I might try to do an unified PKGBUILD for all platforms that will recognize your platform automatically.
|
||||
|
||||
### 2. What platforms are currently supported.
|
||||
All specified in [COMPILE.md](../docs/COMPILE.md).
|
||||
All specified in [COMPILE.md](../docs/COMPILE.md) except for LARCH64, PPC64LE and SW64.
|
||||
|
||||
### 3. Any advantages with this solution?
|
||||
This might give you some advantages like:
|
||||
|
||||
+742
-225
File diff suppressed because it is too large.
Load diff
Executable
+1658
File diff suppressed because it is too large.
Load diff
Executable → Regular
+4
-8
@@ -11,20 +11,16 @@ endif( NOT TEST_OUTPUT )
|
||||
if( NOT TEST_REFERENCE )
|
||||
message( FATAL_ERROR "Require TEST_REFERENCE to be defined" )
|
||||
endif( NOT TEST_REFERENCE )
|
||||
if(NOT DEFINED ENV{INTERPRETER})
|
||||
set(ENV{INTERPRETER} "")
|
||||
endif()
|
||||
|
||||
set(ENV{BOX64_LOG} 0)
|
||||
set(ENV{BOX64_NOBANNER} 1)
|
||||
if( EXISTS ${CMAKE_SOURCE_DIR}/x64lib )
|
||||
# we are inside box64 folder
|
||||
set(ENV{LD_LIBRARY_PATH} ${CMAKE_SOURCE_DIR}/x64lib)
|
||||
else()
|
||||
# we are inside build folder
|
||||
set(ENV{LD_LIBRARY_PATH} ${CMAKE_SOURCE_DIR}/../x64lib)
|
||||
endif( EXISTS ${CMAKE_SOURCE_DIR}/x64lib )
|
||||
|
||||
# run the test program, capture the stdout/stderr and the result var
|
||||
execute_process(
|
||||
COMMAND ${TEST_PROGRAM} ${TEST_ARGS} ${TEST_ARGS2}
|
||||
COMMAND $ENV{INTERPRETER} ${TEST_PROGRAM} ${TEST_ARGS} ${TEST_ARGS2}
|
||||
OUTPUT_FILE ${TEST_OUTPUT}
|
||||
ERROR_VARIABLE TEST_ERROR
|
||||
RESULT_VARIABLE TEST_RESULT
|
||||
|
||||
+342
@@ -0,0 +1,342 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "box32.h"
|
||||
#include "custommem.h"
|
||||
#include "converter32.h"
|
||||
|
||||
#include "khash.h"
|
||||
|
||||
KHASH_MAP_INIT_INT64(to, ulong_t);
|
||||
KHASH_MAP_INIT_INT(from, uintptr_t);
|
||||
KHASH_MAP_INIT_STR(strings, ptr_t);
|
||||
|
||||
static kh_from_t* hash_from = NULL;
|
||||
static kh_to_t* hash_to = NULL;
|
||||
#define HASH_MSK 0xf000000f
|
||||
#define HASH_VAL 0x007fffff
|
||||
#define HASH_SHIFT 4
|
||||
static uint32_t hash_cnt = 1;
|
||||
static pthread_rwlock_t hash_lock = {0};
|
||||
static int hash_running = 0;
|
||||
// locale
|
||||
static kh_from_t* locale_from = NULL;
|
||||
static kh_to_t* locale_to = NULL;
|
||||
static kh_strings_t* const_strings = NULL;
|
||||
|
||||
|
||||
void init_hash_helper() {
|
||||
hash_from = kh_init(from);
|
||||
hash_to = kh_init(to);
|
||||
locale_from = kh_init(from);
|
||||
locale_to = kh_init(to);
|
||||
const_strings = kh_init(strings);
|
||||
pthread_rwlock_init(&hash_lock, NULL);
|
||||
hash_running = 1;
|
||||
}
|
||||
void fini_hash_helper() {
|
||||
if(!hash_running)
|
||||
return;
|
||||
hash_running = 0;
|
||||
kh_destroy(from, hash_from);
|
||||
hash_from = NULL;
|
||||
kh_destroy(to, hash_to);
|
||||
hash_to = NULL;
|
||||
hash_cnt = 1;
|
||||
kh_destroy(from, locale_from);
|
||||
locale_from = NULL;
|
||||
kh_destroy(to, locale_to);
|
||||
locale_to = NULL;
|
||||
kh_destroy(strings, const_strings); //TODO: does not free memory correctly
|
||||
const_strings = NULL;
|
||||
pthread_rwlock_destroy(&hash_lock);
|
||||
}
|
||||
|
||||
// Convert from hash key to original 64bits value
|
||||
uintptr_t from_hash(ulong_t l) {
|
||||
// easy case first
|
||||
if((l&HASH_MSK)!=HASH_MSK) {
|
||||
return (uintptr_t)l;
|
||||
}
|
||||
if(l==0xffffffff) {
|
||||
return 0xffffffffffffffffll;
|
||||
}
|
||||
// get value from hash table second
|
||||
uintptr_t ret = 0;
|
||||
if(!hash_running) {
|
||||
//printf_log(LOG_INFO, "Warning, from_hash used but hash not running\n");
|
||||
return ret;
|
||||
}
|
||||
pthread_rwlock_rdlock(&hash_lock);
|
||||
khint_t k = kh_get(from, hash_from, l);
|
||||
if (k==kh_end(hash_from)) {
|
||||
ret = (uintptr_t)l;
|
||||
} else {
|
||||
ret = kh_value(hash_from, k);
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
return ret;
|
||||
}
|
||||
// same as from_hash
|
||||
uintptr_t from_hash_d(ulong_t l) {
|
||||
return from_hash(l);
|
||||
}
|
||||
|
||||
// Convert from 64bits to hash key, creating it if needed
|
||||
ulong_t to_hash(uintptr_t p) {
|
||||
if((p<0x100000000LL) && ((p&HASH_MSK)!=HASH_MSK))
|
||||
return (ulong_t)p;
|
||||
if(p==0xffffffffffffffffll) {
|
||||
return 0xffffffff;
|
||||
}
|
||||
ulong_t ret = 0;
|
||||
if(!hash_running) {
|
||||
//printf_log(LOG_INFO, "Warning, to_hash used but hash not running\n");
|
||||
return ret;
|
||||
}
|
||||
khint_t k;
|
||||
pthread_rwlock_rdlock(&hash_lock);
|
||||
k = kh_get(to, hash_to, p);
|
||||
if(k==kh_end(hash_to)) {
|
||||
// create a new key, but need write lock!
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
pthread_rwlock_wrlock(&hash_lock);
|
||||
ret = HASH_MSK | (((hash_cnt++)&HASH_VAL)<<HASH_SHIFT);
|
||||
int r;
|
||||
k = kh_put(to, hash_to, p, &r);
|
||||
kh_value(hash_to, k) = ret;
|
||||
k = kh_put(from, hash_from, ret, &r);
|
||||
kh_value(hash_from, k) = p;
|
||||
} else {
|
||||
ret = kh_value(hash_to, k);
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Convert from 64bits to hash key and delete the entry from both hash table
|
||||
ulong_t to_hash_d(uintptr_t p) {
|
||||
if((p<0x100000000LL) && ((p&HASH_MSK)!=HASH_MSK))
|
||||
return (ulong_t)p;
|
||||
if(p==0xffffffffffffffffll)
|
||||
return 0xffffffff;
|
||||
ulong_t ret = 0;
|
||||
if(!hash_running) {
|
||||
//printf_log(LOG_INFO, "Warning, to_hash_d used but hash not running\n");
|
||||
return ret;
|
||||
}
|
||||
khint_t k;
|
||||
pthread_rwlock_wrlock(&hash_lock);
|
||||
k = kh_get(to, hash_to, p);
|
||||
if(k==kh_end(hash_to)) {
|
||||
/// should this be an assert?
|
||||
} else {
|
||||
ret = kh_value(hash_to, k);
|
||||
// delete both entries
|
||||
//k = kh_get(to, hash_to, p);
|
||||
kh_del(to, hash_to, k);
|
||||
k = kh_get(from, hash_from, ret);
|
||||
kh_del(from, hash_from, k);
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
typedef struct struct_locale_s {
|
||||
void* p0[13]; // struct __locale_data *
|
||||
void* p1; //const unsigned short int *__ctype_b;
|
||||
void* p2; //const int *__ctype_tolower;
|
||||
void* p3; //const int *__ctype_toupper;
|
||||
void* p4[13]; //const char*
|
||||
} struct_locale_t;
|
||||
// not a real structure
|
||||
#define LOCALE_SIGN 0x54abcd845412LL
|
||||
typedef struct struct_locale_32_s {
|
||||
ptr_t p0[13];
|
||||
ptr_t p1;
|
||||
ptr_t p2;
|
||||
ptr_t p3;
|
||||
ptr_t p4[13];
|
||||
uint64_t sign;
|
||||
struct_locale_t* org; // save the orginal locale
|
||||
// copy of the array, in case some apps use them
|
||||
unsigned short int type_b[384];
|
||||
int tolower[384];
|
||||
int tohigher[384];
|
||||
} struct_locale_32_t;
|
||||
|
||||
void to_struct_locale(ptr_t d, const struct_locale_t *src) {
|
||||
if (!src) return;
|
||||
struct_locale_32_t* dest = from_ptrv(d);
|
||||
// save the original locale
|
||||
dest->sign = LOCALE_SIGN;
|
||||
dest->org = (void*)src;
|
||||
//copy the 2 arrays
|
||||
for(int i=0; i<13; ++i) {
|
||||
dest->p0[i] = to_hashv(src->p0[i]);
|
||||
}
|
||||
for(int i=0; i<13; ++i) {
|
||||
dest->p4[i] = to_cstring(src->p4[i]);
|
||||
}
|
||||
// copy the 3 ctype int (1st is short int, but int will do)
|
||||
memcpy(dest->type_b, src->p1-128*sizeof(short), 384*sizeof(short));
|
||||
memcpy(dest->tolower, src->p2-128*sizeof(int), 384*sizeof(int));
|
||||
memcpy(dest->tohigher, src->p3-128*sizeof(int), 384*sizeof(int));
|
||||
dest->p1 = to_ptrv(dest->type_b)+128*sizeof(short);
|
||||
dest->p2 = to_ptrv(dest->tolower)+128*sizeof(int);
|
||||
dest->p3 = to_ptrv(dest->tohigher)+128*sizeof(int);
|
||||
}
|
||||
void free_struct_locale(const struct_locale_t *src) {
|
||||
for(int i=0; i<13; ++i) {
|
||||
to_hash_d((uintptr_t)src->p0[i]);
|
||||
}
|
||||
/*for(int i=0; i<13; ++i) {
|
||||
to_hash_d((uintptr_t)src->p4[i]);
|
||||
}*/
|
||||
}
|
||||
|
||||
// Convert from locale key to original 64bits value
|
||||
void* from_locale(ptr_t l) {
|
||||
// easy case first
|
||||
if(l < 0x100) {
|
||||
return from_ptrv(l);
|
||||
}
|
||||
if(l == 0xffffffff) {
|
||||
return (void*)-1;
|
||||
}
|
||||
// get value from hash table second
|
||||
void* ret = 0;
|
||||
if(!hash_running) {
|
||||
//printf_log(LOG_INFO, "Warning, from_locale used but hash not running\n");
|
||||
return ret;
|
||||
}
|
||||
struct_locale_32_t* loc = from_ptrv(l);
|
||||
if(loc->sign==LOCALE_SIGN)
|
||||
return loc->org;
|
||||
pthread_rwlock_rdlock(&hash_lock);
|
||||
khint_t k = kh_get(from, locale_from, l);
|
||||
if (k==kh_end(locale_from)) {
|
||||
ret = from_ptrv(l);
|
||||
} else {
|
||||
ret = (void*)kh_value(locale_from, k);
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
//from_struct_locale((struct_locale_t*)ret, l);
|
||||
return ret;
|
||||
}
|
||||
// same as from_locale
|
||||
void* from_locale_d(ptr_t l) {
|
||||
return from_locale(l);
|
||||
}
|
||||
|
||||
// Convert from 64bits to locale key, creating it if needed
|
||||
ptr_t to_locale(void* p) {
|
||||
if((uintptr_t)p < 0x100) {
|
||||
return to_ptrv(p);
|
||||
}
|
||||
if(p == (void*)-1) {
|
||||
return 0xffffffff;
|
||||
}
|
||||
ptr_t ret = 0;
|
||||
if(!hash_running) {
|
||||
//printf_log(LOG_INFO, "Warning, to_locale used but hash not running\n");
|
||||
return ret;
|
||||
}
|
||||
khint_t k;
|
||||
pthread_rwlock_rdlock(&hash_lock);
|
||||
k = kh_get(to, locale_to, (uintptr_t)p);
|
||||
int conv = 0;
|
||||
if(k==kh_end(locale_to)) {
|
||||
// create a new key, but need write lock!
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
pthread_rwlock_wrlock(&hash_lock);
|
||||
// a locale_t is 5 pointer!
|
||||
void* m = calloc(1, sizeof(struct_locale_32_t)); // the 3 ctype value are also inside the locale struct
|
||||
ret = to_ptrv(m);
|
||||
// add to hash maps
|
||||
int r;
|
||||
k = kh_put(to, locale_to, (uintptr_t)p, &r);
|
||||
kh_value(locale_to, k) = ret;
|
||||
k = kh_put(from, locale_from, ret, &r);
|
||||
kh_value(locale_from, k) = (uintptr_t)p;
|
||||
conv = 1;
|
||||
} else {
|
||||
ret = kh_value(locale_to, k);
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
if(conv)
|
||||
to_struct_locale(ret, (struct_locale_t*)p);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Convert from 64bits to hash key and delete the entry from both hash table
|
||||
ptr_t to_locale_d(void* p) {
|
||||
if((uintptr_t)p < 0x100)
|
||||
return to_ptrv(p);
|
||||
ptr_t ret = 0;
|
||||
if(!hash_running)
|
||||
return ret;
|
||||
khint_t k;
|
||||
pthread_rwlock_wrlock(&hash_lock);
|
||||
k = kh_get(to, locale_to, (uintptr_t)p);
|
||||
if(k==kh_end(locale_to)) {
|
||||
/// should this be an assert?
|
||||
} else {
|
||||
ret = kh_value(locale_to, k);
|
||||
// free the memory
|
||||
free_struct_locale(p);
|
||||
free(from_ptrv(ret));
|
||||
// delete both entries
|
||||
k = kh_get(to, locale_to, (uintptr_t)p);
|
||||
kh_del(to, locale_to, k);
|
||||
k = kh_get(from, locale_from, ret);
|
||||
kh_del(from, locale_from, k);
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
char* from_cstring(ptr_t p) {
|
||||
return (char*)from_ptrv(p);
|
||||
}
|
||||
|
||||
ptr_t to_cstring(char* p) {
|
||||
if((uintptr_t)p<0x100000000LL)
|
||||
return to_ptrv(p);
|
||||
ptr_t ret = 0;
|
||||
pthread_rwlock_rdlock(&hash_lock);
|
||||
khint_t k = kh_get(strings, const_strings, p);
|
||||
if(k==kh_end(const_strings)) {
|
||||
// create a new key, but need write lock!
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
pthread_rwlock_wrlock(&hash_lock);
|
||||
ret = to_ptrv(box32_strdup(p));
|
||||
int r;
|
||||
k = kh_put(strings, const_strings, (char*)from_ptrv(ret), &r);
|
||||
kh_value(const_strings, k) = ret;
|
||||
} else
|
||||
ret = kh_value(const_strings, k);
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ptr_t to_cstring_d(char* p) {
|
||||
if((uintptr_t)p<0x100000000LL)
|
||||
return to_ptrv(p);
|
||||
ptr_t ret = 0;
|
||||
pthread_rwlock_wrlock(&hash_lock);
|
||||
khint_t k = kh_get(strings, const_strings, p);
|
||||
if(k==kh_end(const_strings)) {
|
||||
// assert?
|
||||
} else {
|
||||
ret = kh_value(const_strings, k);
|
||||
kh_del(strings, const_strings, k);
|
||||
box32_free(from_ptrv(ret));
|
||||
}
|
||||
pthread_rwlock_unlock(&hash_lock);
|
||||
return ret;
|
||||
}
|
||||
Executable → Regular
+183
-154
@@ -7,6 +7,7 @@
|
||||
#include <sys/mman.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "os.h"
|
||||
#include "box64context.h"
|
||||
#include "debug.h"
|
||||
#include "elfloader.h"
|
||||
@@ -14,11 +15,18 @@
|
||||
#include "threads.h"
|
||||
#include "x64trace.h"
|
||||
#include "bridge.h"
|
||||
#include "alternate.h"
|
||||
#include "librarian.h"
|
||||
#include "library.h"
|
||||
#include "wrapper.h"
|
||||
#include "x64emu.h"
|
||||
#include "signals.h"
|
||||
#include "gltools.h"
|
||||
#include "rbtree.h"
|
||||
#include "box64cpu.h"
|
||||
#ifdef BOX32
|
||||
#include "box32.h"
|
||||
#endif
|
||||
|
||||
EXPORTDYN
|
||||
void initAllHelpers(box64context_t* context)
|
||||
@@ -27,6 +35,9 @@ void initAllHelpers(box64context_t* context)
|
||||
if(inited)
|
||||
return;
|
||||
my_context = context;
|
||||
#ifdef BOX32
|
||||
init_hash_helper();
|
||||
#endif
|
||||
init_pthread_helper();
|
||||
init_bridge_helper();
|
||||
init_signal_helper(context);
|
||||
@@ -42,6 +53,9 @@ void finiAllHelpers(box64context_t* context)
|
||||
fini_pthread_helper(context);
|
||||
fini_signal_helper();
|
||||
fini_bridge_helper();
|
||||
#ifdef BOX32
|
||||
fini_hash_helper();
|
||||
#endif
|
||||
fini_custommem_helper(context);
|
||||
finied = 1;
|
||||
}
|
||||
@@ -58,52 +72,16 @@ int getrand(int maxval)
|
||||
|
||||
}
|
||||
|
||||
void free_tlsdatasize(void* p)
|
||||
{
|
||||
if(!p)
|
||||
return;
|
||||
tlsdatasize_t *data = (tlsdatasize_t*)p;
|
||||
free(data->tlsdata);
|
||||
free(p);
|
||||
}
|
||||
|
||||
void x64Syscall(x64emu_t *emu);
|
||||
|
||||
int unlockMutex()
|
||||
{
|
||||
int ret = unlockCustommemMutex();
|
||||
int i;
|
||||
#define GO(A, B) \
|
||||
i = checkUnlockMutex(&A); \
|
||||
if(i) { \
|
||||
ret|=(1<<B); \
|
||||
}
|
||||
|
||||
GO(my_context->mutex_once, 5)
|
||||
GO(my_context->mutex_once2, 6)
|
||||
GO(my_context->mutex_trace, 7)
|
||||
#ifdef DYNAREC
|
||||
GO(my_context->mutex_dyndump, 8)
|
||||
#else
|
||||
GO(my_context->mutex_lock, 8)
|
||||
#endif
|
||||
GO(my_context->mutex_tls, 9)
|
||||
GO(my_context->mutex_thread, 10)
|
||||
GO(my_context->mutex_bridge, 11)
|
||||
#undef GO
|
||||
|
||||
return ret;
|
||||
}
|
||||
void x86Syscall(x64emu_t *emu);
|
||||
|
||||
void relockMutex(int locks)
|
||||
{
|
||||
relockCustommemMutex(locks);
|
||||
#define GO(A, B) \
|
||||
if(locks&(1<<B)) \
|
||||
pthread_mutex_lock(&A); \
|
||||
mutex_trylock(&A); \
|
||||
|
||||
GO(my_context->mutex_once, 5)
|
||||
GO(my_context->mutex_once2, 6)
|
||||
GO(my_context->mutex_trace, 7)
|
||||
#ifdef DYNAREC
|
||||
GO(my_context->mutex_dyndump, 8)
|
||||
@@ -116,24 +94,39 @@ void relockMutex(int locks)
|
||||
#undef GO
|
||||
}
|
||||
|
||||
static void init_mutexes(box64context_t* context)
|
||||
void init_mutexes(box64context_t* context)
|
||||
{
|
||||
#ifndef DYNAREC
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
|
||||
pthread_mutex_init(&context->mutex_once, &attr);
|
||||
pthread_mutex_init(&context->mutex_once2, &attr);
|
||||
pthread_mutex_init(&context->mutex_trace, &attr);
|
||||
#ifndef DYNAREC
|
||||
pthread_mutex_init(&context->mutex_lock, &attr);
|
||||
#else
|
||||
pthread_mutex_init(&context->mutex_dyndump, &attr);
|
||||
#endif
|
||||
pthread_mutex_init(&context->mutex_trace, &attr);
|
||||
pthread_mutex_init(&context->mutex_tls, &attr);
|
||||
pthread_mutex_init(&context->mutex_thread, &attr);
|
||||
pthread_mutex_init(&context->mutex_bridge, &attr);
|
||||
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
#else
|
||||
#ifdef USE_CUSTOM_MUTEX
|
||||
native_lock_store(&context->mutex_trace, 0);
|
||||
native_lock_store(&context->mutex_tls, 0);
|
||||
native_lock_store(&context->mutex_thread, 0);
|
||||
native_lock_store(&context->mutex_bridge, 0);
|
||||
native_lock_store(&context->mutex_dyndump, 0);
|
||||
#else
|
||||
pthread_mutexattr_t attr;
|
||||
pthread_mutexattr_init(&attr);
|
||||
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
|
||||
pthread_mutex_init(&context->mutex_trace, &attr);
|
||||
pthread_mutex_init(&context->mutex_tls, &attr);
|
||||
pthread_mutex_init(&context->mutex_thread, &attr);
|
||||
pthread_mutex_init(&context->mutex_bridge, &attr);
|
||||
pthread_mutex_init(&context->mutex_dyndump, &attr);
|
||||
pthread_mutexattr_destroy(&attr);
|
||||
#endif
|
||||
pthread_mutex_init(&context->mutex_lock, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void atfork_child_box64context(void)
|
||||
@@ -142,6 +135,28 @@ static void atfork_child_box64context(void)
|
||||
init_mutexes(my_context);
|
||||
}
|
||||
|
||||
int box64_cycle_log_initialized = 0;
|
||||
|
||||
void freeCycleLog(box64context_t* ctx)
|
||||
{
|
||||
if (BOX64ENV(rolling_log) && box64_cycle_log_initialized) {
|
||||
box_free(ctx->log_call);
|
||||
box_free(ctx->log_ret);
|
||||
ctx->log_call = NULL;
|
||||
ctx->log_ret = NULL;
|
||||
box64_cycle_log_initialized = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void initCycleLog(box64context_t* context)
|
||||
{
|
||||
if(context && BOX64ENV(rolling_log)) {
|
||||
context->log_call = (char*)box_calloc(BOX64ENV(rolling_log), 256*sizeof(char));
|
||||
context->log_ret = (char*)box_calloc(BOX64ENV(rolling_log), 128*sizeof(char));
|
||||
box64_cycle_log_initialized = 1;
|
||||
}
|
||||
}
|
||||
|
||||
EXPORTDYN
|
||||
box64context_t *NewBox64Context(int argc)
|
||||
{
|
||||
@@ -152,49 +167,83 @@ box64context_t *NewBox64Context(int argc)
|
||||
}
|
||||
#endif
|
||||
// init and put default values
|
||||
box64context_t *context = my_context = (box64context_t*)calloc(1, sizeof(box64context_t));
|
||||
box64context_t *context = my_context = (box64context_t*)box_calloc(1, sizeof(box64context_t));
|
||||
|
||||
context->deferedInit = 1;
|
||||
context->sel_serial = 1;
|
||||
initCycleLog(context);
|
||||
|
||||
context->deferredInit = 1;
|
||||
|
||||
init_custommem_helper(context);
|
||||
|
||||
context->maplib = NewLibrarian(context, 1);
|
||||
context->local_maplib = NewLibrarian(context, 1);
|
||||
context->maplib = NewLibrarian(context);
|
||||
context->local_maplib = NewLibrarian(context);
|
||||
context->versym = NewDictionnary();
|
||||
context->system = NewBridge();
|
||||
// Cannot use Bridge name as the map is not initialized yet
|
||||
// create vsyscall
|
||||
context->vsyscall = AddBridge(context->system, vFEv, x64Syscall, 0, NULL);
|
||||
context->vsyscall = AddBridge(context->system, vFEv, box64_is32bits?x86Syscall:x64Syscall, 0, NULL);
|
||||
// create the vsyscalls
|
||||
context->vsyscalls[0] = AddVSyscall(context->system, 96);
|
||||
context->vsyscalls[1] = AddVSyscall(context->system, 201);
|
||||
context->vsyscalls[2] = AddVSyscall(context->system, 309);
|
||||
// create the alternate to map at address
|
||||
addAlternate((void*)0xffffffffff600000, (void*)context->vsyscalls[0]);
|
||||
addAlternate((void*)0xffffffffff600400, (void*)context->vsyscalls[1]);
|
||||
addAlternate((void*)0xffffffffff600800, (void*)context->vsyscalls[2]);
|
||||
if(box64_is32bits) {
|
||||
#ifdef BOX32
|
||||
addAlternate((void*)0xffffe400, from_ptrv(context->vsyscall));
|
||||
#endif
|
||||
} else {
|
||||
context->vsyscalls[0] = AddVSyscall(context->system, 96);
|
||||
context->vsyscalls[1] = AddVSyscall(context->system, 201);
|
||||
context->vsyscalls[2] = AddVSyscall(context->system, 309);
|
||||
// create the alternate to map at address
|
||||
addAlternate((void*)0xffffffffff600000, (void*)context->vsyscalls[0]);
|
||||
addAlternate((void*)0xffffffffff600400, (void*)context->vsyscalls[1]);
|
||||
addAlternate((void*)0xffffffffff600800, (void*)context->vsyscalls[2]);
|
||||
}
|
||||
// create exit bridge
|
||||
context->exit_bridge = AddBridge(context->system, NULL, NULL, 0, NULL);
|
||||
// get handle to box64 itself
|
||||
#ifndef STATICBUILD
|
||||
context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL);
|
||||
#endif
|
||||
context->dlprivate = NewDLPrivate();
|
||||
|
||||
context->argc = argc;
|
||||
context->argv = (char**)calloc(context->argc+1, sizeof(char*));
|
||||
context->argv = (char**)box_calloc(context->argc+1, sizeof(char*));
|
||||
|
||||
init_mutexes(context);
|
||||
pthread_atfork(NULL, NULL, atfork_child_box64context);
|
||||
|
||||
pthread_key_create(&context->tlskey, free_tlsdatasize);
|
||||
|
||||
|
||||
for (int i=0; i<8; ++i) context->canary[i] = 1 + getrand(255);
|
||||
context->canary[getrand(4)] = 0;
|
||||
printf_log(LOG_DEBUG, "Setting up canary (for Stack protector) at FS:0x28, value:%08X\n", *(uint32_t*)context->canary);
|
||||
|
||||
// init segments
|
||||
for(int i=0; i<16; i++) {
|
||||
context->seggdt[i].limit = (uintptr_t)-1LL;
|
||||
}
|
||||
// 0x53 selector
|
||||
context->seggdt[10].present = 1;
|
||||
// 0x43 selector
|
||||
context->seggdt[8].present = 1;
|
||||
// 0x33 selector
|
||||
context->seggdt[6].present = 1;
|
||||
// 0x2b selector
|
||||
context->seggdt[5].present = 1;
|
||||
// 0x23 selector
|
||||
context->seggdt[4].present = 1;
|
||||
context->seggdt[4].is32bits = 1;
|
||||
|
||||
context->globdata = NewMapSymbols();
|
||||
context->uniques = NewMapSymbols();
|
||||
|
||||
initAllHelpers(context);
|
||||
|
||||
#ifdef DYNAREC
|
||||
context->db_sizes = rbtree_init("db_sizes");
|
||||
#endif
|
||||
|
||||
return context;
|
||||
}
|
||||
|
||||
void freeALProcWrapper(box64context_t* context);
|
||||
void freeCUDAProcWrapper(box64context_t* context);
|
||||
EXPORTDYN
|
||||
void FreeBox64Context(box64context_t** context)
|
||||
{
|
||||
@@ -204,8 +253,9 @@ void FreeBox64Context(box64context_t** context)
|
||||
if(--(*context)->forked >= 0)
|
||||
return;
|
||||
|
||||
box64context_t* ctx = *context; // local copy to do the cleanning
|
||||
box64context_t* ctx = *context; // local copy to do the cleaning
|
||||
|
||||
//clean_current_emuthread(); // cleaning main thread seems a bad idea
|
||||
if(ctx->local_maplib)
|
||||
FreeLibrarian(&ctx->local_maplib, NULL);
|
||||
if(ctx->maplib)
|
||||
@@ -215,7 +265,7 @@ void FreeBox64Context(box64context_t** context)
|
||||
for(int i=0; i<ctx->elfsize; ++i) {
|
||||
FreeElfHeader(&ctx->elfs[i]);
|
||||
}
|
||||
free(ctx->elfs);
|
||||
box_free(ctx->elfs);
|
||||
|
||||
FreeCollection(&ctx->box64_path);
|
||||
FreeCollection(&ctx->box64_ld_lib);
|
||||
@@ -223,20 +273,22 @@ void FreeBox64Context(box64context_t** context)
|
||||
// stop trace now
|
||||
if(ctx->dec)
|
||||
DeleteX64TraceDecoder(&ctx->dec);
|
||||
if(ctx->dec32)
|
||||
DeleteX86TraceDecoder(&ctx->dec32);
|
||||
if(ctx->zydis)
|
||||
DeleteX64Trace(ctx);
|
||||
|
||||
if(ctx->deferedInitList)
|
||||
free(ctx->deferedInitList);
|
||||
if(ctx->deferredInitList)
|
||||
box_free(ctx->deferredInitList);
|
||||
|
||||
free(ctx->argv);
|
||||
/*box_free(ctx->argv);*/
|
||||
|
||||
for (int i=0; i<ctx->envc; ++i)
|
||||
free(ctx->envv[i]);
|
||||
free(ctx->envv);
|
||||
/*for (int i=0; i<ctx->envc; ++i)
|
||||
box_free(ctx->envv[i]);
|
||||
box_free(ctx->envv);*/
|
||||
|
||||
if(ctx->atfork_sz) {
|
||||
free(ctx->atforks);
|
||||
box_free(ctx->atforks);
|
||||
ctx->atforks = NULL;
|
||||
ctx->atfork_sz = ctx->atfork_cap = 0;
|
||||
}
|
||||
@@ -252,125 +304,102 @@ void FreeBox64Context(box64context_t** context)
|
||||
|
||||
FreeDLPrivate(&ctx->dlprivate);
|
||||
|
||||
free(ctx->fullpath);
|
||||
free(ctx->box64path);
|
||||
box_free(ctx->fullpath);
|
||||
box_free(ctx->box64path);
|
||||
box_free(ctx->bashpath);
|
||||
box_free(ctx->pythonpath);
|
||||
|
||||
FreeBridge(&ctx->system);
|
||||
|
||||
#ifndef STATICBUILD
|
||||
freeGLProcWrapper(ctx);
|
||||
freeALProcWrapper(ctx);
|
||||
freeCUDAProcWrapper(ctx);
|
||||
#ifdef BOX32
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if(ctx->stack_clone)
|
||||
free(ctx->stack_clone);
|
||||
box_free(ctx->stack_clone);
|
||||
|
||||
|
||||
void* ptr;
|
||||
if ((ptr = pthread_getspecific(ctx->tlskey)) != NULL) {
|
||||
free_tlsdatasize(ptr);
|
||||
pthread_setspecific(ctx->tlskey, NULL);
|
||||
}
|
||||
pthread_key_delete(ctx->tlskey);
|
||||
|
||||
if(ctx->tlsdata)
|
||||
free(ctx->tlsdata);
|
||||
box_free(ctx->tlsdata);
|
||||
|
||||
free_neededlib(&ctx->neededlibs);
|
||||
free_neededlib(ctx->neededlibs);
|
||||
ctx->neededlibs = NULL;
|
||||
|
||||
if(ctx->emu_sig)
|
||||
FreeX64Emu(&ctx->emu_sig);
|
||||
|
||||
FreeMapSymbols(&ctx->globdata);
|
||||
FreeMapSymbols(&ctx->uniques);
|
||||
|
||||
#ifdef DYNAREC
|
||||
//dynarec_log(LOG_INFO, "BOX64 Dynarec at exit: Max DB=%d, rightmost=%d\n", ctx->max_db_size, rb_get_rightmost(ctx->db_sizes));
|
||||
rbtree_delete(ctx->db_sizes);
|
||||
#endif
|
||||
|
||||
finiAllHelpers(ctx);
|
||||
|
||||
pthread_mutex_destroy(&ctx->mutex_once);
|
||||
pthread_mutex_destroy(&ctx->mutex_once2);
|
||||
pthread_mutex_destroy(&ctx->mutex_trace);
|
||||
#ifndef DYNAREC
|
||||
#ifdef DYNAREC
|
||||
pthread_mutex_destroy(&ctx->mutex_lock);
|
||||
#else
|
||||
pthread_mutex_destroy(&ctx->mutex_dyndump);
|
||||
#endif
|
||||
pthread_mutex_destroy(&ctx->mutex_trace);
|
||||
pthread_mutex_destroy(&ctx->mutex_lock);
|
||||
pthread_mutex_destroy(&ctx->mutex_tls);
|
||||
pthread_mutex_destroy(&ctx->mutex_thread);
|
||||
pthread_mutex_destroy(&ctx->mutex_bridge);
|
||||
#endif
|
||||
|
||||
free(ctx);
|
||||
freeCycleLog(ctx);
|
||||
|
||||
box_free(ctx);
|
||||
}
|
||||
|
||||
int AddElfHeader(box64context_t* ctx, elfheader_t* head) {
|
||||
int idx = ctx->elfsize;
|
||||
if(idx==ctx->elfcap) {
|
||||
// resize...
|
||||
ctx->elfcap += 16;
|
||||
ctx->elfs = (elfheader_t**)realloc(ctx->elfs, sizeof(elfheader_t*) * ctx->elfcap);
|
||||
int idx = 0;
|
||||
while(idx<ctx->elfsize && ctx->elfs[idx]) idx++;
|
||||
if(idx == ctx->elfsize) {
|
||||
if(idx==ctx->elfcap) {
|
||||
// resize...
|
||||
ctx->elfcap += 16;
|
||||
ctx->elfs = (elfheader_t**)box_realloc(ctx->elfs, sizeof(elfheader_t*) * ctx->elfcap);
|
||||
}
|
||||
ctx->elfs[idx] = head;
|
||||
ctx->elfsize++;
|
||||
} else {
|
||||
ctx->elfs[idx] = head;
|
||||
}
|
||||
ctx->elfs[idx] = head;
|
||||
ctx->elfsize++;
|
||||
printf_log(LOG_DEBUG, "Adding \"%s\" as #%d in elf collection\n", ElfName(head), idx);
|
||||
return idx;
|
||||
}
|
||||
|
||||
void RemoveElfHeader(box64context_t* ctx, elfheader_t* head) {
|
||||
if(GetTLSBase(head)) {
|
||||
// should remove the tls info
|
||||
int tlsbase = GetTLSBase(head);
|
||||
/*if(tlsbase == -ctx->tlssize) {
|
||||
// not really correct, but will do for now
|
||||
ctx->tlssize -= GetTLSSize(head);
|
||||
}*/
|
||||
}
|
||||
for(int i=0; i<ctx->elfsize; ++i)
|
||||
if(ctx->elfs[i] == head) {
|
||||
ctx->elfs[i] = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int AddTLSPartition(box64context_t* context, int tlssize) {
|
||||
int oldsize = context->tlssize;
|
||||
// should in fact first try to map a hole, but rewinding all elfs and checking filled space, like with the mapmem utilities
|
||||
context->tlssize += tlssize;
|
||||
context->tlsdata = realloc(context->tlsdata, context->tlssize);
|
||||
context->tlsdata = box_realloc(context->tlsdata, context->tlssize);
|
||||
memmove(context->tlsdata+tlssize, context->tlsdata, oldsize); // move to the top, using memmove as regions will probably overlap
|
||||
memset(context->tlsdata, 0, tlssize); // fill new space with 0 (not mandatory)
|
||||
// clean GS segment for current emu
|
||||
if(my_context) {
|
||||
//ResetSegmentsCache(thread_get_emu());
|
||||
if(!(++context->sel_serial))
|
||||
++context->sel_serial;
|
||||
}
|
||||
// clean GS segment for current emu?
|
||||
|
||||
return -context->tlssize; // negative offset
|
||||
}
|
||||
|
||||
void add_neededlib(needed_libs_t* needed, library_t* lib)
|
||||
{
|
||||
if(!needed)
|
||||
return;
|
||||
for(int i=0; i<needed->size; ++i)
|
||||
if(needed->libs[i] == lib)
|
||||
return;
|
||||
if(needed->size == needed->cap) {
|
||||
needed->cap += 8;
|
||||
needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*));
|
||||
}
|
||||
needed->libs[needed->size++] = lib;
|
||||
}
|
||||
|
||||
void free_neededlib(needed_libs_t* needed)
|
||||
{
|
||||
if(!needed)
|
||||
return;
|
||||
needed->cap = 0;
|
||||
needed->size = 0;
|
||||
if(needed->libs)
|
||||
free(needed->libs);
|
||||
needed->libs = NULL;
|
||||
}
|
||||
|
||||
void add_dependedlib(needed_libs_t* depended, library_t* lib)
|
||||
{
|
||||
if(!depended)
|
||||
return;
|
||||
for(int i=0; i<depended->size; ++i)
|
||||
if(depended->libs[i] == lib)
|
||||
return;
|
||||
if(depended->size == depended->cap) {
|
||||
depended->cap += 8;
|
||||
depended->libs = (library_t**)realloc(depended->libs, depended->cap*sizeof(library_t*));
|
||||
}
|
||||
depended->libs[depended->size++] = lib;
|
||||
}
|
||||
|
||||
void free_dependedlib(needed_libs_t* depended)
|
||||
{
|
||||
if(!depended)
|
||||
return;
|
||||
depended->cap = 0;
|
||||
depended->size = 0;
|
||||
if(depended->libs)
|
||||
free(depended->libs);
|
||||
depended->libs = NULL;
|
||||
}
|
||||
Executable → Regular
+2
-2
@@ -2,7 +2,7 @@
|
||||
#define __BOX64_VERSION_H_
|
||||
|
||||
#define BOX64_MAJOR 0
|
||||
#define BOX64_MINOR 1
|
||||
#define BOX64_REVISION 8
|
||||
#define BOX64_MINOR 4
|
||||
#define BOX64_REVISION 0
|
||||
|
||||
#endif //__BOX64_VERSION_H_
|
||||
Executable → Regular
+15
-17
@@ -1,27 +1,25 @@
|
||||
#include <stdio.h>
|
||||
#include "debug.h"
|
||||
#include "box64version.h"
|
||||
#ifdef NOGIT
|
||||
#define GITREV "nogit"
|
||||
#include "build_info.h"
|
||||
|
||||
#if defined(DYNAREC)
|
||||
#define WITH_DYNAREC_STR " with Dynarec"
|
||||
#else
|
||||
#include "git_head.h"
|
||||
#define WITH_DYNAREC_STR ""
|
||||
#endif
|
||||
|
||||
void PrintBox64Version()
|
||||
#ifdef HAVE_TRACE
|
||||
#define WITH_TRACE_STR " with trace"
|
||||
#else
|
||||
#define WITH_TRACE_STR ""
|
||||
#endif
|
||||
|
||||
void PrintBox64Version(int prefix)
|
||||
{
|
||||
printf("Box64%s%s v%d.%d.%d %s built on %s %s\n",
|
||||
#ifdef HAVE_TRACE
|
||||
" with trace",
|
||||
#else
|
||||
"",
|
||||
#endif
|
||||
#ifdef DYNAREC
|
||||
" with Dynarec",
|
||||
#else
|
||||
"",
|
||||
#endif
|
||||
BOX64_MAJOR, BOX64_MINOR, BOX64_REVISION,
|
||||
GITREV,
|
||||
PrintfFtrace(prefix, BOX64_BUILD_INFO_STRING WITH_DYNAREC_STR WITH_TRACE_STR " built on %s %s\n",
|
||||
__DATE__, __TIME__);
|
||||
}
|
||||
|
||||
#undef WITH_TRACE
|
||||
#undef WITH_DYNAREC
|
||||
Executable → Regular
+39
-2
@@ -1,6 +1,43 @@
|
||||
#include "box64version.h"
|
||||
#ifdef NOGIT
|
||||
#define GITREV "nogit"
|
||||
#else
|
||||
#include "git_head.h"
|
||||
#endif
|
||||
|
||||
#ifndef __BUILD_INFO_H__
|
||||
#define __BUILD_INFO_H__
|
||||
|
||||
void PrintBox64Version();
|
||||
|
||||
#endif //__BUILD_INFO_H__
|
||||
#if defined(DYNAREC) && (defined(ARM64) || defined(RV64) || defined(LA64))
|
||||
#if defined(ARM64)
|
||||
#define ARCH_STR " arm64"
|
||||
#elif defined(RV64)
|
||||
#define ARCH_STR " riscv64"
|
||||
#elif defined(LA64)
|
||||
#define ARCH_STR " loongarch64"
|
||||
#endif
|
||||
#else
|
||||
#define ARCH_STR ""
|
||||
#endif
|
||||
|
||||
void PrintBox64Version(int prefix);
|
||||
|
||||
#define BOX64_BUILD_INFO_STR_HELPER(x) #x
|
||||
#define BOX64_BUILD_INFO_STR(x) BOX64_BUILD_INFO_STR_HELPER(x)
|
||||
|
||||
#ifdef _WIN32
|
||||
#define BOX64_STR "WowBox64"
|
||||
#else
|
||||
#define BOX64_STR "Box64"
|
||||
#endif
|
||||
|
||||
#define BOX64_BUILD_INFO_STRING \
|
||||
BOX64_STR ARCH_STR \
|
||||
" v" BOX64_BUILD_INFO_STR(BOX64_MAJOR) "." BOX64_BUILD_INFO_STR(BOX64_MINOR) "." BOX64_BUILD_INFO_STR(BOX64_REVISION) " " GITREV
|
||||
|
||||
#define BOX64_BUILD_INFO_STRING_SHORT \
|
||||
BOX64_STR \
|
||||
" v" BOX64_BUILD_INFO_STR(BOX64_MAJOR) "." BOX64_BUILD_INFO_STR(BOX64_MINOR) "." BOX64_BUILD_INFO_STR(BOX64_REVISION)
|
||||
|
||||
#endif //__BUILD_INFO_H__
|
||||
+1488
File diff suppressed because it is too large.
Load diff
+2843
-895
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,56 @@
|
||||
#define _GNU_SOURCE /* See feature_test_macros(7) */
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "env.h"
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *) -1)
|
||||
#endif
|
||||
|
||||
#define EXPORT __attribute__((visibility("default")))
|
||||
#ifdef BUILD_DYNAMIC
|
||||
#define EXPORTDYN __attribute__((visibility("default")))
|
||||
#else
|
||||
#define EXPORTDYN
|
||||
#endif
|
||||
|
||||
#ifndef MAP_32BIT
|
||||
#define MAP_32BIT 0x40
|
||||
#endif
|
||||
|
||||
typedef void x64emu_t;
|
||||
extern void* mapallmem;
|
||||
extern int box64_is32bits;
|
||||
void setProtection(uintptr_t addr, size_t size, uint32_t prot);
|
||||
void freeProtection(uintptr_t addr, size_t size);
|
||||
void* InternalMmap(void* addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
|
||||
int InternalMunmap(void* addr, unsigned long length);
|
||||
void* box_mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
|
||||
|
||||
void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset);
|
||||
|
||||
extern int running32bits;
|
||||
extern box64env_t box64env;
|
||||
|
||||
EXPORT void* mmap64(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset)
|
||||
{
|
||||
void* ret;
|
||||
if(!addr && ((running32bits && BOX64ENV(mmap32)) || (flags&MAP_32BIT) || box64_is32bits))
|
||||
ret = box_mmap(addr, length, prot, flags | MAP_32BIT, fd, offset);
|
||||
else
|
||||
ret = InternalMmap(addr, length, prot, flags, fd, offset);
|
||||
if(ret!=MAP_FAILED && mapallmem)
|
||||
setProtection((uintptr_t)ret, length, prot);
|
||||
return ret;
|
||||
}
|
||||
EXPORT void* mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset) __attribute__((alias("mmap64")));
|
||||
|
||||
EXPORT int munmap(void* addr, unsigned long length)
|
||||
{
|
||||
int ret = InternalMunmap(addr, length);
|
||||
if(!ret && mapallmem) {
|
||||
freeProtection((uintptr_t)addr, length);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
Executable → Regular
+823
-225
File diff suppressed because it is too large.
Load diff
Executable → Regular
+6
-21
@@ -19,36 +19,21 @@ arm64_epilog:
|
||||
stp x24, x25, [x0, (8 * 14)]
|
||||
stp x26, x27, [x0, (8 * 16)] // put back reg value in emu, including EIP (so x27 must be EIP now)
|
||||
//restore all used register
|
||||
#ifdef _WIN32
|
||||
ldr x18, [x0, 3104]
|
||||
#endif
|
||||
add sp, x28, 0
|
||||
//vpop {d8-d15}
|
||||
ldp x19, x20, [sp, (8 * 0)]
|
||||
ldp x21, x22, [sp, (8 * 2)]
|
||||
ldp x23, x24, [sp, (8 * 4)]
|
||||
ldp x25, x26, [sp, (8 * 6)]
|
||||
ldr x27, [sp, (8 * 8)]
|
||||
ldp x27, x28, [sp, (8 * 8)]
|
||||
ldp d8, d9, [sp, (8 *10)]
|
||||
ldp d10, d11, [sp, (8 *12)]
|
||||
ldp d12, d13, [sp, (8 *14)]
|
||||
ldp d14, d15, [sp, (8 *16)]
|
||||
add sp, sp, (8 * 18)
|
||||
ldp lr, fp, [sp], 16 // saved lr
|
||||
//end, return...
|
||||
ret
|
||||
|
||||
|
||||
.global arm64_epilog_fast
|
||||
arm64_epilog_fast:
|
||||
//restore all used register
|
||||
//vpop {d8-d15}
|
||||
ldp x19, x20, [sp, (8 * 0)]
|
||||
ldp x21, x22, [sp, (8 * 2)]
|
||||
ldp x23, x24, [sp, (8 * 4)]
|
||||
ldp x25, x26, [sp, (8 * 6)]
|
||||
ldr x27, [sp, (8 * 8)]
|
||||
ldp d8, d9, [sp, (8 *10)]
|
||||
ldp d10, d11, [sp, (8 *12)]
|
||||
ldp d12, d13, [sp, (8 *14)]
|
||||
ldp d14, d15, [sp, (8 *16)]
|
||||
add sp, sp, (8 * 18)
|
||||
ldp lr, fp, [sp], 16 // saved lr
|
||||
ldp x30, x29, [sp], 16 // saved lr
|
||||
//end, return...
|
||||
ret
|
||||
@@ -0,0 +1,88 @@
|
||||
#include <stdint.h>
|
||||
#include "arm64_immenc.h"
|
||||
|
||||
#define one (uint64_t)1
|
||||
|
||||
// Returns the packed valid-N-imms-immr (1-1-6-6 bits); returns 0 if bitmask is not encodable
|
||||
int convert_bitmask(uint64_t bitmask) {
|
||||
if (bitmask == 0 || bitmask == ~0ULL) return 0;
|
||||
|
||||
uint64_t size, mask, pat;
|
||||
|
||||
for (size = 6; size > 1; --size) {
|
||||
mask = (one << (1 << (size - 1))) - 1;
|
||||
pat = bitmask & mask;
|
||||
|
||||
if (pat != ((bitmask >> (1 << (size - 1))) & mask)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mask = (size >= 6) ? ~0ULL : ((one << (1 << size)) - 1);
|
||||
pat = bitmask & mask;
|
||||
|
||||
for (uint64_t i = 1; i < 7 - size; ++i) {
|
||||
uint64_t boff = i * (1 << size);
|
||||
if (((bitmask >> boff) & mask) != pat) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int immr = 0;
|
||||
uint64_t last_bit = one << ((1 << size) - 1);
|
||||
|
||||
if (pat & 1) {
|
||||
while (pat & last_bit) {
|
||||
pat = ((pat - last_bit) << 1) | 1;
|
||||
++immr;
|
||||
}
|
||||
} else {
|
||||
immr = 1 << size;
|
||||
while (!(pat & 1)) {
|
||||
pat >>= 1;
|
||||
--immr;
|
||||
}
|
||||
}
|
||||
|
||||
if (pat & (pat + 1)) return 0;
|
||||
|
||||
int to = 1;
|
||||
while (pat & (one << to)) ++to;
|
||||
|
||||
return 0x2000 + ((size == 6) << 12) + ((((0x1E << size) & 0x3F) + (to - 1)) << 6) + immr;
|
||||
}
|
||||
|
||||
#if 0
|
||||
#include <unordered_set>
|
||||
int main() {
|
||||
std::unordered_set<uint64_t> okvals;
|
||||
uint64_t val;
|
||||
|
||||
for (int n = 1; n < 7; ++n) {
|
||||
int imms0 = ((n == 6) ? 0xC0 : 0x80) + ((0x1E << n) & 0x3F);
|
||||
for (int nones = 0; nones < (1 << n) - 1; ++nones) {
|
||||
val = (one << (nones + 1)) - 1;
|
||||
for (int j = 0; j < 6 - n; ++j) {
|
||||
val += val << (1 << (n + j));
|
||||
}
|
||||
for (int immr = 0; immr < (1 << n); ++immr) {
|
||||
int exp = ((imms0 + nones) << 6) + immr;
|
||||
int got = convert_bitmask(val);
|
||||
if (exp != got) {
|
||||
printf("0x%016lX: expected %04X, got %04X\n", val, exp, got);
|
||||
}
|
||||
okvals.emplace(val);
|
||||
val = (val >> 1) | ((val & 1) << 63);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma omp parallel for
|
||||
for (uint64_t i = 1; i < 0xFFFFFFFFFFFFFFFFu; ++i) {
|
||||
int got = convert_bitmask(i);
|
||||
if (!!got != (okvals.find(i) != okvals.cend())) {
|
||||
printf("0x%016lX: expected %s, got %04X\n", i, (!!got ? "non0" : "0000"), got);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,8 @@
|
||||
#ifndef __ARM64_IMMENC_H__
|
||||
#define __ARM64_IMMENC_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int convert_bitmask(uint64_t bitmask);
|
||||
|
||||
#endif // __ARM64_IMMENC_H__
|
||||
Executable → Regular
+334
-21
@@ -5,6 +5,7 @@
|
||||
.text
|
||||
.align 4
|
||||
|
||||
.extern cpuext
|
||||
.global arm64_lock_read_b
|
||||
.global arm64_lock_write_b
|
||||
.global arm64_lock_read_h
|
||||
@@ -15,10 +16,26 @@
|
||||
.global arm64_lock_write_dd
|
||||
.global arm64_lock_read_dq
|
||||
.global arm64_lock_write_dq
|
||||
.global arm64_lock_xchg
|
||||
.global arm64_lock_xchg_dd
|
||||
.global arm64_lock_xchg_d
|
||||
.global arm64_lock_xchg_h
|
||||
.global arm64_lock_xchg_b
|
||||
.global arm64_lock_storeifnull
|
||||
.global arm64_lock_storeifnull_d
|
||||
.global arm64_lock_storeifref
|
||||
|
||||
.global arm64_lock_storeifref2
|
||||
.global arm64_lock_storeifref_d
|
||||
.global arm64_lock_storeifref2_d
|
||||
.global arm64_lock_decifnot0b
|
||||
.global arm64_lock_storeb
|
||||
.global arm64_lock_incif0
|
||||
.global arm64_lock_decifnot0
|
||||
.global arm64_lock_store
|
||||
.global arm64_lock_store_dd
|
||||
.global arm64_lock_get_b
|
||||
.global arm64_lock_get_d
|
||||
.global arm64_lock_get_dd
|
||||
.global arm64_crc
|
||||
|
||||
arm64_lock_read_b:
|
||||
dmb ish
|
||||
@@ -89,43 +106,339 @@ arm64_lock_write_dq:
|
||||
ret
|
||||
|
||||
|
||||
arm64_lock_xchg:
|
||||
arm64_lock_xchg_dd:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_xchg_dd
|
||||
dmb ish
|
||||
arm64_lock_xchg_0:
|
||||
arm64_lock_xchg_dd_0:
|
||||
// address is x0, value is x1, return old value in x0
|
||||
ldaxr x2, [x0]
|
||||
stlxr w3, x1, [x0]
|
||||
cbnz w3, arm64_lock_xchg_0
|
||||
dmb ish
|
||||
cbnz w3, arm64_lock_xchg_dd_0
|
||||
mov x0, x2
|
||||
ret
|
||||
|
||||
arm64_atomic_xchg_dd:
|
||||
dmb ish
|
||||
// address is x0, value is x1, return old value in x0
|
||||
swpal x1, x0, [x0]
|
||||
ret
|
||||
|
||||
arm64_lock_xchg_d:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_xchg_d
|
||||
dmb ish
|
||||
arm64_lock_xchg_d_0:
|
||||
// address is x0, value is x1, return old value in x0
|
||||
ldaxr w2, [x0]
|
||||
stlxr w3, w1, [x0]
|
||||
cbnz w3, arm64_lock_xchg_d_0
|
||||
mov w0, w2
|
||||
ret
|
||||
|
||||
arm64_atomic_xchg_d:
|
||||
dmb ish
|
||||
// address is x0, value is x1, return old value in x0
|
||||
swpal w1, w0, [x0]
|
||||
ret
|
||||
|
||||
arm64_lock_xchg_h:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_xchg_h
|
||||
dmb ish
|
||||
arm64_lock_xchg_h_0:
|
||||
// address is x0, value is x1, return old value in x0
|
||||
ldaxrh w2, [x0]
|
||||
stlxrh w3, w1, [x0]
|
||||
cbnz w3, arm64_lock_xchg_h_0
|
||||
mov w0, w2
|
||||
ret
|
||||
|
||||
arm64_atomic_xchg_h:
|
||||
dmb ish
|
||||
// address is x0, value is x1, return old value in x0
|
||||
swpalh w1, w0, [x0]
|
||||
ret
|
||||
|
||||
arm64_lock_xchg_b:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_xchg_b
|
||||
dmb ish
|
||||
arm64_lock_xchg_b_0:
|
||||
// address is x0, value is x1, return old value in x0
|
||||
ldaxrb w2, [x0]
|
||||
stlxrb w3, w1, [x0]
|
||||
cbnz w3, arm64_lock_xchg_b_0
|
||||
mov w0, w2
|
||||
ret
|
||||
|
||||
arm64_atomic_xchg_b:
|
||||
dmb ish
|
||||
// address is x0, value is x1, return old value in x0
|
||||
swpalb w1, w0, [x0]
|
||||
ret
|
||||
|
||||
arm64_lock_storeifnull:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_storeifnull
|
||||
dmb ish
|
||||
arm64_lock_storeifnull_0:
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is 0. return new [x0] value (so x1 or old value)
|
||||
1:
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is 0. return old [x0] value
|
||||
ldaxr x2, [x0]
|
||||
cbnz x2, arm64_lock_storeifnull_exit
|
||||
mov x2, x1
|
||||
stlxr w3, x2, [x0]
|
||||
cbnz w3, arm64_lock_storeifnull_0
|
||||
arm64_lock_storeifnull_exit:
|
||||
dmb ish
|
||||
cbnz x2, 2f
|
||||
stlxr w3, x1, [x0]
|
||||
cbnz w3, 1b
|
||||
2:
|
||||
mov x0, x2
|
||||
ret
|
||||
|
||||
arm64_lock_storeifref:
|
||||
arm64_atomic_storeifnull:
|
||||
dmb ish
|
||||
arm64_lock_storeifref_0:
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is x3. return new [x0] value (so x1 or old value)
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is 0. return old [x0] value
|
||||
mov x2, xzr
|
||||
casal x2, x1, [x0]
|
||||
mov x0, x2
|
||||
ret
|
||||
|
||||
|
||||
arm64_lock_storeifnull_d:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_storeifnull_d
|
||||
dmb ish
|
||||
1:
|
||||
// address is x0, value is w1, w1 store to x0 only if [x0] is 0. return old [x0] value
|
||||
ldaxr w2, [x0]
|
||||
cbnz w2, 2f
|
||||
stlxr w3, w1, [x0]
|
||||
cbnz w3, 1b
|
||||
2:
|
||||
dmb ish
|
||||
mov w0, w2
|
||||
ret
|
||||
|
||||
arm64_atomic_storeifnull_d:
|
||||
dmb ish
|
||||
// address is x0, value is w1, w1 store to x0 only if [x0] is 0. return old [x0] value
|
||||
mov x2, xzr
|
||||
casal w2, w1, [x0]
|
||||
mov w0, w2
|
||||
ret
|
||||
|
||||
arm64_lock_storeifref:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_storeifref
|
||||
dmb ish
|
||||
1:
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return new [x0] value (so x1 or old value)
|
||||
ldaxr x3, [x0]
|
||||
cmp x2, x3
|
||||
bne arm64_lock_storeifref_exit
|
||||
bne 2f
|
||||
stlxr w4, x1, [x0]
|
||||
cbnz w4, arm64_lock_storeifref_0
|
||||
cbnz w4, 1b
|
||||
mov x0, x1
|
||||
ret
|
||||
arm64_lock_storeifref_exit:
|
||||
dmb ish
|
||||
2:
|
||||
mov x0, x3
|
||||
ret
|
||||
|
||||
arm64_atomic_storeifref:
|
||||
dmb ish
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return new [x0] value (so x1 or old value)
|
||||
mov x3, x2
|
||||
casal x2, x1, [x0]
|
||||
cmp x2, x3
|
||||
mov x0, x1
|
||||
ret
|
||||
2:
|
||||
mov x0, x3
|
||||
ret
|
||||
|
||||
arm64_lock_storeifref_d:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_storeifref_d
|
||||
dmb ish
|
||||
1:
|
||||
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return new [x0] value (so x1 or old value)
|
||||
ldaxr w3, [x0]
|
||||
cmp w2, w3
|
||||
bne 2f
|
||||
stlxr w4, w1, [x0]
|
||||
cbnz w4, 1b
|
||||
mov w0, w1
|
||||
ret
|
||||
2:
|
||||
mov w0, w3
|
||||
ret
|
||||
|
||||
arm64_atomic_storeifref_d:
|
||||
dmb ish
|
||||
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return new [x0] value (so w1 or old value)
|
||||
mov w3, w2
|
||||
casal w2, w1, [x0]
|
||||
cmp w2, w3
|
||||
mov w0, w1
|
||||
ret
|
||||
2:
|
||||
mov w0, w3
|
||||
ret
|
||||
|
||||
arm64_lock_storeifref2_d:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_storeifref2_d
|
||||
dmb ish
|
||||
1:
|
||||
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return old [x0] value
|
||||
ldaxr w3, [x0]
|
||||
cmp w2, w3
|
||||
bne 2f
|
||||
stlxr w4, w1, [x0]
|
||||
cbnz w4, 1b
|
||||
2:
|
||||
mov w0, w3
|
||||
ret
|
||||
|
||||
arm64_atomic_storeifref2_d:
|
||||
dmb ish
|
||||
// address is x0, value is w1, w1 store to x0 only if [x0] is w2. return old [x0] value
|
||||
casal w2, w1, [x0]
|
||||
mov w0, w2
|
||||
ret
|
||||
|
||||
arm64_lock_storeifref2:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_storeifref2
|
||||
dmb ish
|
||||
1:
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return old [x0] value
|
||||
ldaxr x3, [x0]
|
||||
cmp x2, x3
|
||||
bne 2f
|
||||
stlxr w4, x1, [x0]
|
||||
cbnz w4, 1b
|
||||
2:
|
||||
mov x0, x3
|
||||
ret
|
||||
|
||||
arm64_atomic_storeifref2:
|
||||
dmb ish
|
||||
// address is x0, value is x1, x1 store to x0 only if [x0] is x2. return old [x0] value
|
||||
casal x2, x1, [x0]
|
||||
mov x0, x2
|
||||
ret
|
||||
|
||||
arm64_lock_decifnot0b:
|
||||
dmb ish
|
||||
1:
|
||||
ldaxrb w1, [x0]
|
||||
cmp w1, #0
|
||||
beq 2f
|
||||
sub w1, w1, #1
|
||||
stlxrb w2, w1, [x0]
|
||||
cbnz w2, 1b
|
||||
2:
|
||||
ret
|
||||
|
||||
arm64_lock_storeb:
|
||||
strb w1, [x0]
|
||||
dmb ish
|
||||
ret
|
||||
|
||||
arm64_lock_decifnot0:
|
||||
dmb ish
|
||||
1:
|
||||
ldaxr w1, [x0]
|
||||
cmp w1, #0
|
||||
beq 2f
|
||||
sub w3, w1, #1
|
||||
stlxr w2, w3, [x0]
|
||||
cbnz w2, 1b
|
||||
2:
|
||||
mov w0, w1
|
||||
ret
|
||||
|
||||
arm64_lock_incif0:
|
||||
adrp x3, cpuext
|
||||
add x3, x3, #:lo12:cpuext
|
||||
ldr w3, [x3]
|
||||
tbnz w3, #0, arm64_atomic_incif0
|
||||
dmb ish
|
||||
1:
|
||||
ldaxr w1, [x0]
|
||||
cmp w1, #0
|
||||
bne 2f
|
||||
add w3, w1, #1
|
||||
stlxr w2, w3, [x0]
|
||||
cbnz w2, 1b
|
||||
2:
|
||||
mov w0, w1
|
||||
ret
|
||||
|
||||
arm64_atomic_incif0:
|
||||
mov w1, #1
|
||||
dmb ish
|
||||
swpal w1, wzr, [x0]
|
||||
mov w0, w1
|
||||
ret
|
||||
|
||||
arm64_lock_store:
|
||||
str w1, [x0]
|
||||
dmb ish
|
||||
ret
|
||||
|
||||
arm64_lock_store_dd:
|
||||
str x1, [x0]
|
||||
dmb ish
|
||||
ret
|
||||
|
||||
arm64_lock_get_b:
|
||||
ldaxrb w0, [x0]
|
||||
ret
|
||||
|
||||
arm64_lock_get_d:
|
||||
ldaxr w0, [x0]
|
||||
ret
|
||||
|
||||
arm64_lock_get_dd:
|
||||
ldaxr x0, [x0]
|
||||
ret
|
||||
|
||||
arm64_crc:
|
||||
//x0 is address, w1 is len
|
||||
mov x2, x0 // address is x2 now
|
||||
mov w0, wzr // crc is w0
|
||||
1:
|
||||
cmp w1, #8
|
||||
blo 2f
|
||||
ldr x3, [x2], #8
|
||||
crc32x w0, w0, x3
|
||||
subs w1, w1, #8
|
||||
bne 1b
|
||||
2:
|
||||
cbz w1, 4f
|
||||
3:
|
||||
ldrb w3, [x2], #1
|
||||
crc32b w0, w0, w3
|
||||
subs w1, w1, #1
|
||||
bne 3b
|
||||
4:
|
||||
ret
|
||||
Executable → Regular
+63
-5
@@ -27,13 +27,71 @@ extern void arm64_lock_read_dq(uint64_t * a, uint64_t* b, void* addr);
|
||||
// STLXRD of ADDR, return 0 if ok, 1 if not
|
||||
extern int arm64_lock_write_dq(uint64_t a, uint64_t b, void* addr);
|
||||
|
||||
// Atomicaly exchange value at [p] with val, return old p
|
||||
extern uintptr_t arm64_lock_xchg(void* p, uintptr_t val);
|
||||
// Atomically exchange value at [p] with val, return old p
|
||||
extern uintptr_t arm64_lock_xchg_dd(void* p, uintptr_t val);
|
||||
extern uintptr_t arm64_atomic_xchg_dd(void* p, uintptr_t val);
|
||||
|
||||
// Atomicaly store value to [p] only if [p] is NULL. Return new [p] value (so val or old)
|
||||
// Atomically exchange value at [p] with val, return old p
|
||||
extern uint32_t arm64_lock_xchg_d(void* p, uint32_t val);
|
||||
extern uint32_t arm64_atomic_xchg_d(void* p, uint32_t val);
|
||||
|
||||
// Atomically exchange value at [p] with val, return old p
|
||||
extern uint32_t arm64_lock_xchg_h(void* p, uint32_t val);
|
||||
extern uint32_t arm64_atomic_xchg_h(void* p, uint32_t val);
|
||||
|
||||
// Atomically exchange value at [p] with val, return old p
|
||||
extern uint32_t arm64_lock_xchg_b(void* p, uint32_t val);
|
||||
extern uint32_t arm64_atomic_xchg_b(void* p, uint32_t val);
|
||||
|
||||
// Atomically store value to [p] only if [p] is NULL. Return old [p] value
|
||||
extern uint32_t arm64_lock_storeifnull_d(void*p, uint32_t val);
|
||||
extern uint32_t arm64_atomic_storeifnull_d(void*p, uint32_t val);
|
||||
|
||||
// Atomically store value to [p] only if [p] is NULL. Return old [p] value
|
||||
extern void* arm64_lock_storeifnull(void*p, void* val);
|
||||
extern void* arm64_atomic_storeifnull(void*p, void* val);
|
||||
|
||||
// Atomicaly store value to [p] only if [p] is ref. Return new [p] value (so val or old)
|
||||
// Atomically store value to [p] only if [p] is ref. Return new [p] value (so val or old)
|
||||
extern void* arm64_lock_storeifref(void*p, void* val, void* ref);
|
||||
extern void* arm64_atomic_storeifref(void*p, void* val, void* ref);
|
||||
|
||||
#endif //__ARM64_LOCK__H__
|
||||
// Atomically store value to [p] only if [p] is ref. Return old [p] value (so val or old)
|
||||
extern void* arm64_lock_storeifref2(void*p, void* val, void* ref);
|
||||
extern void* arm64_atomic_storeifref2(void*p, void* val, void* ref);
|
||||
|
||||
// Atomically store value to [p] only if [p] is ref. Return new [p] value (so val or old)
|
||||
extern uint32_t arm64_lock_storeifref_d(void*p, uint32_t val, uint32_t ref);
|
||||
extern uint32_t arm64_atomic_storeifref_d(void*p, uint32_t val, uint32_t ref);
|
||||
|
||||
// Atomically store value to [p] only if [p] is ref. Return old [p] value (so ref or old)
|
||||
extern uint32_t arm64_lock_storeifref2_d(void*p, uint32_t val, uint32_t ref);
|
||||
extern uint32_t arm64_atomic_storeifref2_d(void*p, uint32_t val, uint32_t ref);
|
||||
|
||||
// decrement atomically the byte at [p] (but only if p not 0)
|
||||
extern void arm64_lock_decifnot0b(void*p);
|
||||
|
||||
// atomic store (with memory barrier)
|
||||
extern void arm64_lock_storeb(void*p, uint8_t b);
|
||||
|
||||
// increment atomically the int at [p] only if it was 0. Return the old value of [p]
|
||||
extern int arm64_lock_incif0(void*p);
|
||||
|
||||
// decrement atomically the int at [p] (but only if p not 0)
|
||||
extern int arm64_lock_decifnot0(void*p);
|
||||
|
||||
// atomic store (with memory barrier)
|
||||
extern void arm64_lock_store(void*p, uint32_t v);
|
||||
|
||||
// atomic store (with memory barrier)
|
||||
extern void arm64_lock_store_dd(void*p, uint64_t v);
|
||||
|
||||
// atomic get (with memory barrier)
|
||||
extern uint8_t arm64_lock_get_b(void*p);
|
||||
|
||||
// atomic get (with memory barrier)
|
||||
extern uint32_t arm64_lock_get_d(void*p);
|
||||
|
||||
// atomic get (with memory barrier)
|
||||
extern void* arm64_lock_get_dd(void*p);
|
||||
|
||||
#endif //__ARM64_LOCK__H__
|
||||
@@ -0,0 +1,149 @@
|
||||
#ifndef __ARM64_MAPPING_H__
|
||||
#define __ARM64_MAPPING_H__
|
||||
|
||||
|
||||
/*
|
||||
ARM64 Linux Call Convention
|
||||
|
||||
SP The Stack Pointer.
|
||||
r30 LR The Link Register.
|
||||
r29 FP The Frame Pointer
|
||||
r19…r28 Callee-saved registers
|
||||
r18 The Platform Register, if needed; otherwise a temporary register. See notes.
|
||||
r17 IP1 The second intra-procedure-call temporary register (can be used by call veneers and PLT code); at other times may be used as a temporary register.
|
||||
r16 IP0 The first intra-procedure-call scratch register (can be used by call veneers and PLT code); at other times may be used as a temporary register.
|
||||
r9…r15 Temporary registers
|
||||
r8 Indirect result location register
|
||||
r0…r7 Parameter/result registers
|
||||
|
||||
For SIMD:
|
||||
The first eight registers, v0-v7, are used to pass argument values into a subroutine and to return result values from a function.
|
||||
They may also be used to hold intermediate values within a routine (but, in general, only between subroutine calls).
|
||||
|
||||
Registers v8-v15 must be preserved by a callee across subroutine calls;
|
||||
the remaining registers (v0-v7, v16-v31) do not need to be preserved (or should be preserved by the caller).
|
||||
Additionally, only the bottom 64 bits of each value stored in v8-v15 need to be preserved [8];
|
||||
it is the responsibility of the caller to preserve larger values.
|
||||
|
||||
For SVE:
|
||||
z0-z7 are used to pass scalable vector arguments to a subroutine, and to return scalable vector results from a function.
|
||||
If a subroutine takes at least one argument in scalable vector registers or scalable predicate registers,
|
||||
or returns results in such regisers, the subroutine must ensure that the entire contents of z8-z23 are preserved across the call.
|
||||
In other cases it need only preserve the low 64 bits of z8-z15, as described in SIMD and Floating-Point registers.
|
||||
p0-p3 are used to pass scalable predicate arguments to a subroutine and to return scalable predicate results from a function.
|
||||
If a subroutine takes at least one argument in scalable vector registers or scalable predicate registers,
|
||||
or returns results in such registers, the subroutine must ensure that p4-p15 are preserved across the call.
|
||||
In other cases it need not preserve any scalable predicate register contents.
|
||||
|
||||
*/
|
||||
|
||||
// x86 Register mapping
|
||||
#define xRAX 10
|
||||
#define xRCX 11
|
||||
#define xRDX 12
|
||||
#define xRBX 13
|
||||
#define xRSP 14
|
||||
#define xRBP 15
|
||||
#define xRSI 16
|
||||
#define xRDI 17
|
||||
#define xR8 18
|
||||
#define xR9 19
|
||||
#define xR10 20
|
||||
#define xR11 21
|
||||
#define xR12 22
|
||||
#define xR13 23
|
||||
#define xR14 24
|
||||
#define xR15 25
|
||||
#define xFlags 26
|
||||
#define xRIP 27
|
||||
#define xSavedSP 28
|
||||
|
||||
// convert a x86 register to native according to the register mapping
|
||||
#define TO_NAT(A) (xRAX + (A))
|
||||
#define IS_GPR(A) ((A)>=xRAX && (A)<=xRIP)
|
||||
|
||||
// 32bits version
|
||||
#define wEAX xRAX
|
||||
#define wECX xRCX
|
||||
#define wEDX xRDX
|
||||
#define wEBX xRBX
|
||||
#define wESP xRSP
|
||||
#define wEBP xRBP
|
||||
#define wESI xRSI
|
||||
#define wEDI xRDI
|
||||
#define wR8 xR8
|
||||
#define wR9 xR9
|
||||
#define wR10 xR10
|
||||
#define wR11 xR11
|
||||
#define wR12 xR12
|
||||
#define wR13 xR13
|
||||
#define wR14 xR14
|
||||
#define wR15 xR15
|
||||
#define wFlags xFlags
|
||||
// scratch registers
|
||||
#define x1 1
|
||||
#define x2 2
|
||||
#define x3 3
|
||||
#define x4 4
|
||||
#define x5 5
|
||||
#define x6 6
|
||||
#define x87pc 7
|
||||
// x87 can be a scratch, but check if it's used as x87 PC and restore if needed in that case
|
||||
// 32bits version of scratch
|
||||
#define w1 x1
|
||||
#define w2 x2
|
||||
#define w3 x3
|
||||
#define w4 x4
|
||||
#define w5 x5
|
||||
#define w6 x6
|
||||
#define w87pc x87pc
|
||||
// emu is r0
|
||||
#define xEmu 0
|
||||
// ARM64 LR
|
||||
#define xLR 30
|
||||
// ARM64 SP is r31 but is a special register
|
||||
#define xSP 31
|
||||
// xZR regs is 31
|
||||
#define xZR 31
|
||||
#define wZR xZR
|
||||
|
||||
// conditions
|
||||
// Z == 1
|
||||
#define cEQ 0b0000
|
||||
// Z != 1
|
||||
#define cNE 0b0001
|
||||
// C == 1
|
||||
#define cCS 0b0010
|
||||
// C == 1
|
||||
#define cHS cCS
|
||||
// C != 1
|
||||
#define cCC 0b0011
|
||||
// C != 1
|
||||
#define cLO cCC
|
||||
// N == 1
|
||||
#define cMI 0b0100
|
||||
// N != 1
|
||||
#define cPL 0b0101
|
||||
// V == 1
|
||||
#define cVS 0b0110
|
||||
// V != 1
|
||||
#define cVC 0b0111
|
||||
// C == 1 && Z == 0
|
||||
#define cHI 0b1000
|
||||
// C !=1 || Z == 1
|
||||
#define cLS 0b1001
|
||||
// N == V
|
||||
#define cGE 0b1010
|
||||
// N != V
|
||||
#define cLT 0b1011
|
||||
// N == V && Z == 0
|
||||
#define cGT 0b1100
|
||||
// N != V || Z == 1
|
||||
#define cLE 0b1101
|
||||
// always
|
||||
#define c__ 0b1110
|
||||
|
||||
//FCMP type of opcode produce:
|
||||
// if any NAN: CV / v1 == v2: ZC / v1 < v2: N / v1 > v2: C
|
||||
|
||||
#endif //__ARM64_MAPPING_H__
|
||||
Executable → Regular
+7
-1
@@ -9,6 +9,8 @@
|
||||
.extern LinkNext
|
||||
|
||||
.global arm64_next
|
||||
|
||||
.8byte 0 // NULL pointer before arm64_next, for getDB
|
||||
arm64_next:
|
||||
// emu is r0
|
||||
// IP address is r1
|
||||
@@ -20,7 +22,11 @@ arm64_next:
|
||||
stp x16, x17, [sp, (8 * 8)]
|
||||
stp x18, x27, [sp, (8 * 10)] // also save x27(rip) to allow change in LinkNext
|
||||
|
||||
mov x2, lr // "from" is in lr, so put in x2
|
||||
#ifdef _WIN32
|
||||
ldr x18, [x0, 3104]
|
||||
#endif
|
||||
mov x1, x27 // xRIP, should not be needed most of the time
|
||||
mov x2, x30 // "from" is in lr, so put in x2
|
||||
add x3, sp, 8*11 // x3 is address to change rip
|
||||
// call the function
|
||||
bl LinkNext
|
||||
|
||||
Executable → Regular
+677
-62
File diff suppressed because it is too large.
Load diff
Executable → Regular
+6
-2
@@ -9,13 +9,13 @@
|
||||
.global arm64_prolog
|
||||
arm64_prolog:
|
||||
//save all 18 used register
|
||||
stp lr, fp, [sp, -16]! // save lr
|
||||
stp x30, x29, [sp, -16]! // save lr
|
||||
sub sp, sp, (8 * 18)
|
||||
stp x19, x20, [sp, (8 * 0)]
|
||||
stp x21, x22, [sp, (8 * 2)]
|
||||
stp x23, x24, [sp, (8 * 4)]
|
||||
stp x25, x26, [sp, (8 * 6)]
|
||||
str x27, [sp, (8 * 8)]
|
||||
stp x27, X28, [sp, (8 * 8)]
|
||||
stp d8, d9, [sp, (8 *10)]
|
||||
stp d10, d11, [sp, (8 *12)]
|
||||
stp d12, d13, [sp, (8 *14)]
|
||||
@@ -31,5 +31,9 @@ arm64_prolog:
|
||||
ldp x22, x23, [x0, (8 * 12)]
|
||||
ldp x24, x25, [x0, (8 * 14)]
|
||||
ldp x26, x27, [x0, (8 * 16)]
|
||||
// Push a jump next on the stack
|
||||
stp xzr, xzr, [sp, -16]!
|
||||
// Save old xSP in x28
|
||||
add x28, sp, 16
|
||||
//jump to function
|
||||
br x1
|
||||
Executable → Regular
+2837
-738
File diff suppressed because it is too large.
Load diff
Loaded 100 of 2336 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user