Compare commits
501 Commits
coreos-one
...
master
Author | SHA1 | Date |
---|---|---|
Glenn Washburn | 2df2912266 | |
Glenn Washburn | ac301e4dd0 | |
Glenn Washburn | c30f378e00 | |
Glenn Washburn | c98a78ae81 | |
Glenn Washburn | 84ff10b1c0 | |
Glenn Washburn | 8471d8e254 | |
Florian La Roche | 3ec59f14f4 | |
Petr Vorel | c55480daca | |
Patrick Steinhardt | ee12785f75 | |
Tianjia Zhang | 6efd04f314 | |
Tianjia Zhang | de094060ac | |
Daniel Kiper | 1e81bf6d2d | |
Daniel Kiper | c386331364 | |
Daniel Kiper | 30c4e3ca40 | |
Martin Whitaker | 8451454889 | |
Javier Martinez Canillas | a6838bbc67 | |
Florian La Roche | 3e9d8c4ce4 | |
Glenn Washburn | e1b0992a8d | |
Glenn Washburn | 3b3ac0c982 | |
Patrick Steinhardt | eb77486141 | |
Patrick Steinhardt | 1066336dc8 | |
Patrick Steinhardt | b35792dccb | |
Cao jin | 74259522d7 | |
Ave Milia | a0ba8fae61 | |
Colin Watson | e7b8856f8b | |
Peter Jones | 0dcbf3652b | |
Alexey Makhalov | f7bd9986f6 | |
Daniel Kiper | 098058752e | |
Peter Jones | d2cf823d0e | |
Peter Jones | b73cee7f1f | |
Peter Jones | 879c4a8342 | |
Peter Jones | f5703eb062 | |
Alexey Makhalov | 07e5b79e22 | |
Chris Coulson | 426f57383d | |
Chris Coulson | 1a8d9c9b4a | |
Alexey Makhalov | 61ff5602fe | |
Alexey Makhalov | caea56d1f8 | |
Alexey Makhalov | 781b3e5efc | |
Konrad Rzeszutek Wilk | f8ad7a3dd8 | |
Konrad Rzeszutek Wilk | d17770857e | |
Konrad Rzeszutek Wilk | 61b7ca08d1 | |
Konrad Rzeszutek Wilk | 16c0dbf4bc | |
Chris Coulson | dc052e5ac7 | |
Alexey Makhalov | 6d7a59a2a1 | |
Alexey Makhalov | 26a8c19307 | |
Daniel Kiper | 89f3da1a3d | |
Peter Jones | 2a1edcf2ed | |
Peter Jones | 3f05d693d1 | |
Peter Jones | f725fa7cb2 | |
Peter Jones | 64e26162eb | |
Peter Jones | 68708c4503 | |
Peter Jones | a4d3fbdff1 | |
Marc Zyngier | 6a34fdb76a | |
Ian Jackson | a81401ff49 | |
Ian Jackson | 7a9b30143b | |
Javier Martinez Canillas | 96be75ecbd | |
Javier Martinez Canillas | cc6bd49a52 | |
Daniel Kiper | 15d76540a7 | |
Daniel Kiper | c894713836 | |
Tianjia Zhang | c867185b81 | |
Daniel Kiper | f39f1ec5d9 | |
Daniel Kiper | f2d56dea9d | |
Daniel Kiper | 4aa9614e0a | |
Jacob Kroon | 5ab40eb9f7 | |
Tianjia Zhang | 0fa9ed41ac | |
Javier Martinez Canillas | 0f3600bf1b | |
Hans Ulrich Niedermann | 2f317c8f19 | |
Hans Ulrich Niedermann | f7dcb6a5c2 | |
Hans Ulrich Niedermann | 2ceae0ae25 | |
Hans Ulrich Niedermann | 641a144085 | |
Hans Ulrich Niedermann | 6cfa746654 | |
Hans Ulrich Niedermann | c745f02165 | |
Hans Ulrich Niedermann | 26b7d55d82 | |
Hans Ulrich Niedermann | 16923f88ad | |
Daniel Kiper | eb46ee98bc | |
Patrick Steinhardt | c543d67810 | |
Patrick Steinhardt | e933feb578 | |
Patrick Steinhardt | 3b81607b55 | |
Steve Langasek | 46d76f8fef | |
Hans de Goede | 12341958d2 | |
Hans de Goede | 2d7c3abd87 | |
Hans de Goede | ea138d11be | |
Hans de Goede | 8bab36af60 | |
Hans de Goede | 5bcdf67642 | |
Javier Martinez Canillas | 30586747f1 | |
Paul Menzel | b0c7769a41 | |
Daniel Axtens | 06fd69a3fd | |
Flavio Suligoi | 2a6308b954 | |
Michael Chang | 68006d1732 | |
Michael Chang | bdf170d101 | |
Simon Hardy | 6643507ce3 | |
Tianjia Zhang | 800de4a1d0 | |
Michael Chang | 5e5a47b8a7 | |
Michael Chang | 0454b04453 | |
Patrick Steinhardt | 552c9fd081 | |
Patrick Steinhardt | 2c43ab4ef7 | |
David Michael | 20def1a3c3 | |
David Michael | 8ad7c23864 | |
Mike Gilbert | 1657e72f5b | |
John Paul Adrian Glaubitz | 2bfd3654a6 | |
Peter Jones | 9b89b1dedb | |
Peter Jones | 3e8c338bfa | |
Peter Jones | c73cda3495 | |
Peter Jones | df84d6e94c | |
Andrei Borzenkov | df5d96de42 | |
Alexander Graf | e642c95ab6 | |
Peter Jones | f0f97576e0 | |
Peter Jones | 8d88ae92b5 | |
Peter Jones | 42f4054faf | |
Peter Jones | cc93c5a849 | |
Peter Jones | ea04f131a4 | |
Julian Andres Klode | 87049f9716 | |
Mike Gilbert | 2e246b6fec | |
Colin Watson | ac116bd659 | |
Peter Jones | d5a32255de | |
Mike Gilbert | c71be831f1 | |
Mike Gilbert | 3137ecd97c | |
Patrick Steinhardt | 9404c41953 | |
Michael Chang | d0de8b37f6 | |
Peter Jones | 0ad07e928a | |
Peter Jones | 03e72830ab | |
Robert Marshall | 9f03dc5d7b | |
Paulo Flabiano Smorigo | cb2f15c544 | |
Paulo Flabiano Smorigo | febc761e67 | |
Javier Martinez Canillas | e921119857 | |
Paulo Flabiano Smorigo | 8c2c35dcc0 | |
Javier Martinez Canillas | aa096037ae | |
Peter Jones | 3165efcfc2 | |
Peter Jones | 598de14d93 | |
C. Masloch | e96e785580 | |
Patrick Steinhardt | 365e0cc3e7 | |
Patrick Steinhardt | dd3f49b106 | |
Patrick Steinhardt | 5324c335b1 | |
Patrick Steinhardt | 9fbdec2f6b | |
Patrick Steinhardt | c6a84545a3 | |
Patrick Steinhardt | 528938d503 | |
Lukasz Hawrylko | 0f3f5b7c13 | |
Paul Menzel | 7e28ca82bb | |
Daniel Kiper | b53a2f2c66 | |
David Sterba | 495781f5ed | |
Lenny Szubowicz | e2c09aed97 | |
Michael Chang | 5e5a15872d | |
Michael Chang | 42acdd3b40 | |
Eli Schwartz | 28a7e597de | |
Peter Jones | b78d570a36 | |
Michael Bideau | 33203ca348 | |
Prarit Bhargava | ee4bd79ef2 | |
Nicholas Vinson | c7cb11b219 | |
Colin Watson | ff3e91be9c | |
Andreas Schwab | 11268841e2 | |
Andreas Schwab | a57977b5fa | |
Peter Jones | f9e28d250a | |
Marcel Kolaja | ab2e53c8a1 | |
Gustavo Luiz Duarte | fc085f7f18 | |
Andre Przywara | 3ea9bc3c06 | |
James Clarke | 4e75b2ae31 | |
Vladimir Serbinenko | 8f6843ce60 | |
Heinrich Schuchardt | 15cfd02b74 | |
David Michael | 688023cd0a | |
David Michael | 261df54f17 | |
David Michael | dabdfa1c6a | |
Andreas Schwab | 2bf40e9e5b | |
Leif Lindholm | 2d55ffecbb | |
Jacob Kroon | f2b9083f85 | |
Daniel Kiper | 26094f5241 | |
Daniel Kiper | 2a2e10c1b3 | |
Thomas Schmitt | f9811a92e6 | |
Eric Snowberg | ff999c803e | |
Leif Lindholm | 4e7b5bb3be | |
Vladimir 'phcoder' Serbinenko | 5610734770 | |
John Paul Adrian Glaubitz | 8e8723a6be | |
Vincent Legoll | 53e70d30cf | |
Mathieu Trudel-Lapierre | afd6ad4297 | |
Ovidiu Panait | 4ff34fefe4 | |
Michael Chang | a06b079a36 | |
Alexander Graf | ce946603cf | |
Alexander Graf | 1ce93f944d | |
Michael Chang | 4dd4ceec02 | |
Michael Chang | 4868e17507 | |
Michael Chang | 85e08e174e | |
Michael Chang | 0b1bf3932f | |
Michael Chang | 621024090b | |
Michael Chang | 0e49748fad | |
Michael Chang | 4f4128defd | |
Michael Chang | 7ea474c688 | |
Heinrich Schuchardt | bc58fded50 | |
Daniel Kiper | acc726f812 | |
Vladimir Serbinenko | 94d9926a66 | |
Vladimir Serbinenko | ad4bfeec5c | |
Vladimir Serbinenko | c6725996a9 | |
Eric Snowberg | 0f1b648b45 | |
Daniel Kiper | fa20550f16 | |
Andrew Jeddeloh | e683cfb0cf | |
Eric Snowberg | ffe3921538 | |
Eric Snowberg | 4fff586386 | |
Eric Snowberg | 3c65959673 | |
Vladimir Serbinenko | 4dace5f60e | |
John Paul Adrian Glaubitz | 63d568ed2e | |
John Paul Adrian Glaubitz | 5635e799fd | |
Vladimir Serbinenko | f91e4d1633 | |
Vladimir Serbinenko | 16910a8cb9 | |
Vladimir Serbinenko | 18fd1007e3 | |
Vladimir Serbinenko | c25a1c93c5 | |
Vladimir Serbinenko | 98c3a1a76b | |
Vladimir Serbinenko | 384091967d | |
Vladimir Serbinenko | 3562536fd5 | |
Vladimir Serbinenko | d900dfa985 | |
Vladimir Serbinenko | 4ff051880f | |
Daniel Kiper | 9dab2f51ea | |
Daniel Kiper | e42b0d97ec | |
Daniel Kiper | c7bdb8273c | |
Daniel Kiper | ee025e512f | |
Daniel Kiper | 1bc2b481c4 | |
Colin Watson | bcd29eea07 | |
Marek Marczykowski-Górecki | 67580c0068 | |
Colin Watson | 5dfa0afa16 | |
Andrei Borzenkov | 5bc41db756 | |
Andrei Borzenkov | 5a4f9d5c04 | |
Andrei Borzenkov | 5a365fed87 | |
Andrei Borzenkov | 93289dc67c | |
Andrei Borzenkov | 12e1b6e604 | |
Andrei Borzenkov | 5459243465 | |
Andrei Borzenkov | 7ace83295a | |
Andrei Borzenkov | bd21d6465e | |
Andrei Borzenkov | 4c44bbd835 | |
Andrei Borzenkov | 0b5c14c7f6 | |
Jesús Diéguez Fernández | 46f5d51343 | |
Jesús Diéguez Fernández | 3611c4f42e | |
Eric Snowberg | 9a0703b559 | |
Eric Snowberg | 3434ddec0e | |
Paul Menzel | 6c5ee45548 | |
Vladimir Serbinenko | 41121742df | |
Colin Watson | 35b909062e | |
Colin Watson | f8f35acb5b | |
Colin Watson | 62daa27056 | |
James Clarke | 222cb8f6df | |
Steve McIntyre | 686db96646 | |
Daniel Kiper | 718b3fb1dc | |
Alexander Graf | 7f6cfc5f40 | |
Steve McIntyre | 082fd84d52 | |
Leif Lindholm | 566b16a0dc | |
Paul Menzel | d3a3543a56 | |
Alexander Graf | c956126a51 | |
Alexander Graf | f1957dc8a3 | |
Alexander Graf | e795b9011f | |
Alexander Graf | 861212333e | |
Alexander Graf | e0d32cca1d | |
Alexander Graf | 222a34304c | |
Alexander Graf | 4bcb1ac4f7 | |
Alexander Graf | ff6871831d | |
Alexander Graf | cfec209370 | |
Alexander Graf | 7b0f169c80 | |
Alexander Graf | e4b84a0d7c | |
Alexander Graf | 9223eff8f8 | |
Alexander Graf | a51f953f4e | |
Alexander Graf | e347f40c1a | |
Guillaume GARDET | 748e544fd0 | |
Leif Lindholm | a0e4ee533d | |
Cristian Ciocaltea | 088f7f56e5 | |
Max Tottenham | f8d1ad2678 | |
Colin Watson | ed087f0460 | |
Peter Große | e86f6aafb8 | |
Heinrich Schuchardt | ad0ea7c444 | |
Matthew Garrett | a791dc0e35 | |
Matthew Garrett | d6ca0a90ca | |
Matthew Garrett | d3a5e812c5 | |
Juergen Gross | d789e70e26 | |
Juergen Gross | 90b7b14fa5 | |
Juergen Gross | 78899c42d7 | |
Juergen Gross | 9bce25213a | |
Hans van Kranenburg | a40b219e26 | |
Juergen Gross | 9c062ad42c | |
Juergen Gross | 1d2473a024 | |
Juergen Gross | 4c9b4a7c92 | |
Juergen Gross | 2b7a21afd3 | |
Juergen Gross | da81e42a7c | |
Juergen Gross | 1a4d83af2f | |
Juergen Gross | 0b3e4eb2d2 | |
Juergen Gross | 53a92dea8b | |
Juergen Gross | 3b8d09c774 | |
Juergen Gross | bec9edf53f | |
Juergen Gross | 408de833bb | |
Juergen Gross | fc9d47ead5 | |
Juergen Gross | c84927272c | |
Juergen Gross | d170be42f1 | |
Juergen Gross | 9118effd1b | |
Daniel Kiper | 95db97d041 | |
Daniel Kiper | e5b846333f | |
Eric Snowberg | 29157553b7 | |
Nick Terrell | 3861286486 | |
Nick Terrell | 461f1d8af1 | |
Michael Chang | e8b37e2c8d | |
Lee Jones | 5c6f9bc156 | |
Lee Jones | 25e35377a8 | |
Leif Lindholm | 58bfe43581 | |
Leif Lindholm | 9d0559c647 | |
Leif Lindholm | dfb1742aab | |
Leif Lindholm | 7453c2cc32 | |
Leif Lindholm | a5d865a039 | |
Matthew Daley | c0a9f53478 | |
Colin Watson | e720eef6a6 | |
Paul Menzel | b71ac53751 | |
Daniel Kiper | 878398c1a3 | |
Daniel Kiper | ee7808e219 | |
Vladimir Serbinenko | 3d612924c3 | |
Daniel Kiper | b07feb8746 | |
Daniel Kiper | 5b8d535395 | |
Vladimir Serbinenko | 4d4a8c96e3 | |
Vladimir Serbinenko | 75a919e334 | |
Vladimir Serbinenko | ca0a4f689a | |
Daniel Kiper | f3f8347569 | |
Goffredo Baroncelli | 72e80c0255 | |
Goffredo Baroncelli | fa926cb4b4 | |
Goffredo Baroncelli | 94854d9c3d | |
Goffredo Baroncelli | c743736048 | |
Goffredo Baroncelli | c6f79aca80 | |
Goffredo Baroncelli | fd5a1d82f1 | |
Goffredo Baroncelli | 908cdb1d02 | |
Goffredo Baroncelli | 846f7a8310 | |
Goffredo Baroncelli | 81e2673fb6 | |
Michael Chang | 8ada906031 | |
Mihai Moldovan | 5b9308aff0 | |
Adam Williamson | 8b467844e1 | |
Colin Watson | 7e23437df3 | |
Colin Watson | bcfa0f08bb | |
Julian Andres Klode | a661a321c3 | |
dann frazier | 478e54b738 | |
Cao jin | d2374cfb71 | |
Paul Menzel | d62cafcf35 | |
Cao jin | 5d7d13ce44 | |
Colin Watson | b607d2a79e | |
Colin Watson | 7090b77341 | |
Peter Jones | 8317c9eab9 | |
Peter Jones | a6c83d4a20 | |
Leif Lindholm | 9bfba354bb | |
Leif Lindholm | 9415914e0f | |
Leif Lindholm | ad2bebc6fc | |
Leif Lindholm | c79ebcd18c | |
Leif Lindholm | a2f26adfef | |
Leif Lindholm | 77808dd66b | |
Leif Lindholm | d0c070179d | |
Leif Lindholm | d24dd12086 | |
Leif Lindholm | bad144c60f | |
Leif Lindholm | 8ec18d1a4c | |
Arindam Nath | 886edba877 | |
Leif Lindholm | 9b37229f01 | |
Leif Lindholm | 40dc61ed75 | |
Hans de Goede | edece25a77 | |
Cao jin | 4e9d9358e0 | |
Denis 'GNUtoo' Carikli | ec2de93f8d | |
Leif Lindholm | 347210a5d5 | |
Leif Lindholm | e93fd6b776 | |
Will Thompson | 0083541593 | |
Alexander Boettcher | 14ec665c3f | |
Daniel Kiper | ba474d531a | |
Daniel Kiper | cda0a857dd | |
Oleg Solovyov | 6d28b3bd26 | |
Michael Chang | b66e364f13 | |
Nicholas Vinson | 51be3372ec | |
Nicholas Vinson | 0c0bcffc23 | |
Nicholas Vinson | a16f4a822f | |
Nicholas Vinson | c2b86ae1fc | |
Olaf Hering | 3d8439da8c | |
Cao jin | 9dcac673ed | |
Jaegeuk Kim | 71f9e4ac44 | |
Michael Chang | 563b1da6e6 | |
mike.travis@hpe.com | a537d65018 | |
Eric Snowberg | 5ceb55b7a0 | |
Eric Snowberg | e2faabacff | |
C. Masloch | c225298038 | |
Matthew S. Turnbull | a698240df0 | |
Eric Snowberg | 28b0d19061 | |
dann frazier | d73badfd0a | |
Eric Snowberg | 599efeb622 | |
Eric Snowberg | ab4c93cb4b | |
Eric Snowberg | ad6d8f5063 | |
Daniel Kiper | c422bb6019 | |
Eric Snowberg | f02037afe3 | |
Eric Snowberg | 820c64e4c0 | |
Eric Snowberg | 6003eb2fea | |
Eric Snowberg | f35826423e | |
John Paul Adrian Glaubitz | 25b2b22d54 | |
Peter Jones | 413f1e13e6 | |
Peter Jones | ebc825b549 | |
Peter Jones | 7542af695f | |
Peter Jones | e30de94926 | |
Peter Jones | 594ac31571 | |
Peter Jones | 352868d123 | |
Peter Jones | e1ead149ef | |
Joakim Bech | 72b425b640 | |
Leif Lindholm | a244d9ebc7 | |
Leif Lindholm | cda0332986 | |
Leif Lindholm | 7fd9722d0c | |
Leif Lindholm | ff1cf2548a | |
Leif Lindholm | 7d36709d5e | |
Leif Lindholm | 3245f02d9d | |
Leif Lindholm | 8776e5a942 | |
Leif Lindholm | 083c6e2455 | |
Colin Watson | e5ba6b2618 | |
Eric Snowberg | 2391d57909 | |
Daniel Kiper | ae2a274518 | |
H.J. Lu | 842c390469 | |
Steve McIntyre | 6400613ad0 | |
Eric Snowberg | d85c76b501 | |
Eric Snowberg | 69e0a67bfb | |
Stefan Fritsch | 566a03a623 | |
dann frazier | 52ef7b23f5 | |
Julien Grall | d34977cb66 | |
Jordan Glover | 5033080eb6 | |
Eric Snowberg | 2dc163bf69 | |
Eric Snowberg | 2a88564017 | |
Eric Snowberg | 3d8df86d82 | |
David E. Box | 446794de8d | |
Alexander Graf | 92bfc33db9 | |
Alexander Graf | 0ba90a7f01 | |
Konrad Rzeszutek Wilk | b4d709b6ee | |
Konrad Rzeszutek Wilk | a8e0f1adf7 | |
Vladimir Serbinenko | 78d2b81bd1 | |
Vladimir Serbinenko | 1b18d6b0d3 | |
Vladimir Serbinenko | 95acd4cbda | |
Vladimir Serbinenko | 4f31bfe1d3 | |
Vladimir Serbinenko | 061258a05e | |
Vladimir Serbinenko | 32099228e6 | |
Vladimir Serbinenko | ec763ed00a | |
Stefan Fritsch | b18ce97c67 | |
Vladimir Serbinenko | c42acc23ff | |
Patrick Steinhardt | e75cf4a58b | |
Vladimir Serbinenko | 3d86efda00 | |
Xuan Guo | 5435aaac3c | |
Vladimir Serbinenko | 6ccb2d54bc | |
Vladimir Serbinenko | 4bfd26623f | |
Vladimir Serbinenko | 6cc79ec10c | |
Vladimir Serbinenko | c36c2a8640 | |
Vladimir Serbinenko | 3732816bc0 | |
Vladimir Serbinenko | 26e5aea941 | |
Vladimir Serbinenko | 21e4a6fa03 | |
Vladimir Serbinenko | 6662372053 | |
Vladimir Serbinenko | 7108c0c86e | |
Pete Batard | 1deebd85ef | |
Pete Batard | bdd89d239c | |
Leif Lindholm | f826330683 | |
Leif Lindholm | 91212e0aa0 | |
Leif Lindholm | c5841ba7f0 | |
Leif Lindholm | 8c9465fac9 | |
Vladimir Serbinenko | 4bc909bf89 | |
Leif Lindholm | dd5fde2df8 | |
Vladimir Serbinenko | e66dc5d71e | |
Vladimir Serbinenko | 9e962fd3c4 | |
Pali Rohár | 435fa75e01 | |
Pali Rohár | 76188809d5 | |
Pete Batard | fa42786264 | |
Rob Clark | e8ab5a1a9e | |
Vladimir Serbinenko | 68d54b55f4 | |
Vladimir Serbinenko | cb8b7e4e36 | |
AppChecker | a0fe0c26aa | |
Vladimir Serbinenko | 284afab081 | |
phcoder | d8901e3ba1 | |
phcoder | edb37fb30b | |
Eric Biggers | 734668238f | |
Eric Snowberg | f8679cedff | |
Fu Wei | 26c2f306fd | |
Fu Wei | d33045ce7f | |
Fu Wei | 8eed7be8a6 | |
Julien Grall | ae5817f1dc | |
Eric Snowberg | bd4e40aadd | |
Vladimir Serbinenko | c4b8bec5fe | |
Julius Werner | 70b555a52a | |
Vladimir Serbinenko | c6eaa982d1 | |
Vladimir Serbinenko | 5c3fd1b135 | |
Vladimir Serbinenko | b0b1b81a11 | |
Vladimir Serbinenko | c4313c812d | |
Vladimir Serbinenko | 4f8471532d | |
Vladimir Serbinenko | d11ced1e1f | |
Vladimir Serbinenko | 058df7b5a9 | |
Vladimir Serbinenko | 265292f2b0 | |
Vladimir Serbinenko | 656c3b0d7f | |
Vladimir Serbinenko | 3edabad8fe | |
Vladimir Serbinenko | 848bed9d92 | |
Vladimir Serbinenko | 216950a4ee | |
Vladimir Serbinenko | ac6b41b89f | |
Vladimir Serbinenko | 5a865b3786 | |
Vladimir Serbinenko | fcbb723d4b | |
Vladimir Serbinenko | 24e37a8852 | |
Vladimir Serbinenko | 9808c3ef95 | |
Vladimir Serbinenko | 1daa716c70 | |
Vladimir Serbinenko | 461bfab7b7 | |
Vladimir Serbinenko | d08c968514 | |
Vladimir Serbinenko | a35ac85430 | |
Paulo Flabiano Smorigo | d9f7de0ae3 | |
Vladimir Serbinenko | dc6e1b5af8 | |
Vladimir Serbinenko | ede6c96893 | |
Vladimir Serbinenko | a827807a13 | |
Vladimir Serbinenko | 1073ddb120 | |
Vladimir Serbinenko | 4341f82af0 | |
Vladimir Serbinenko | c2ea443446 | |
Vladimir Serbinenko | 608bec5112 | |
Vladimir Serbinenko | 6dec3a26b3 | |
Vladimir Serbinenko | b43b8cacc8 | |
Vladimir Serbinenko | 37865c2c4a | |
Vladimir Serbinenko | 5a0c548ba3 | |
Vladimir Serbinenko | b0bad6fd94 |
|
@ -0,0 +1 @@
|
||||||
|
po/exclude.pot binary
|
|
@ -1,249 +1,277 @@
|
||||||
00_header
|
#
|
||||||
10_*
|
# Ignore patterns in this directory and all subdirectories.
|
||||||
20_linux_xen
|
#
|
||||||
30_os-prober
|
|
||||||
40_custom
|
|
||||||
41_custom
|
|
||||||
*.1
|
*.1
|
||||||
*.8
|
*.8
|
||||||
aclocal.m4
|
*.a
|
||||||
ahci_test
|
|
||||||
ascii.bitmaps
|
|
||||||
ascii.h
|
|
||||||
autom4te.cache
|
|
||||||
build-grub-gen-asciih
|
|
||||||
build-grub-gen-widthspec
|
|
||||||
build-grub-mkfont
|
|
||||||
cdboot_test
|
|
||||||
cmp_test
|
|
||||||
config.cache
|
|
||||||
config.guess
|
|
||||||
config.h
|
|
||||||
config-util.h
|
|
||||||
config-util.h.in
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
config.sub
|
|
||||||
configure
|
|
||||||
core_compress_test
|
|
||||||
DISTLIST
|
|
||||||
docs/*.info
|
|
||||||
docs/stamp-vti
|
|
||||||
docs/version.texi
|
|
||||||
ehci_test
|
|
||||||
example_grub_script_test
|
|
||||||
example_scripted_test
|
|
||||||
example_unit_test
|
|
||||||
*.exec
|
*.exec
|
||||||
*.exec.exe
|
*.exec.exe
|
||||||
fddboot_test
|
|
||||||
genkernsyms.sh
|
|
||||||
gensymlist.sh
|
|
||||||
gentrigtables
|
|
||||||
gentrigtables.exe
|
|
||||||
gettext_strings_test
|
|
||||||
grub-bin2h
|
|
||||||
/grub-bios-setup
|
|
||||||
/grub-bios-setup.exe
|
|
||||||
grub_cmd_date
|
|
||||||
grub_cmd_echo
|
|
||||||
grub_cmd_regexp
|
|
||||||
grub_cmd_set_date
|
|
||||||
grub_cmd_sleep
|
|
||||||
/grub-editenv
|
|
||||||
/grub-editenv.exe
|
|
||||||
grub-emu
|
|
||||||
grub-emu-lite
|
|
||||||
grub-emu.exe
|
|
||||||
grub-emu-lite.exe
|
|
||||||
grub_emu_init.c
|
|
||||||
grub_emu_init.h
|
|
||||||
/grub-file
|
|
||||||
/grub-file.exe
|
|
||||||
grub-fstest
|
|
||||||
grub-fstest.exe
|
|
||||||
grub_fstest_init.c
|
|
||||||
grub_fstest_init.h
|
|
||||||
grub_func_test
|
|
||||||
grub-install
|
|
||||||
grub-install.exe
|
|
||||||
grub-kbdcomp
|
|
||||||
/grub-macbless
|
|
||||||
/grub-macbless.exe
|
|
||||||
grub-macho2img
|
|
||||||
/grub-menulst2cfg
|
|
||||||
/grub-menulst2cfg.exe
|
|
||||||
/grub-mk*
|
|
||||||
grub-mount
|
|
||||||
/grub-ofpathname
|
|
||||||
/grub-ofpathname.exe
|
|
||||||
grub-core/build-grub-pe2elf.exe
|
|
||||||
/grub-probe
|
|
||||||
/grub-probe.exe
|
|
||||||
grub_probe_init.c
|
|
||||||
grub_probe_init.h
|
|
||||||
/grub-reboot
|
|
||||||
grub_script_blanklines
|
|
||||||
grub_script_blockarg
|
|
||||||
grub_script_break
|
|
||||||
grub-script-check
|
|
||||||
grub-script-check.exe
|
|
||||||
grub_script_check_init.c
|
|
||||||
grub_script_check_init.h
|
|
||||||
grub_script_comments
|
|
||||||
grub_script_continue
|
|
||||||
grub_script_dollar
|
|
||||||
grub_script_echo1
|
|
||||||
grub_script_echo_keywords
|
|
||||||
grub_script_escape_comma
|
|
||||||
grub_script_eval
|
|
||||||
grub_script_expansion
|
|
||||||
grub_script_final_semicolon
|
|
||||||
grub_script_for1
|
|
||||||
grub_script_functions
|
|
||||||
grub_script_gettext
|
|
||||||
grub_script_if
|
|
||||||
grub_script_leading_whitespace
|
|
||||||
grub_script_no_commands
|
|
||||||
grub_script_not
|
|
||||||
grub_script_return
|
|
||||||
grub_script_setparams
|
|
||||||
grub_script_shift
|
|
||||||
grub_script_strcmp
|
|
||||||
grub_script_test
|
|
||||||
grub_script_vars1
|
|
||||||
grub_script_while1
|
|
||||||
grub_script.tab.c
|
|
||||||
grub_script.tab.h
|
|
||||||
grub_script.yy.c
|
|
||||||
grub_script.yy.h
|
|
||||||
grub-set-default
|
|
||||||
grub_setup_init.c
|
|
||||||
grub_setup_init.h
|
|
||||||
grub-shell
|
|
||||||
grub-shell-tester
|
|
||||||
grub-sparc64-setup
|
|
||||||
grub-sparc64-setup.exe
|
|
||||||
/grub-syslinux2cfg
|
|
||||||
/grub-syslinux2cfg.exe
|
|
||||||
gzcompress_test
|
|
||||||
hddboot_test
|
|
||||||
help_test
|
|
||||||
*.img
|
|
||||||
*.image
|
*.image
|
||||||
*.image.exe
|
*.image.exe
|
||||||
include/grub/cpu
|
*.img
|
||||||
include/grub/machine
|
|
||||||
install-sh
|
|
||||||
lib/libgcrypt-grub
|
|
||||||
libgrub_a_init.c
|
|
||||||
*.log
|
*.log
|
||||||
*.lst
|
*.lst
|
||||||
lzocompress_test
|
|
||||||
*.marker
|
*.marker
|
||||||
Makefile
|
|
||||||
*.mod
|
*.mod
|
||||||
mod-*.c
|
|
||||||
missing
|
|
||||||
netboot_test
|
|
||||||
*.o
|
*.o
|
||||||
*.a
|
|
||||||
ohci_test
|
|
||||||
partmap_test
|
|
||||||
pata_test
|
|
||||||
*.pf2
|
*.pf2
|
||||||
*.pp
|
*.pp
|
||||||
po/*.mo
|
|
||||||
po/grub.pot
|
|
||||||
po/POTFILES
|
|
||||||
po/stamp-po
|
|
||||||
printf_test
|
|
||||||
priority_queue_unit_test
|
|
||||||
pseries_test
|
|
||||||
stamp-h
|
|
||||||
stamp-h1
|
|
||||||
stamp-h.in
|
|
||||||
symlist.c
|
|
||||||
symlist.h
|
|
||||||
trigtables.c
|
|
||||||
*.trs
|
*.trs
|
||||||
uhci_test
|
*~
|
||||||
update-grub_lib
|
.deps-core/
|
||||||
unidata.c
|
.deps-util/
|
||||||
xzcompress_test
|
.deps/
|
||||||
Makefile.in
|
.dirstamp
|
||||||
|
DISTLIST
|
||||||
GPATH
|
GPATH
|
||||||
GRTAGS
|
GRTAGS
|
||||||
GSYMS
|
GSYMS
|
||||||
GTAGS
|
GTAGS
|
||||||
compile
|
Makefile
|
||||||
depcomp
|
Makefile.in
|
||||||
|
ascii.bitmaps
|
||||||
|
genkernsyms.sh
|
||||||
|
gensymlist.sh
|
||||||
|
grub-bin2h
|
||||||
|
grub-emu
|
||||||
|
grub-emu-lite
|
||||||
|
grub-emu-lite.exe
|
||||||
|
grub-emu.exe
|
||||||
|
grub-macho2img
|
||||||
|
grub_emu_init.c
|
||||||
|
grub_emu_init.h
|
||||||
|
grub_probe_init.c
|
||||||
|
grub_probe_init.h
|
||||||
|
grub_script.tab.c
|
||||||
|
grub_script.tab.h
|
||||||
|
grub_script.yy.c
|
||||||
|
grub_script.yy.h
|
||||||
|
grub_script_check_init.c
|
||||||
|
grub_script_check_init.h
|
||||||
|
grub_setup_init.c
|
||||||
|
grub_setup_init.h
|
||||||
mdate-sh
|
mdate-sh
|
||||||
texinfo.tex
|
mod-*.c
|
||||||
grub-core/lib/libgcrypt-grub
|
update-grub_lib
|
||||||
.deps
|
|
||||||
.deps-util
|
|
||||||
.deps-core
|
|
||||||
.dirstamp
|
|
||||||
Makefile.util.am
|
|
||||||
contrib
|
|
||||||
grub-core/bootinfo.txt
|
|
||||||
grub-core/Makefile.core.am
|
|
||||||
grub-core/Makefile.gcry.def
|
|
||||||
grub-core/contrib
|
|
||||||
grub-core/gdb_grub
|
|
||||||
grub-core/genmod.sh
|
|
||||||
grub-core/gensyminfo.sh
|
|
||||||
grub-core/gmodule.pl
|
|
||||||
grub-core/grub.chrp
|
|
||||||
grub-core/modinfo.sh
|
|
||||||
grub-core/*.module
|
|
||||||
grub-core/*.module.exe
|
|
||||||
grub-core/*.pp
|
|
||||||
grub-core/kernel.img.bin
|
|
||||||
util/bash-completion.d/grub
|
|
||||||
grub-core/gnulib/alloca.h
|
|
||||||
grub-core/gnulib/arg-nonnull.h
|
|
||||||
grub-core/gnulib/c++defs.h
|
|
||||||
grub-core/gnulib/charset.alias
|
|
||||||
grub-core/gnulib/configmake.h
|
|
||||||
grub-core/gnulib/float.h
|
|
||||||
grub-core/gnulib/getopt.h
|
|
||||||
grub-core/gnulib/langinfo.h
|
|
||||||
grub-core/gnulib/ref-add.sed
|
|
||||||
grub-core/gnulib/ref-del.sed
|
|
||||||
grub-core/gnulib/stdio.h
|
|
||||||
grub-core/gnulib/stdlib.h
|
|
||||||
grub-core/gnulib/string.h
|
|
||||||
grub-core/gnulib/strings.h
|
|
||||||
grub-core/gnulib/sys
|
|
||||||
grub-core/gnulib/unistd.h
|
|
||||||
grub-core/gnulib/warn-on-use.h
|
|
||||||
grub-core/gnulib/wchar.h
|
|
||||||
grub-core/gnulib/wctype.h
|
|
||||||
grub-core/rs_decoder.h
|
|
||||||
widthspec.bin
|
widthspec.bin
|
||||||
widthspec.h
|
|
||||||
docs/stamp-1
|
#
|
||||||
docs/version-dev.texi
|
# Ignore patterns relative to this .gitignore file's directory.
|
||||||
Makefile.utilgcry.def
|
#
|
||||||
po/*.po
|
/00_header
|
||||||
po/*.gmo
|
/10_*
|
||||||
po/LINGUAS
|
/20_linux_xen
|
||||||
po/remove-potcdate.sed
|
/30_os-prober
|
||||||
include/grub/gcrypt/gcrypt.h
|
/30_uefi-firmware
|
||||||
include/grub/gcrypt/g10lib.h
|
/40_custom
|
||||||
po/POTFILES.in
|
/41_custom
|
||||||
po/POTFILES-shell.in
|
/ABOUT-NLS
|
||||||
/grub-glue-efi
|
/ChangeLog
|
||||||
/grub-render-label
|
/INSTALL.grub
|
||||||
/grub-glue-efi.exe
|
/Makefile.util.am
|
||||||
/grub-render-label.exe
|
/Makefile.utilgcry.def
|
||||||
grub-core/gnulib/locale.h
|
/aclocal.m4
|
||||||
grub-core/gnulib/unitypes.h
|
/ahci_test
|
||||||
grub-core/gnulib/uniwidth.h
|
/ascii.h
|
||||||
build-aux/test-driver
|
/autom4te.cache/
|
||||||
|
/btrfs_test
|
||||||
|
/build-aux/
|
||||||
|
/build-grub-gen-asciih
|
||||||
|
/build-grub-gen-widthspec
|
||||||
|
/build-grub-mkfont
|
||||||
|
/cdboot_test
|
||||||
|
/cmp_test
|
||||||
|
/compile
|
||||||
|
/config-util.h
|
||||||
|
/config-util.h.in
|
||||||
|
/config.cache
|
||||||
|
/config.guess
|
||||||
|
/config.h
|
||||||
|
/config.log
|
||||||
|
/config.status
|
||||||
|
/config.sub
|
||||||
|
/configure
|
||||||
|
/contrib
|
||||||
|
/core_compress_test
|
||||||
|
/cpio_test
|
||||||
|
/date_test
|
||||||
|
/depcomp
|
||||||
|
/docs/*.info
|
||||||
|
/docs/*.info-[0-9]*
|
||||||
|
/docs/stamp-1
|
||||||
|
/docs/stamp-vti
|
||||||
|
/docs/version-dev.texi
|
||||||
|
/docs/version.texi
|
||||||
|
/ehci_test
|
||||||
|
/example_grub_script_test
|
||||||
|
/example_scripted_test
|
||||||
|
/example_unit_test
|
||||||
|
/exfat_test
|
||||||
|
/ext234_test
|
||||||
|
/f2fs_test
|
||||||
|
/fat_test
|
||||||
|
/fddboot_test
|
||||||
|
/file_filter_test
|
||||||
/garbage-gen
|
/garbage-gen
|
||||||
/garbage-gen.exe
|
/garbage-gen.exe
|
||||||
|
/gettext_strings_test
|
||||||
|
/gnulib/
|
||||||
|
/grub-2.[0-9]*/
|
||||||
|
/grub-2.[0-9]*.tar.gz
|
||||||
|
/grub-bios-setup
|
||||||
|
/grub-bios-setup.exe
|
||||||
|
/grub-core/*.module
|
||||||
|
/grub-core/*.module.exe
|
||||||
|
/grub-core/*.pp
|
||||||
|
/grub-core/Makefile.core.am
|
||||||
|
/grub-core/Makefile.gcry.def
|
||||||
|
/grub-core/bootinfo.txt
|
||||||
|
/grub-core/build-grub-module-verifier
|
||||||
|
/grub-core/build-grub-pe2elf.exe
|
||||||
|
/grub-core/contrib
|
||||||
|
/grub-core/gdb_grub
|
||||||
|
/grub-core/genmod.sh
|
||||||
|
/grub-core/gensyminfo.sh
|
||||||
|
/grub-core/gentrigtables
|
||||||
|
/grub-core/gentrigtables.exe
|
||||||
|
/grub-core/gmodule.pl
|
||||||
|
/grub-core/grub.chrp
|
||||||
|
/grub-core/kernel.img.bin
|
||||||
|
/grub-core/lib/gnulib
|
||||||
|
/grub-core/lib/libgcrypt-grub
|
||||||
|
/grub-core/modinfo.sh
|
||||||
|
/grub-core/rs_decoder.h
|
||||||
|
/grub-core/symlist.c
|
||||||
|
/grub-core/symlist.h
|
||||||
|
/grub-core/trigtables.c
|
||||||
|
/grub-core/unidata.c
|
||||||
|
/grub-editenv
|
||||||
|
/grub-editenv.exe
|
||||||
|
/grub-file
|
||||||
|
/grub-file.exe
|
||||||
/grub-fs-tester
|
/grub-fs-tester
|
||||||
grub-core/build-grub-module-verifier
|
/grub-fstest
|
||||||
|
/grub-fstest.exe
|
||||||
|
/grub-glue-efi
|
||||||
|
/grub-glue-efi.exe
|
||||||
|
/grub-install
|
||||||
|
/grub-install.exe
|
||||||
|
/grub-kbdcomp
|
||||||
|
/grub-macbless
|
||||||
|
/grub-macbless.exe
|
||||||
|
/grub-menulst2cfg
|
||||||
|
/grub-menulst2cfg.exe
|
||||||
|
/grub-mk*
|
||||||
|
/grub-mount
|
||||||
|
/grub-ofpathname
|
||||||
|
/grub-ofpathname.exe
|
||||||
|
/grub-probe
|
||||||
|
/grub-probe.exe
|
||||||
|
/grub-reboot
|
||||||
|
/grub-render-label
|
||||||
|
/grub-render-label.exe
|
||||||
|
/grub-script-check
|
||||||
|
/grub-script-check.exe
|
||||||
|
/grub-set-default
|
||||||
|
/grub-shell
|
||||||
|
/grub-shell-tester
|
||||||
|
/grub-sparc64-setup
|
||||||
|
/grub-sparc64-setup.exe
|
||||||
|
/grub-syslinux2cfg
|
||||||
|
/grub-syslinux2cfg.exe
|
||||||
|
/grub_cmd_date
|
||||||
|
/grub_cmd_echo
|
||||||
|
/grub_cmd_regexp
|
||||||
|
/grub_cmd_set_date
|
||||||
|
/grub_cmd_sleep
|
||||||
|
/grub_cmd_test
|
||||||
|
/grub_cmd_tr
|
||||||
|
/grub_fstest_init.c
|
||||||
|
/grub_fstest_init.h
|
||||||
|
/grub_func_test
|
||||||
|
/grub_script_blanklines
|
||||||
|
/grub_script_blockarg
|
||||||
|
/grub_script_break
|
||||||
|
/grub_script_comments
|
||||||
|
/grub_script_continue
|
||||||
|
/grub_script_dollar
|
||||||
|
/grub_script_echo1
|
||||||
|
/grub_script_echo_keywords
|
||||||
|
/grub_script_escape_comma
|
||||||
|
/grub_script_eval
|
||||||
|
/grub_script_expansion
|
||||||
|
/grub_script_final_semicolon
|
||||||
|
/grub_script_for1
|
||||||
|
/grub_script_functions
|
||||||
|
/grub_script_gettext
|
||||||
|
/grub_script_if
|
||||||
|
/grub_script_leading_whitespace
|
||||||
|
/grub_script_no_commands
|
||||||
|
/grub_script_not
|
||||||
|
/grub_script_return
|
||||||
|
/grub_script_setparams
|
||||||
|
/grub_script_shift
|
||||||
|
/grub_script_strcmp
|
||||||
|
/grub_script_test
|
||||||
|
/grub_script_vars1
|
||||||
|
/grub_script_while1
|
||||||
|
/gzcompress_test
|
||||||
|
/hddboot_test
|
||||||
|
/help_test
|
||||||
|
/hfs_test
|
||||||
|
/hfsplus_test
|
||||||
|
/include/grub/cpu
|
||||||
|
/include/grub/gcrypt/g10lib.h
|
||||||
|
/include/grub/gcrypt/gcrypt.h
|
||||||
|
/include/grub/machine
|
||||||
|
/install-sh
|
||||||
|
/iso9660_test
|
||||||
|
/jfs_test
|
||||||
|
/lib/libgcrypt-grub
|
||||||
|
/libgrub_a_init.c
|
||||||
|
/lzocompress_test
|
||||||
|
/m4/
|
||||||
|
/minixfs_test
|
||||||
|
/missing
|
||||||
|
/netboot_test
|
||||||
|
/nilfs2_test
|
||||||
|
/ntfs_test
|
||||||
|
/ohci_test
|
||||||
|
/partmap_test
|
||||||
|
/pata_test
|
||||||
|
/po/*.gmo
|
||||||
|
/po/*.mo
|
||||||
|
/po/*.po
|
||||||
|
/po/LINGUAS
|
||||||
|
/po/Makefile.in.in
|
||||||
|
/po/Makevars
|
||||||
|
/po/Makevars.template
|
||||||
|
/po/POTFILES
|
||||||
|
/po/POTFILES-shell.in
|
||||||
|
/po/POTFILES.in
|
||||||
|
/po/Rules-quot
|
||||||
|
/po/grub.pot
|
||||||
|
/po/remove-potcdate.sed
|
||||||
|
/po/stamp-po
|
||||||
|
/printf_test
|
||||||
|
/priority_queue_unit_test
|
||||||
|
/pseries_test
|
||||||
|
/reiserfs_test
|
||||||
|
/romfs_test
|
||||||
|
/squashfs_test
|
||||||
|
/stamp-h
|
||||||
|
/stamp-h.in
|
||||||
|
/stamp-h1
|
||||||
|
/syslinux_test
|
||||||
|
/tar_test
|
||||||
|
/test_sha512sum
|
||||||
|
/test_unset
|
||||||
|
/tests/syslinux/ubuntu10.04_grub.cfg
|
||||||
|
/texinfo.tex
|
||||||
|
/udf_test
|
||||||
|
/uhci_test
|
||||||
|
/util/bash-completion.d/grub
|
||||||
|
/widthspec.h
|
||||||
|
/xfs_test
|
||||||
|
/xzcompress_test
|
||||||
|
/zfs_test
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
# SPDX-License-Identifier: GPL-3.0+
|
||||||
|
# Originally Copyright Roger Meier <r.meier@siemens.com>
|
||||||
|
# Adapted for GRUB by Alexander Graf <agraf@suse.de>
|
||||||
|
#
|
||||||
|
# Build GRUB on Travis CI - https://www.travis-ci.org/
|
||||||
|
#
|
||||||
|
|
||||||
|
dist: xenial
|
||||||
|
|
||||||
|
language: c
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- autopoint
|
||||||
|
- libsdl1.2-dev
|
||||||
|
- lzop
|
||||||
|
- ovmf
|
||||||
|
- python
|
||||||
|
- qemu-system
|
||||||
|
- unifont
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
# Include all cross toolchain paths, so we can just call them later down.
|
||||||
|
- PATH=/tmp/qemu-install/bin:/tmp/grub/bin:/usr/bin:/bin:/tmp/cross/gcc-8.1.0-nolibc/aarch64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/arm-linux-gnueabi/bin:/tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/mips64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/powerpc64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv32-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/sparc64-linux/bin
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
# Install necessary toolchains based on $CROSS_TARGETS variable.
|
||||||
|
- mkdir /tmp/cross
|
||||||
|
# These give us binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc
|
||||||
|
- for i in $CROSS_TARGETS; do
|
||||||
|
( cd /tmp/cross; wget -t 3 -O - https://mirrors.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | tar xJ );
|
||||||
|
done
|
||||||
|
|
||||||
|
script:
|
||||||
|
# Comments must be outside the command strings below, or the Travis parser
|
||||||
|
# will get confused.
|
||||||
|
- ./bootstrap
|
||||||
|
|
||||||
|
# Build all selected GRUB targets.
|
||||||
|
- for target in $GRUB_TARGETS; do
|
||||||
|
plat=${target#*-};
|
||||||
|
arch=${target%-*};
|
||||||
|
[ "$arch" = "arm64" ] && arch=aarch64-linux;
|
||||||
|
[ "$arch" = "arm" ] && arch=arm-linux-gnueabi;
|
||||||
|
[ "$arch" = "ia64" ] && arch=ia64-linux;
|
||||||
|
[ "$arch" = "mipsel" ] && arch=mips64-linux;
|
||||||
|
[ "$arch" = "powerpc" ] && arch=powerpc64-linux;
|
||||||
|
[ "$arch" = "riscv32" ] && arch=riscv32-linux;
|
||||||
|
[ "$arch" = "riscv64" ] && arch=riscv64-linux;
|
||||||
|
[ "$arch" = "sparc64" ] && arch=sparc64-linux;
|
||||||
|
echo "Building $target";
|
||||||
|
mkdir obj-$target;
|
||||||
|
JOBS=`getconf _NPROCESSORS_ONLN 2> /dev/null || echo 1`;
|
||||||
|
[ "$JOBS" == 1 ] || JOBS=$(($JOBS + 1));
|
||||||
|
( cd obj-$target && ../configure --target=$arch --with-platform=$plat --prefix=/tmp/grub && make -j$JOBS && make -j$JOBS install ) &> log || ( cat log; false );
|
||||||
|
done
|
||||||
|
|
||||||
|
# Our test canary.
|
||||||
|
- echo -e "insmod echo\\ninsmod reboot\\necho hello world\\nreboot" > grub.cfg
|
||||||
|
|
||||||
|
# Assemble images and possibly run them.
|
||||||
|
- for target in $GRUB_TARGETS; do grub-mkimage -c grub.cfg -p / -O $target -o grub-$target echo reboot normal; done
|
||||||
|
|
||||||
|
# Run images we know how to run.
|
||||||
|
- if [[ "$GRUB_TARGETS" == *"x86_64-efi"* ]]; then qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -m 512 -no-reboot -nographic -net nic -net user,tftp=.,bootfile=grub-x86_64-efi | tee grub.log && grep "hello world" grub.log; fi
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
# Each env setting here is a dedicated build.
|
||||||
|
- name: "x86_64"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="x86_64-efi x86_64-xen"
|
||||||
|
- name: "i386"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="i386-coreboot i386-efi i386-ieee1275 i386-multiboot i386-pc i386-qemu i386-xen i386-xen_pvh"
|
||||||
|
- name: "powerpc"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="powerpc-ieee1275"
|
||||||
|
- CROSS_TARGETS="powerpc64-linux"
|
||||||
|
- name: "sparc64"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="sparc64-ieee1275"
|
||||||
|
- CROSS_TARGETS="sparc64-linux"
|
||||||
|
- name: "ia64"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="ia64-efi"
|
||||||
|
- CROSS_TARGETS="ia64-linux"
|
||||||
|
- name: "mips"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="mips-arc mipsel-arc mipsel-qemu_mips mips-qemu_mips"
|
||||||
|
- CROSS_TARGETS="mips64-linux"
|
||||||
|
- name: "arm"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="arm-coreboot arm-efi arm-uboot"
|
||||||
|
- CROSS_TARGETS="arm-linux-gnueabi"
|
||||||
|
- name: "arm64"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="arm64-efi"
|
||||||
|
- CROSS_TARGETS="aarch64-linux"
|
||||||
|
- name: "riscv32"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="riscv32-efi"
|
||||||
|
- CROSS_TARGETS="riscv32-linux"
|
||||||
|
- name: "riscv64"
|
||||||
|
env:
|
||||||
|
- GRUB_TARGETS="riscv64-efi"
|
||||||
|
- CROSS_TARGETS="riscv64-linux"
|
223
ABOUT-NLS
223
ABOUT-NLS
|
@ -1,223 +0,0 @@
|
||||||
1 Notes on the Free Translation Project
|
|
||||||
***************************************
|
|
||||||
|
|
||||||
Free software is going international! The Free Translation Project is
|
|
||||||
a way to get maintainers of free software, translators, and users all
|
|
||||||
together, so that free software will gradually become able to speak many
|
|
||||||
languages. A few packages already provide translations for their
|
|
||||||
messages.
|
|
||||||
|
|
||||||
If you found this `ABOUT-NLS' file inside a distribution, you may
|
|
||||||
assume that the distributed package does use GNU `gettext' internally,
|
|
||||||
itself available at your nearest GNU archive site. But you do _not_
|
|
||||||
need to install GNU `gettext' prior to configuring, installing or using
|
|
||||||
this package with messages translated.
|
|
||||||
|
|
||||||
Installers will find here some useful hints. These notes also
|
|
||||||
explain how users should proceed for getting the programs to use the
|
|
||||||
available translations. They tell how people wanting to contribute and
|
|
||||||
work on translations can contact the appropriate team.
|
|
||||||
|
|
||||||
When reporting bugs in the `intl/' directory or bugs which may be
|
|
||||||
related to internationalization, you should tell about the version of
|
|
||||||
`gettext' which is used. The information can be found in the
|
|
||||||
`intl/VERSION' file, in internationalized packages.
|
|
||||||
|
|
||||||
1.1 Quick configuration advice
|
|
||||||
==============================
|
|
||||||
|
|
||||||
If you want to exploit the full power of internationalization, you
|
|
||||||
should configure it using
|
|
||||||
|
|
||||||
./configure --with-included-gettext
|
|
||||||
|
|
||||||
to force usage of internationalizing routines provided within this
|
|
||||||
package, despite the existence of internationalizing capabilities in the
|
|
||||||
operating system where this package is being installed. So far, only
|
|
||||||
the `gettext' implementation in the GNU C library version 2 provides as
|
|
||||||
many features (such as locale alias, message inheritance, automatic
|
|
||||||
charset conversion or plural form handling) as the implementation here.
|
|
||||||
It is also not possible to offer this additional functionality on top
|
|
||||||
of a `catgets' implementation. Future versions of GNU `gettext' will
|
|
||||||
very likely convey even more functionality. So it might be a good idea
|
|
||||||
to change to GNU `gettext' as soon as possible.
|
|
||||||
|
|
||||||
So you need _not_ provide this option if you are using GNU libc 2 or
|
|
||||||
you have installed a recent copy of the GNU gettext package with the
|
|
||||||
included `libintl'.
|
|
||||||
|
|
||||||
1.2 INSTALL Matters
|
|
||||||
===================
|
|
||||||
|
|
||||||
Some packages are "localizable" when properly installed; the programs
|
|
||||||
they contain can be made to speak your own native language. Most such
|
|
||||||
packages use GNU `gettext'. Other packages have their own ways to
|
|
||||||
internationalization, predating GNU `gettext'.
|
|
||||||
|
|
||||||
By default, this package will be installed to allow translation of
|
|
||||||
messages. It will automatically detect whether the system already
|
|
||||||
provides the GNU `gettext' functions. If not, the included GNU
|
|
||||||
`gettext' library will be used. This library is wholly contained
|
|
||||||
within this package, usually in the `intl/' subdirectory, so prior
|
|
||||||
installation of the GNU `gettext' package is _not_ required.
|
|
||||||
Installers may use special options at configuration time for changing
|
|
||||||
the default behaviour. The commands:
|
|
||||||
|
|
||||||
./configure --with-included-gettext
|
|
||||||
./configure --disable-nls
|
|
||||||
|
|
||||||
will, respectively, bypass any pre-existing `gettext' to use the
|
|
||||||
internationalizing routines provided within this package, or else,
|
|
||||||
_totally_ disable translation of messages.
|
|
||||||
|
|
||||||
When you already have GNU `gettext' installed on your system and run
|
|
||||||
configure without an option for your new package, `configure' will
|
|
||||||
probably detect the previously built and installed `libintl.a' file and
|
|
||||||
will decide to use this. This might not be desirable. You should use
|
|
||||||
the more recent version of the GNU `gettext' library. I.e. if the file
|
|
||||||
`intl/VERSION' shows that the library which comes with this package is
|
|
||||||
more recent, you should use
|
|
||||||
|
|
||||||
./configure --with-included-gettext
|
|
||||||
|
|
||||||
to prevent auto-detection.
|
|
||||||
|
|
||||||
The configuration process will not test for the `catgets' function
|
|
||||||
and therefore it will not be used. The reason is that even an
|
|
||||||
emulation of `gettext' on top of `catgets' could not provide all the
|
|
||||||
extensions of the GNU `gettext' library.
|
|
||||||
|
|
||||||
Internationalized packages usually have many `po/LL.po' files, where
|
|
||||||
LL gives an ISO 639 two-letter code identifying the language. Unless
|
|
||||||
translations have been forbidden at `configure' time by using the
|
|
||||||
`--disable-nls' switch, all available translations are installed
|
|
||||||
together with the package. However, the environment variable `LINGUAS'
|
|
||||||
may be set, prior to configuration, to limit the installed set.
|
|
||||||
`LINGUAS' should then contain a space separated list of two-letter
|
|
||||||
codes, stating which languages are allowed.
|
|
||||||
|
|
||||||
1.3 Using This Package
|
|
||||||
======================
|
|
||||||
|
|
||||||
As a user, if your language has been installed for this package, you
|
|
||||||
only have to set the `LANG' environment variable to the appropriate
|
|
||||||
`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
|
|
||||||
and `CC' is an ISO 3166 two-letter country code. For example, let's
|
|
||||||
suppose that you speak German and live in Germany. At the shell
|
|
||||||
prompt, merely execute `setenv LANG de_DE' (in `csh'),
|
|
||||||
`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
|
|
||||||
This can be done from your `.login' or `.profile' file, once and for
|
|
||||||
all.
|
|
||||||
|
|
||||||
You might think that the country code specification is redundant.
|
|
||||||
But in fact, some languages have dialects in different countries. For
|
|
||||||
example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
|
|
||||||
country code serves to distinguish the dialects.
|
|
||||||
|
|
||||||
The locale naming convention of `LL_CC', with `LL' denoting the
|
|
||||||
language and `CC' denoting the country, is the one use on systems based
|
|
||||||
on GNU libc. On other systems, some variations of this scheme are
|
|
||||||
used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
|
|
||||||
locales supported by your system for your language by running the
|
|
||||||
command `locale -a | grep '^LL''.
|
|
||||||
|
|
||||||
Not all programs have translations for all languages. By default, an
|
|
||||||
English message is shown in place of a nonexistent translation. If you
|
|
||||||
understand other languages, you can set up a priority list of languages.
|
|
||||||
This is done through a different environment variable, called
|
|
||||||
`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
|
|
||||||
for the purpose of message handling, but you still need to have `LANG'
|
|
||||||
set to the primary language; this is required by other parts of the
|
|
||||||
system libraries. For example, some Swedish users who would rather
|
|
||||||
read translations in German than English for when Swedish is not
|
|
||||||
available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
|
|
||||||
|
|
||||||
Special advice for Norwegian users: The language code for Norwegian
|
|
||||||
bokma*l changed from `no' to `nb' recently (in 2003). During the
|
|
||||||
transition period, while some message catalogs for this language are
|
|
||||||
installed under `nb' and some older ones under `no', it's recommended
|
|
||||||
for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
|
|
||||||
older translations are used.
|
|
||||||
|
|
||||||
In the `LANGUAGE' environment variable, but not in the `LANG'
|
|
||||||
environment variable, `LL_CC' combinations can be abbreviated as `LL'
|
|
||||||
to denote the language's main dialect. For example, `de' is equivalent
|
|
||||||
to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
|
|
||||||
(Portuguese as spoken in Portugal) in this context.
|
|
||||||
|
|
||||||
1.4 Translating Teams
|
|
||||||
=====================
|
|
||||||
|
|
||||||
For the Free Translation Project to be a success, we need interested
|
|
||||||
people who like their own language and write it well, and who are also
|
|
||||||
able to synergize with other translators speaking the same language.
|
|
||||||
Each translation team has its own mailing list. The up-to-date list of
|
|
||||||
teams can be found at the Free Translation Project's homepage,
|
|
||||||
`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
|
|
||||||
area.
|
|
||||||
|
|
||||||
If you'd like to volunteer to _work_ at translating messages, you
|
|
||||||
should become a member of the translating team for your own language.
|
|
||||||
The subscribing address is _not_ the same as the list itself, it has
|
|
||||||
`-request' appended. For example, speakers of Swedish can send a
|
|
||||||
message to `sv-request@li.org', having this message body:
|
|
||||||
|
|
||||||
subscribe
|
|
||||||
|
|
||||||
Keep in mind that team members are expected to participate
|
|
||||||
_actively_ in translations, or at solving translational difficulties,
|
|
||||||
rather than merely lurking around. If your team does not exist yet and
|
|
||||||
you want to start one, or if you are unsure about what to do or how to
|
|
||||||
get started, please write to `translation@iro.umontreal.ca' to reach the
|
|
||||||
coordinator for all translator teams.
|
|
||||||
|
|
||||||
The English team is special. It works at improving and uniformizing
|
|
||||||
the terminology in use. Proven linguistic skills are praised more than
|
|
||||||
programming skills, here.
|
|
||||||
|
|
||||||
1.5 Available Packages
|
|
||||||
======================
|
|
||||||
|
|
||||||
Languages are not equally supported in all packages. The following
|
|
||||||
matrix shows the current state of internationalization, as of October
|
|
||||||
2006. The matrix shows, in regard of each package, for which languages
|
|
||||||
PO files have been submitted to translation coordination, with a
|
|
||||||
translation percentage of at least 50%.
|
|
||||||
|
|
||||||
# Matrix here is removed!
|
|
||||||
|
|
||||||
Some counters in the preceding matrix are higher than the number of
|
|
||||||
visible blocks let us expect. This is because a few extra PO files are
|
|
||||||
used for implementing regional variants of languages, or language
|
|
||||||
dialects.
|
|
||||||
|
|
||||||
For a PO file in the matrix above to be effective, the package to
|
|
||||||
which it applies should also have been internationalized and
|
|
||||||
distributed as such by its maintainer. There might be an observable
|
|
||||||
lag between the mere existence a PO file and its wide availability in a
|
|
||||||
distribution.
|
|
||||||
|
|
||||||
If October 2006 seems to be old, you may fetch a more recent copy of
|
|
||||||
this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
|
|
||||||
matrix with full percentage details can be found at
|
|
||||||
`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
|
|
||||||
|
|
||||||
1.6 Using `gettext' in new packages
|
|
||||||
===================================
|
|
||||||
|
|
||||||
If you are writing a freely available program and want to
|
|
||||||
internationalize it you are welcome to use GNU `gettext' in your
|
|
||||||
package. Of course you have to respect the GNU Library General Public
|
|
||||||
License which covers the use of the GNU `gettext' library. This means
|
|
||||||
in particular that even non-free programs can use `libintl' as a shared
|
|
||||||
library, whereas only free software can use `libintl' as a static
|
|
||||||
library or use modified versions of `libintl'.
|
|
||||||
|
|
||||||
Once the sources are changed appropriately and the setup can handle
|
|
||||||
the use of `gettext' the only thing missing are the translations. The
|
|
||||||
Free Translation Project is also available for packages which are not
|
|
||||||
developed inside the GNU project. Therefore the information given above
|
|
||||||
applies also for every other Free Software Project. Contact
|
|
||||||
`translation@iro.umontreal.ca' to make the `.pot' files available to
|
|
||||||
the translation teams.
|
|
||||||
|
|
85
INSTALL
85
INSTALL
|
@ -11,32 +11,15 @@ GRUB depends on some software packages installed into your system. If
|
||||||
you don't have any of them, please obtain and install them before
|
you don't have any of them, please obtain and install them before
|
||||||
configuring the GRUB.
|
configuring the GRUB.
|
||||||
|
|
||||||
* GCC 4.1.3 or later
|
* GCC 5.1.0 or later
|
||||||
Note: older versions may work but support is limited
|
Experimental support for clang 3.8.0 or later (results in much bigger binaries)
|
||||||
|
|
||||||
Experimental support for clang 3.3 or later (results in much bigger binaries)
|
|
||||||
for i386, x86_64, arm (including thumb), arm64, mips(el), powerpc, sparc64
|
for i386, x86_64, arm (including thumb), arm64, mips(el), powerpc, sparc64
|
||||||
Note: clang 3.2 or later works for i386 and x86_64 targets but results in
|
|
||||||
much bigger binaries.
|
|
||||||
earlier versions not tested
|
|
||||||
Note: clang 3.2 or later works for arm
|
|
||||||
earlier versions not tested
|
|
||||||
Note: clang on arm64 is not supported due to
|
|
||||||
https://llvm.org/bugs/show_bug.cgi?id=26030
|
|
||||||
Note: clang 3.3 or later works for mips(el)
|
|
||||||
earlier versions fail to generate .reginfo and hence gprel relocations
|
|
||||||
fail.
|
|
||||||
Note: clang 3.2 or later works for powerpc
|
|
||||||
earlier versions not tested
|
|
||||||
Note: clang 3.5 or later works for sparc64
|
|
||||||
earlier versions return "error: unable to interface with target machine"
|
|
||||||
Note: clang has no support for ia64 and hence you can't compile GRUB
|
|
||||||
for ia64 with clang
|
|
||||||
* GNU Make
|
* GNU Make
|
||||||
* GNU Bison 2.3 or later
|
* GNU Bison 2.3 or later
|
||||||
* GNU gettext 0.17 or later
|
* GNU gettext 0.17 or later
|
||||||
* GNU binutils 2.9.1.0.23 or later
|
* GNU binutils 2.9.1.0.23 or later
|
||||||
* Flex 2.5.35 or later
|
* Flex 2.5.35 or later
|
||||||
|
* pkg-config
|
||||||
* Other standard GNU/Unix tools
|
* Other standard GNU/Unix tools
|
||||||
* a libc with large file support (e.g. glibc 2.1 or later)
|
* a libc with large file support (e.g. glibc 2.1 or later)
|
||||||
|
|
||||||
|
@ -52,15 +35,15 @@ For optional grub-emu features, you need:
|
||||||
|
|
||||||
To build GRUB's graphical terminal (gfxterm), you need:
|
To build GRUB's graphical terminal (gfxterm), you need:
|
||||||
|
|
||||||
* FreeType 2 or later
|
* FreeType 2.1.5 or later
|
||||||
* GNU Unifont
|
* GNU Unifont
|
||||||
|
|
||||||
If you use a development snapshot or want to hack on GRUB you may
|
If you use a development snapshot or want to hack on GRUB you may
|
||||||
need the following.
|
need the following.
|
||||||
|
|
||||||
* Python 2.6 or later
|
* Python 2.6 or later
|
||||||
* Autoconf 2.60 or later
|
* Autoconf 2.63 or later
|
||||||
* Automake 1.10.1 or later
|
* Automake 1.11 or later
|
||||||
|
|
||||||
Prerequisites for make-check:
|
Prerequisites for make-check:
|
||||||
|
|
||||||
|
@ -101,10 +84,11 @@ The simplest way to compile this package is:
|
||||||
2. Skip this and following step if you use release tarball and proceed to
|
2. Skip this and following step if you use release tarball and proceed to
|
||||||
step 4. If you want translations type `./linguas.sh'.
|
step 4. If you want translations type `./linguas.sh'.
|
||||||
|
|
||||||
3. Type `./autogen.sh'.
|
3. Type `./bootstrap'.
|
||||||
|
|
||||||
* autogen.sh uses python. By default invocation is "python" but can be
|
* autogen.sh (called by bootstrap) uses python. By default the
|
||||||
overriden by setting variable $PYTHON.
|
invocation is "python", but it can be overridden by setting the
|
||||||
|
variable $PYTHON.
|
||||||
|
|
||||||
4. Type `./configure' to configure the package for your system.
|
4. Type `./configure' to configure the package for your system.
|
||||||
If you're using `csh' on an old version of System V, you might
|
If you're using `csh' on an old version of System V, you might
|
||||||
|
@ -158,12 +142,20 @@ For this example the configure line might look like (more details below)
|
||||||
(some options are optional and included here for completeness but some rarely
|
(some options are optional and included here for completeness but some rarely
|
||||||
used options are omitted):
|
used options are omitted):
|
||||||
|
|
||||||
./configure BUILD_CC=gcc BUILD_FREETYPE=freetype-config --host=amd64-linux-gnu
|
./configure --host=x86_64-linux-gnu --target=arm-linux-gnueabihf \
|
||||||
CC=amd64-linux-gnu-gcc CFLAGS="-g -O2" FREETYPE=amd64-linux-gnu-freetype-config
|
--with-platform=efi BUILD_CC=gcc BUILD_PKG_CONFIG=pkg-config \
|
||||||
--target=arm --with-platform=uboot TARGET_CC=arm-elf-gcc
|
HOST_CC=x86_64-linux-gnu-gcc HOST_CFLAGS='-g -O2' \
|
||||||
TARGET_CFLAGS="-Os -march=armv6" TARGET_CCASFLAGS="-march=armv6"
|
PKG_CONFIG=x86_64-linux-gnu-pkg-config TARGET_CC=arm-linux-gnueabihf-gcc \
|
||||||
TARGET_OBJCOPY="arm-elf-objcopy" TARGET_STRIP="arm-elf-strip"
|
TARGET_CFLAGS='-Os -march=armv8.3-a' TARGET_CCASFLAGS='-march=armv8.3-a' \
|
||||||
TARGET_NM=arm-elf-nm TARGET_RANLIB=arm-elf-ranlib LEX=gflex
|
TARGET_OBJCOPY=arm-linux-gnueabihf-objcopy \
|
||||||
|
TARGET_STRIP=arm-linux-gnueabihf-strip TARGET_NM=arm-linux-gnueabihf-nm \
|
||||||
|
TARGET_RANLIB=arm-linux-gnueabihf-ranlib LEX=flex
|
||||||
|
|
||||||
|
Normally, for building a GRUB on amd64 with tools to run on amd64 to
|
||||||
|
generate images to run on ARM, using your Linux distribution's
|
||||||
|
packaged cross compiler, the following would suffice:
|
||||||
|
|
||||||
|
./configure --target=arm-linux-gnueabihf --with-platform=efi
|
||||||
|
|
||||||
You need to use following options to specify tools and platforms. For minimum
|
You need to use following options to specify tools and platforms. For minimum
|
||||||
version look at prerequisites. All tools not mentioned in this section under
|
version look at prerequisites. All tools not mentioned in this section under
|
||||||
|
@ -176,24 +168,27 @@ corresponding platform are not needed for the platform in question.
|
||||||
2. BUILD_CFLAGS= for C options for build.
|
2. BUILD_CFLAGS= for C options for build.
|
||||||
3. BUILD_CPPFLAGS= for C preprocessor options for build.
|
3. BUILD_CPPFLAGS= for C preprocessor options for build.
|
||||||
4. BUILD_LDFLAGS= for linker options for build.
|
4. BUILD_LDFLAGS= for linker options for build.
|
||||||
5. BUILD_FREETYPE= for freetype-config for build (optional).
|
5. BUILD_PKG_CONFIG= for pkg-config for build (optional).
|
||||||
|
|
||||||
- For host
|
- For host
|
||||||
1. --host= to autoconf name of host.
|
1. --host= to autoconf name of host.
|
||||||
2. CC= for gcc able to compile for host
|
2. CC= for gcc able to compile for host.
|
||||||
3. HOST_CFLAGS= for C options for host.
|
3. CFLAGS= for C options for host.
|
||||||
4. HOST_CPPFLAGS= for C preprocessor options for host.
|
4. HOST_CC= for gcc able to compile for host.
|
||||||
5. HOST_LDFLAGS= for linker options for host.
|
5. HOST_CFLAGS= for C options for host.
|
||||||
6. FREETYPE= for freetype-config for host (optional).
|
6. HOST_CPPFLAGS= for C preprocessor options for host.
|
||||||
7. Libdevmapper if any must be in standard linker folders (-ldevmapper) (optional).
|
7. HOST_LDFLAGS= for linker options for host.
|
||||||
8. Libfuse if any must be in standard linker folders (-lfuse) (optional).
|
8. PKG_CONFIG= for pkg-config for host (optional).
|
||||||
9. Libzfs if any must be in standard linker folders (-lzfs) (optional).
|
9. Libdevmapper if any must be in standard linker folders (-ldevmapper) (optional).
|
||||||
10. Liblzma if any must be in standard linker folders (-llzma) (optional).
|
10. Libfuse if any must be in standard linker folders (-lfuse) (optional).
|
||||||
|
11. Libzfs if any must be in standard linker folders (-lzfs) (optional).
|
||||||
|
12. Liblzma if any must be in standard linker folders (-llzma) (optional).
|
||||||
|
Note: The HOST_* variables override not prefixed variables.
|
||||||
|
|
||||||
- For target
|
- For target
|
||||||
1. --target= to autoconf cpu name of target.
|
1. --target= to autoconf cpu name of target.
|
||||||
2. --with-platform to choose firmware.
|
2. --with-platform to choose firmware.
|
||||||
3. TARGET_CC= for gcc able to compile for target
|
3. TARGET_CC= for gcc able to compile for target.
|
||||||
4. TARGET_CFLAGS= for C options for target.
|
4. TARGET_CFLAGS= for C options for target.
|
||||||
5. TARGET_CPPFLAGS= for C preprocessor options for target.
|
5. TARGET_CPPFLAGS= for C preprocessor options for target.
|
||||||
6. TARGET_CCASFLAGS= for assembler options for target.
|
6. TARGET_CCASFLAGS= for assembler options for target.
|
||||||
|
@ -202,6 +197,10 @@ corresponding platform are not needed for the platform in question.
|
||||||
9. TARGET_STRIP= for strip for target.
|
9. TARGET_STRIP= for strip for target.
|
||||||
10. TARGET_NM= for nm for target.
|
10. TARGET_NM= for nm for target.
|
||||||
11. TARGET_RANLIB= for ranlib for target.
|
11. TARGET_RANLIB= for ranlib for target.
|
||||||
|
Note: If the TARGET_* variables are not specified then they will default
|
||||||
|
to be the same as the host variables. If host variables are not
|
||||||
|
specified then the TARGET_* variables will default to be the same
|
||||||
|
as not prefixed variables.
|
||||||
|
|
||||||
- Additionally for emu, for host and target.
|
- Additionally for emu, for host and target.
|
||||||
1. SDL is looked for in standard linker directories (-lSDL) (optional)
|
1. SDL is looked for in standard linker directories (-lSDL) (optional)
|
||||||
|
|
20
Makefile.am
20
Makefile.am
|
@ -1,7 +1,7 @@
|
||||||
AUTOMAKE_OPTIONS = subdir-objects -Wno-portability
|
AUTOMAKE_OPTIONS = subdir-objects -Wno-portability
|
||||||
|
|
||||||
DEPDIR = .deps-util
|
DEPDIR = .deps-util
|
||||||
SUBDIRS = grub-core/gnulib .
|
SUBDIRS = grub-core/lib/gnulib .
|
||||||
if COND_real_platform
|
if COND_real_platform
|
||||||
SUBDIRS += grub-core
|
SUBDIRS += grub-core
|
||||||
endif
|
endif
|
||||||
|
@ -37,7 +37,7 @@ grub_script.yy.c: grub_script.yy.h
|
||||||
CLEANFILES += grub_script.yy.c grub_script.yy.h
|
CLEANFILES += grub_script.yy.c grub_script.yy.h
|
||||||
|
|
||||||
# For libgrub.a
|
# For libgrub.a
|
||||||
libgrub.pp: grub_script.tab.h grub_script.yy.h $(libgrubmods_a_SOURCES) $(libgrubkern_a_SOURCES)
|
libgrub.pp: config-util.h grub_script.tab.h grub_script.yy.h $(libgrubmods_a_SOURCES) $(libgrubkern_a_SOURCES)
|
||||||
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) \
|
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgrubmods_a_CPPFLAGS) $(libgrubkern_a_CPPFLAGS) $(CPPFLAGS) \
|
||||||
-D'GRUB_MOD_INIT(x)=@MARKER@x@' $^ > $@ || (rm -f $@; exit 1)
|
-D'GRUB_MOD_INIT(x)=@MARKER@x@' $^ > $@ || (rm -f $@; exit 1)
|
||||||
CLEANFILES += libgrub.pp
|
CLEANFILES += libgrub.pp
|
||||||
|
@ -71,7 +71,7 @@ endif
|
||||||
starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/starfield/boot_menu_c.png $(srcdir)/themes/starfield/boot_menu_e.png $(srcdir)/themes/starfield/boot_menu_ne.png $(srcdir)/themes/starfield/boot_menu_n.png $(srcdir)/themes/starfield/boot_menu_nw.png $(srcdir)/themes/starfield/boot_menu_se.png $(srcdir)/themes/starfield/boot_menu_s.png $(srcdir)/themes/starfield/boot_menu_sw.png $(srcdir)/themes/starfield/boot_menu_w.png $(srcdir)/themes/starfield/slider_c.png $(srcdir)/themes/starfield/slider_n.png $(srcdir)/themes/starfield/slider_s.png $(srcdir)/themes/starfield/starfield.png $(srcdir)/themes/starfield/terminal_box_c.png $(srcdir)/themes/starfield/terminal_box_e.png $(srcdir)/themes/starfield/terminal_box_ne.png $(srcdir)/themes/starfield/terminal_box_n.png $(srcdir)/themes/starfield/terminal_box_nw.png $(srcdir)/themes/starfield/terminal_box_se.png $(srcdir)/themes/starfield/terminal_box_s.png $(srcdir)/themes/starfield/terminal_box_sw.png $(srcdir)/themes/starfield/terminal_box_w.png $(srcdir)/themes/starfield/theme.txt $(srcdir)/themes/starfield/README $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0
|
starfield_theme_files = $(srcdir)/themes/starfield/blob_w.png $(srcdir)/themes/starfield/boot_menu_c.png $(srcdir)/themes/starfield/boot_menu_e.png $(srcdir)/themes/starfield/boot_menu_ne.png $(srcdir)/themes/starfield/boot_menu_n.png $(srcdir)/themes/starfield/boot_menu_nw.png $(srcdir)/themes/starfield/boot_menu_se.png $(srcdir)/themes/starfield/boot_menu_s.png $(srcdir)/themes/starfield/boot_menu_sw.png $(srcdir)/themes/starfield/boot_menu_w.png $(srcdir)/themes/starfield/slider_c.png $(srcdir)/themes/starfield/slider_n.png $(srcdir)/themes/starfield/slider_s.png $(srcdir)/themes/starfield/starfield.png $(srcdir)/themes/starfield/terminal_box_c.png $(srcdir)/themes/starfield/terminal_box_e.png $(srcdir)/themes/starfield/terminal_box_ne.png $(srcdir)/themes/starfield/terminal_box_n.png $(srcdir)/themes/starfield/terminal_box_nw.png $(srcdir)/themes/starfield/terminal_box_se.png $(srcdir)/themes/starfield/terminal_box_s.png $(srcdir)/themes/starfield/terminal_box_sw.png $(srcdir)/themes/starfield/terminal_box_w.png $(srcdir)/themes/starfield/theme.txt $(srcdir)/themes/starfield/README $(srcdir)/themes/starfield/COPYING.CC-BY-SA-3.0
|
||||||
|
|
||||||
build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c
|
build-grub-mkfont$(BUILD_EXEEXT): util/grub-mkfont.c grub-core/unidata.c grub-core/kern/emu/misc.c util/misc.c
|
||||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS)
|
||||||
CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT)
|
CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT)
|
||||||
|
|
||||||
garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c
|
garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c
|
||||||
|
@ -80,11 +80,11 @@ CLEANFILES += garbage-gen$(BUILD_EXEEXT)
|
||||||
EXTRA_DIST += util/garbage-gen.c
|
EXTRA_DIST += util/garbage-gen.c
|
||||||
|
|
||||||
build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c
|
build-grub-gen-asciih$(BUILD_EXEEXT): util/grub-gen-asciih.c
|
||||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror
|
||||||
CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT)
|
CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT)
|
||||||
|
|
||||||
build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c
|
build-grub-gen-widthspec$(BUILD_EXEEXT): util/grub-gen-widthspec.c
|
||||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(BUILD_FREETYPE_CFLAGS) $(BUILD_FREETYPE_LIBS) -Wall -Werror
|
||||||
CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT)
|
CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT)
|
||||||
|
|
||||||
if COND_STARFIELD
|
if COND_STARFIELD
|
||||||
|
@ -422,9 +422,10 @@ BOOTCHECK_TIMEOUT=180
|
||||||
bootcheck: $(BOOTCHECKS)
|
bootcheck: $(BOOTCHECKS)
|
||||||
|
|
||||||
if COND_i386_coreboot
|
if COND_i386_coreboot
|
||||||
|
FS_PAYLOAD_MODULES ?= $(shell cat grub-core/fs.lst)
|
||||||
default_payload.elf: grub-mkstandalone grub-mkimage FORCE
|
default_payload.elf: grub-mkstandalone grub-mkimage FORCE
|
||||||
test -f $@ && rm $@ || true
|
test -f $@ && rm $@ || true
|
||||||
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test serial multiboot cbmemc linux16 gzio echo help syslinuxcfg xnu $(shell cat grub-core/fs.lst) password_pbkdf2 $(EXTRA_PAYLOAD_MODULES)' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
|
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos ext2 fat at_keyboard part_gpt usbserial_usbdebug cbfs' --install-modules='ls linux search configfile normal cbtime cbls memrw iorw minicmd lsmmap lspci halt reboot hexdump pcidump regexp setpci lsacpi chain test serial multiboot cbmemc linux16 gzio echo help syslinuxcfg xnu $(FS_PAYLOAD_MODULES) password_pbkdf2 $(EXTRA_PAYLOAD_MODULES)' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -476,6 +477,11 @@ EXTRA_DIST += ChangeLog ChangeLog-2015
|
||||||
|
|
||||||
syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg
|
syslinux_test: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg
|
||||||
|
|
||||||
|
# Mimic simplify_filename from grub-core/lib/syslinux_parse.c, so that we
|
||||||
|
# can predict its behaviour in tests. We have to pre-substitute this before
|
||||||
|
# calling config.status, as config.status offers no reliable way to hook in
|
||||||
|
# a command between setting ac_abs_top_srcdir and emitting output files.
|
||||||
tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in
|
tests/syslinux/ubuntu10.04_grub.cfg: $(top_builddir)/config.status tests/syslinux/ubuntu10.04_grub.cfg.in
|
||||||
(for x in tests/syslinux/ubuntu10.04_grub.cfg.in ; do cat $(srcdir)/"$$x"; done) | $(top_builddir)/config.status --file=$@:-
|
simplified_abs_top_srcdir=`echo "$(abs_top_srcdir)" | sed 's,//,/,g; s,/\./,/,g; :loop; s,/[^/][^/]*/\.\.\(/\|$$\),\1,; t loop'`; \
|
||||||
|
sed "s,@simplified_abs_top_srcdir@,$$simplified_abs_top_srcdir,g" $(srcdir)/tests/syslinux/ubuntu10.04_grub.cfg.in | $(top_builddir)/config.status --file=$@:-
|
||||||
CLEANFILES += tests/syslinux/ubuntu10.04_grub.cfg
|
CLEANFILES += tests/syslinux/ubuntu10.04_grub.cfg
|
||||||
|
|
|
@ -3,7 +3,7 @@ AutoGen definitions Makefile.tpl;
|
||||||
library = {
|
library = {
|
||||||
name = libgrubkern.a;
|
name = libgrubkern.a;
|
||||||
cflags = '$(CFLAGS_GNULIB)';
|
cflags = '$(CFLAGS_GNULIB)';
|
||||||
cppflags = '$(CPPFLAGS_GNULIB)';
|
cppflags = '$(CPPFLAGS_GNULIB) -I$(srcdir)/grub-core/lib/json';
|
||||||
|
|
||||||
common = util/misc.c;
|
common = util/misc.c;
|
||||||
common = grub-core/kern/command.c;
|
common = grub-core/kern/command.c;
|
||||||
|
@ -36,7 +36,9 @@ library = {
|
||||||
common = grub-core/kern/misc.c;
|
common = grub-core/kern/misc.c;
|
||||||
common = grub-core/kern/partition.c;
|
common = grub-core/kern/partition.c;
|
||||||
common = grub-core/lib/crypto.c;
|
common = grub-core/lib/crypto.c;
|
||||||
|
common = grub-core/lib/json/json.c;
|
||||||
common = grub-core/disk/luks.c;
|
common = grub-core/disk/luks.c;
|
||||||
|
common = grub-core/disk/luks2.c;
|
||||||
common = grub-core/disk/geli.c;
|
common = grub-core/disk/geli.c;
|
||||||
common = grub-core/disk/cryptodisk.c;
|
common = grub-core/disk/cryptodisk.c;
|
||||||
common = grub-core/disk/AFSplitter.c;
|
common = grub-core/disk/AFSplitter.c;
|
||||||
|
@ -54,7 +56,7 @@ library = {
|
||||||
library = {
|
library = {
|
||||||
name = libgrubmods.a;
|
name = libgrubmods.a;
|
||||||
cflags = '-fno-builtin -Wno-undef';
|
cflags = '-fno-builtin -Wno-undef';
|
||||||
cppflags = '-I$(top_srcdir)/grub-core/lib/minilzo -I$(srcdir)/grub-core/lib/xzembed -DMINILZO_HAVE_CONFIG_H';
|
cppflags = '-I$(srcdir)/grub-core/lib/minilzo -I$(srcdir)/grub-core/lib/xzembed -I$(srcdir)/grub-core/lib/zstd -DMINILZO_HAVE_CONFIG_H';
|
||||||
|
|
||||||
common_nodist = grub_script.tab.c;
|
common_nodist = grub_script.tab.c;
|
||||||
common_nodist = grub_script.yy.c;
|
common_nodist = grub_script.yy.c;
|
||||||
|
@ -99,6 +101,7 @@ library = {
|
||||||
common = grub-core/fs/ext2.c;
|
common = grub-core/fs/ext2.c;
|
||||||
common = grub-core/fs/fat.c;
|
common = grub-core/fs/fat.c;
|
||||||
common = grub-core/fs/exfat.c;
|
common = grub-core/fs/exfat.c;
|
||||||
|
common = grub-core/fs/f2fs.c;
|
||||||
common = grub-core/fs/fshelp.c;
|
common = grub-core/fs/fshelp.c;
|
||||||
common = grub-core/fs/hfs.c;
|
common = grub-core/fs/hfs.c;
|
||||||
common = grub-core/fs/hfsplus.c;
|
common = grub-core/fs/hfsplus.c;
|
||||||
|
@ -138,7 +141,7 @@ library = {
|
||||||
common = grub-core/lib/crc.c;
|
common = grub-core/lib/crc.c;
|
||||||
common = grub-core/lib/adler32.c;
|
common = grub-core/lib/adler32.c;
|
||||||
common = grub-core/lib/crc64.c;
|
common = grub-core/lib/crc64.c;
|
||||||
common = grub-core/normal/datetime.c;
|
common = grub-core/lib/datetime.c;
|
||||||
common = grub-core/normal/misc.c;
|
common = grub-core/normal/misc.c;
|
||||||
common = grub-core/partmap/acorn.c;
|
common = grub-core/partmap/acorn.c;
|
||||||
common = grub-core/partmap/amiga.c;
|
common = grub-core/partmap/amiga.c;
|
||||||
|
@ -164,6 +167,15 @@ library = {
|
||||||
common = grub-core/lib/xzembed/xz_dec_bcj.c;
|
common = grub-core/lib/xzembed/xz_dec_bcj.c;
|
||||||
common = grub-core/lib/xzembed/xz_dec_lzma2.c;
|
common = grub-core/lib/xzembed/xz_dec_lzma2.c;
|
||||||
common = grub-core/lib/xzembed/xz_dec_stream.c;
|
common = grub-core/lib/xzembed/xz_dec_stream.c;
|
||||||
|
common = grub-core/lib/zstd/debug.c;
|
||||||
|
common = grub-core/lib/zstd/entropy_common.c;
|
||||||
|
common = grub-core/lib/zstd/error_private.c;
|
||||||
|
common = grub-core/lib/zstd/fse_decompress.c;
|
||||||
|
common = grub-core/lib/zstd/huf_decompress.c;
|
||||||
|
common = grub-core/lib/zstd/module.c;
|
||||||
|
common = grub-core/lib/zstd/xxhash.c;
|
||||||
|
common = grub-core/lib/zstd/zstd_common.c;
|
||||||
|
common = grub-core/lib/zstd/zstd_decompress.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
program = {
|
program = {
|
||||||
|
@ -188,7 +200,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBLZMA)';
|
ldadd = '$(LIBLZMA)';
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
cppflags = '-DGRUB_PKGLIBDIR=\"$(pkglibdir)\"';
|
cppflags = '-DGRUB_PKGLIBDIR=\"$(pkglibdir)\"';
|
||||||
|
@ -205,7 +217,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -220,7 +232,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -230,12 +242,23 @@ program = {
|
||||||
|
|
||||||
common = util/grub-editenv.c;
|
common = util/grub-editenv.c;
|
||||||
common = util/editenv.c;
|
common = util/editenv.c;
|
||||||
|
common = util/grub-install-common.c;
|
||||||
common = grub-core/osdep/init.c;
|
common = grub-core/osdep/init.c;
|
||||||
|
common = grub-core/osdep/compress.c;
|
||||||
|
extra_dist = grub-core/osdep/unix/compress.c;
|
||||||
|
extra_dist = grub-core/osdep/basic/compress.c;
|
||||||
|
common = util/mkimage.c;
|
||||||
|
common = util/grub-mkimage32.c;
|
||||||
|
common = util/grub-mkimage64.c;
|
||||||
|
common = grub-core/osdep/config.c;
|
||||||
|
common = util/config.c;
|
||||||
|
common = util/resolve.c;
|
||||||
|
|
||||||
|
ldadd = '$(LIBLZMA)';
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -251,7 +274,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -274,7 +297,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -290,7 +313,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
|
||||||
condition = COND_GRUB_MOUNT;
|
condition = COND_GRUB_MOUNT;
|
||||||
};
|
};
|
||||||
|
@ -302,14 +325,14 @@ program = {
|
||||||
common = grub-core/kern/emu/argp_common.c;
|
common = grub-core/kern/emu/argp_common.c;
|
||||||
common = grub-core/osdep/init.c;
|
common = grub-core/osdep/init.c;
|
||||||
|
|
||||||
cflags = '$(freetype_cflags)';
|
cflags = '$(FREETYPE_CFLAGS)';
|
||||||
cppflags = '-DGRUB_MKFONT=1';
|
cppflags = '-DGRUB_MKFONT=1';
|
||||||
|
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(freetype_libs)';
|
ldadd = '$(FREETYPE_LIBS)';
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
condition = COND_GRUB_MKFONT;
|
condition = COND_GRUB_MKFONT;
|
||||||
};
|
};
|
||||||
|
@ -327,7 +350,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -349,7 +372,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup';
|
cppflags = '-DGRUB_SETUP_FUNC=grub_util_bios_setup';
|
||||||
};
|
};
|
||||||
|
@ -369,7 +392,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup';
|
cppflags = '-DGRUB_SETUP_FUNC=grub_util_sparc_setup';
|
||||||
};
|
};
|
||||||
|
@ -385,7 +408,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -400,7 +423,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -415,7 +438,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -492,6 +515,12 @@ script = {
|
||||||
installdir = grubconf;
|
installdir = grubconf;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
script = {
|
||||||
|
name = '30_uefi-firmware';
|
||||||
|
common = util/grub.d/30_uefi-firmware.in;
|
||||||
|
installdir = grubconf;
|
||||||
|
};
|
||||||
|
|
||||||
script = {
|
script = {
|
||||||
name = '40_custom';
|
name = '40_custom';
|
||||||
common = util/grub.d/40_custom.in;
|
common = util/grub.d/40_custom.in;
|
||||||
|
@ -542,7 +571,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
|
|
||||||
condition = COND_HAVE_EXEC;
|
condition = COND_HAVE_EXEC;
|
||||||
|
@ -589,7 +618,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -628,7 +657,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -664,7 +693,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -774,6 +803,12 @@ script = {
|
||||||
common = tests/xfs_test.in;
|
common = tests/xfs_test.in;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
script = {
|
||||||
|
testcase;
|
||||||
|
name = f2fs_test;
|
||||||
|
common = tests/f2fs_test.in;
|
||||||
|
};
|
||||||
|
|
||||||
script = {
|
script = {
|
||||||
testcase;
|
testcase;
|
||||||
name = nilfs2_test;
|
name = nilfs2_test;
|
||||||
|
@ -1188,7 +1223,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1203,7 +1238,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1218,7 +1253,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1234,7 +1269,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
condition = COND_HAVE_CXX;
|
condition = COND_HAVE_CXX;
|
||||||
};
|
};
|
||||||
|
@ -1250,7 +1285,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1265,7 +1300,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1283,7 +1318,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1299,7 +1334,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1317,7 +1352,7 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1346,6 +1381,6 @@ program = {
|
||||||
ldadd = libgrubmods.a;
|
ldadd = libgrubmods.a;
|
||||||
ldadd = libgrubgcry.a;
|
ldadd = libgrubgcry.a;
|
||||||
ldadd = libgrubkern.a;
|
ldadd = libgrubkern.a;
|
||||||
ldadd = grub-core/gnulib/libgnu.a;
|
ldadd = grub-core/lib/gnulib/libgnu.a;
|
||||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
};
|
};
|
||||||
|
|
18
NEWS
18
NEWS
|
@ -1,3 +1,21 @@
|
||||||
|
New in 2.04:
|
||||||
|
|
||||||
|
* GCC 8 and 9 support.
|
||||||
|
* Gnulib integration overhaul.
|
||||||
|
* RISC-V support.
|
||||||
|
* Xen PVH support.
|
||||||
|
* Native UEFI secure boot support.
|
||||||
|
* UEFI TPM driver.
|
||||||
|
* New IEEE 1275 obdisk driver.
|
||||||
|
* Btrfs RAID 5 and RIAD 6 support.
|
||||||
|
* PARTUUID support.
|
||||||
|
* VLAN support.
|
||||||
|
* Native DHCP support.
|
||||||
|
* Many ARM and ARM64 fixes.
|
||||||
|
* Many SPARC fixes.
|
||||||
|
* Many IEEE 1275 fixes.
|
||||||
|
* ...and tons of other fixes and cleanups...
|
||||||
|
|
||||||
New in 2.02:
|
New in 2.02:
|
||||||
|
|
||||||
* New/improved filesystem and disk support:
|
* New/improved filesystem and disk support:
|
||||||
|
|
22
autogen.sh
22
autogen.sh
|
@ -2,13 +2,18 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
if [ ! -e grub-core/lib/gnulib/stdlib.in.h ]; then
|
||||||
|
echo "Gnulib not yet bootstrapped; run ./bootstrap instead." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Set ${PYTHON} to plain 'python' if not set already
|
# Set ${PYTHON} to plain 'python' if not set already
|
||||||
: ${PYTHON:=python}
|
: ${PYTHON:=python}
|
||||||
|
|
||||||
export LC_COLLATE=C
|
export LC_COLLATE=C
|
||||||
unset LC_ALL
|
unset LC_ALL
|
||||||
|
|
||||||
find . -iname '*.[ch]' ! -ipath './grub-core/lib/libgcrypt-grub/*' ! -ipath './build-aux/*' ! -ipath './grub-core/lib/libgcrypt/src/misc.c' ! -ipath './grub-core/lib/libgcrypt/src/global.c' ! -ipath './grub-core/lib/libgcrypt/src/secmem.c' ! -ipath './util/grub-gen-widthspec.c' ! -ipath './util/grub-gen-asciih.c' |sort > po/POTFILES.in
|
find . -iname '*.[ch]' ! -ipath './grub-core/lib/libgcrypt-grub/*' ! -ipath './build-aux/*' ! -ipath './grub-core/lib/libgcrypt/src/misc.c' ! -ipath './grub-core/lib/libgcrypt/src/global.c' ! -ipath './grub-core/lib/libgcrypt/src/secmem.c' ! -ipath './util/grub-gen-widthspec.c' ! -ipath './util/grub-gen-asciih.c' ! -ipath './gnulib/*' ! -ipath './grub-core/lib/gnulib/*' |sort > po/POTFILES.in
|
||||||
find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in
|
find util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in
|
||||||
|
|
||||||
echo "Importing unicode..."
|
echo "Importing unicode..."
|
||||||
|
@ -82,6 +87,17 @@ done
|
||||||
echo "Saving timestamps..."
|
echo "Saving timestamps..."
|
||||||
echo timestamp > stamp-h.in
|
echo timestamp > stamp-h.in
|
||||||
|
|
||||||
echo "Running autoreconf..."
|
if [ -z "$FROM_BOOTSTRAP" ]; then
|
||||||
autoreconf -vi
|
# Unaided autoreconf is likely to install older versions of many files
|
||||||
|
# than the ones provided by Gnulib, but in most cases this won't matter
|
||||||
|
# very much. This mode is provided so that you can run ./autogen.sh to
|
||||||
|
# regenerate the GRUB build system in an unpacked release tarball (perhaps
|
||||||
|
# after patching it), even on systems that don't have access to
|
||||||
|
# gnulib.git.
|
||||||
|
echo "Running autoreconf..."
|
||||||
|
cp -a INSTALL INSTALL.grub
|
||||||
|
autoreconf -vif
|
||||||
|
mv INSTALL.grub INSTALL
|
||||||
|
fi
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
# Bootstrap configuration.
|
||||||
|
|
||||||
|
# Copyright (C) 2006-2019 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
GNULIB_REVISION=d271f868a8df9bbec29049d01e056481b7a1a263
|
||||||
|
|
||||||
|
# gnulib modules used by this package.
|
||||||
|
# mbswidth is used by gnulib-fix-width.diff's changes to argp rather than
|
||||||
|
# directly.
|
||||||
|
gnulib_modules="
|
||||||
|
argp
|
||||||
|
base64
|
||||||
|
error
|
||||||
|
fnmatch
|
||||||
|
getdelim
|
||||||
|
getline
|
||||||
|
gettext-h
|
||||||
|
gitlog-to-changelog
|
||||||
|
mbswidth
|
||||||
|
progname
|
||||||
|
realloc-gnu
|
||||||
|
regex
|
||||||
|
save-cwd
|
||||||
|
"
|
||||||
|
|
||||||
|
gnulib_tool_option_extras="\
|
||||||
|
--no-conditional-dependencies \
|
||||||
|
--no-vc-files \
|
||||||
|
"
|
||||||
|
|
||||||
|
gnulib_name=libgnu
|
||||||
|
source_base=grub-core/lib/gnulib
|
||||||
|
gnulib_extra_files="
|
||||||
|
build-aux/install-sh
|
||||||
|
build-aux/mdate-sh
|
||||||
|
build-aux/texinfo.tex
|
||||||
|
build-aux/depcomp
|
||||||
|
build-aux/config.guess
|
||||||
|
build-aux/config.sub
|
||||||
|
"
|
||||||
|
|
||||||
|
# Additional xgettext options to use. Use "\\\newline" to break lines.
|
||||||
|
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
|
||||||
|
--from-code=UTF-8\\\
|
||||||
|
'
|
||||||
|
|
||||||
|
checkout_only_file=
|
||||||
|
copy=true
|
||||||
|
vc_ignore=
|
||||||
|
|
||||||
|
SKIP_PO=t
|
||||||
|
|
||||||
|
# Build prerequisites
|
||||||
|
buildreq="\
|
||||||
|
autoconf 2.63
|
||||||
|
automake 1.11
|
||||||
|
gettext 0.18.3
|
||||||
|
git 1.5.5
|
||||||
|
tar -
|
||||||
|
"
|
||||||
|
|
||||||
|
# bootstrap doesn't give us a reasonable way to stop Automake from
|
||||||
|
# overwriting this, so we just copy our version aside and put it back later.
|
||||||
|
cp -a INSTALL INSTALL.grub
|
||||||
|
|
||||||
|
bootstrap_post_import_hook () {
|
||||||
|
set -e
|
||||||
|
for patchname in fix-base64 fix-null-deref fix-width no-abort; do
|
||||||
|
patch -d grub-core/lib/gnulib -p2 \
|
||||||
|
< "grub-core/lib/gnulib-patches/$patchname.patch"
|
||||||
|
done
|
||||||
|
for patchname in \
|
||||||
|
0001-Support-POTFILES-shell \
|
||||||
|
0002-Handle-gettext_printf-shell-function \
|
||||||
|
0003-Make-msgfmt-output-in-little-endian \
|
||||||
|
0004-Use-SHELL-rather-than-bin-sh; do
|
||||||
|
patch -d po -p3 \
|
||||||
|
< "po/gettext-patches/$patchname.patch"
|
||||||
|
done
|
||||||
|
FROM_BOOTSTRAP=1 ./autogen.sh
|
||||||
|
set +e # bootstrap expects this
|
||||||
|
}
|
||||||
|
|
||||||
|
bootstrap_epilogue () {
|
||||||
|
mv INSTALL.grub INSTALL
|
||||||
|
}
|
|
@ -1,690 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Output a system dependent set of variables, describing how to set the
|
|
||||||
# run time search path of shared libraries in an executable.
|
|
||||||
#
|
|
||||||
# Copyright 1996-2013 Free Software Foundation, Inc.
|
|
||||||
# Taken from GNU libtool, 2001
|
|
||||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
#
|
|
||||||
# The first argument passed to this file is the canonical host specification,
|
|
||||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
|
|
||||||
# or
|
|
||||||
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
|
|
||||||
# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
|
|
||||||
# should be set by the caller.
|
|
||||||
#
|
|
||||||
# The set of defined variables is at the end of this script.
|
|
||||||
|
|
||||||
# Known limitations:
|
|
||||||
# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
|
|
||||||
# than 256 bytes, otherwise the compiler driver will dump core. The only
|
|
||||||
# known workaround is to choose shorter directory names for the build
|
|
||||||
# directory and/or the installation directory.
|
|
||||||
|
|
||||||
# All known linkers require a '.a' archive for static linking (except MSVC,
|
|
||||||
# which needs '.lib').
|
|
||||||
libext=a
|
|
||||||
shrext=.so
|
|
||||||
|
|
||||||
host="$1"
|
|
||||||
host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
|
|
||||||
host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
|
|
||||||
host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
|
|
||||||
|
|
||||||
# Code taken from libtool.m4's _LT_CC_BASENAME.
|
|
||||||
|
|
||||||
for cc_temp in $CC""; do
|
|
||||||
case $cc_temp in
|
|
||||||
compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
|
|
||||||
distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
|
|
||||||
\-*) ;;
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
|
||||||
|
|
||||||
# Code taken from libtool.m4's _LT_COMPILER_PIC.
|
|
||||||
|
|
||||||
wl=
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
wl='-Wl,'
|
|
||||||
else
|
|
||||||
case "$host_os" in
|
|
||||||
aix*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
mingw* | cygwin* | pw32* | os2* | cegcc*)
|
|
||||||
;;
|
|
||||||
hpux9* | hpux10* | hpux11*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
irix5* | irix6* | nonstopux*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
|
||||||
case $cc_basename in
|
|
||||||
ecc*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
icc* | ifort*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
lf95*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
nagfor*)
|
|
||||||
wl='-Wl,-Wl,,'
|
|
||||||
;;
|
|
||||||
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
ccc*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
xl* | bgxl* | bgf* | mpixl*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
como)
|
|
||||||
wl='-lopt='
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
case `$CC -V 2>&1 | sed 5q` in
|
|
||||||
*Sun\ F* | *Sun*Fortran*)
|
|
||||||
wl=
|
|
||||||
;;
|
|
||||||
*Sun\ C*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
newsos6)
|
|
||||||
;;
|
|
||||||
*nto* | *qnx*)
|
|
||||||
;;
|
|
||||||
osf3* | osf4* | osf5*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
rdos*)
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
case $cc_basename in
|
|
||||||
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
|
|
||||||
wl='-Qoption ld '
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
wl='-Qoption ld '
|
|
||||||
;;
|
|
||||||
sysv4 | sysv4.2uw2* | sysv4.3*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
sysv4*MP*)
|
|
||||||
;;
|
|
||||||
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
unicos*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
uts4*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
|
|
||||||
|
|
||||||
hardcode_libdir_flag_spec=
|
|
||||||
hardcode_libdir_separator=
|
|
||||||
hardcode_direct=no
|
|
||||||
hardcode_minus_L=no
|
|
||||||
|
|
||||||
case "$host_os" in
|
|
||||||
cygwin* | mingw* | pw32* | cegcc*)
|
|
||||||
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
|
||||||
# When not using gcc, we currently assume that we are using
|
|
||||||
# Microsoft Visual C++.
|
|
||||||
if test "$GCC" != yes; then
|
|
||||||
with_gnu_ld=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
interix*)
|
|
||||||
# we just hope/assume this is gcc and not c89 (= MSVC++)
|
|
||||||
with_gnu_ld=yes
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
with_gnu_ld=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ld_shlibs=yes
|
|
||||||
if test "$with_gnu_ld" = yes; then
|
|
||||||
# Set some defaults for GNU ld with shared library support. These
|
|
||||||
# are reset later if shared libraries are not supported. Putting them
|
|
||||||
# here allows them to be overridden if necessary.
|
|
||||||
# Unlike libtool, we use -rpath here, not --rpath, since the documented
|
|
||||||
# option of GNU ld is called -rpath, not --rpath.
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
case "$host_os" in
|
|
||||||
aix[3-9]*)
|
|
||||||
# On AIX/PPC, the GNU linker is very broken
|
|
||||||
if test "$host_cpu" != ia64; then
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
amigaos*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
powerpc)
|
|
||||||
;;
|
|
||||||
m68k)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
beos*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
cygwin* | mingw* | pw32* | cegcc*)
|
|
||||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
|
||||||
# no search path for DLLs.
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
haiku*)
|
|
||||||
;;
|
|
||||||
interix[3-9]*)
|
|
||||||
hardcode_direct=no
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
;;
|
|
||||||
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
|
|
||||||
ld_shlibs=no
|
|
||||||
elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
|
|
||||||
case `$LD -v 2>&1` in
|
|
||||||
*\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if test "$ld_shlibs" = no; then
|
|
||||||
hardcode_libdir_flag_spec=
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
case "$host_os" in
|
|
||||||
aix3*)
|
|
||||||
# Note: this linker hardcodes the directories in LIBPATH if there
|
|
||||||
# are no directories specified by -L.
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
# Neither direct hardcoding nor static linking is supported with a
|
|
||||||
# broken collect2.
|
|
||||||
hardcode_direct=unsupported
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
aix[4-9]*)
|
|
||||||
if test "$host_cpu" = ia64; then
|
|
||||||
# On IA64, the linker does run time linking by default, so we don't
|
|
||||||
# have to do anything special.
|
|
||||||
aix_use_runtimelinking=no
|
|
||||||
else
|
|
||||||
aix_use_runtimelinking=no
|
|
||||||
# Test if we are trying to use run time linking or normal
|
|
||||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
|
||||||
# need to do runtime linking.
|
|
||||||
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
|
||||||
for ld_flag in $LDFLAGS; do
|
|
||||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
|
||||||
aix_use_runtimelinking=yes
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_libdir_separator=':'
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
case $host_os in aix4.[012]|aix4.[012].*)
|
|
||||||
collect2name=`${CC} -print-prog-name=collect2`
|
|
||||||
if test -f "$collect2name" && \
|
|
||||||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
|
||||||
then
|
|
||||||
# We have reworked collect2
|
|
||||||
:
|
|
||||||
else
|
|
||||||
# We have old collect2
|
|
||||||
hardcode_direct=unsupported
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_libdir_separator=
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
# Begin _LT_AC_SYS_LIBPATH_AIX.
|
|
||||||
echo 'int main () { return 0; }' > conftest.c
|
|
||||||
${CC} ${LDFLAGS} conftest.c -o conftest
|
|
||||||
aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
|
||||||
}'`
|
|
||||||
if test -z "$aix_libpath"; then
|
|
||||||
aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
|
|
||||||
}'`
|
|
||||||
fi
|
|
||||||
if test -z "$aix_libpath"; then
|
|
||||||
aix_libpath="/usr/lib:/lib"
|
|
||||||
fi
|
|
||||||
rm -f conftest.c conftest
|
|
||||||
# End _LT_AC_SYS_LIBPATH_AIX.
|
|
||||||
if test "$aix_use_runtimelinking" = yes; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
|
||||||
else
|
|
||||||
if test "$host_cpu" = ia64; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
|
|
||||||
else
|
|
||||||
hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
amigaos*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
powerpc)
|
|
||||||
;;
|
|
||||||
m68k)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
bsdi[45]*)
|
|
||||||
;;
|
|
||||||
cygwin* | mingw* | pw32* | cegcc*)
|
|
||||||
# When not using gcc, we currently assume that we are using
|
|
||||||
# Microsoft Visual C++.
|
|
||||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
|
||||||
# no search path for DLLs.
|
|
||||||
hardcode_libdir_flag_spec=' '
|
|
||||||
libext=lib
|
|
||||||
;;
|
|
||||||
darwin* | rhapsody*)
|
|
||||||
hardcode_direct=no
|
|
||||||
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
|
|
||||||
:
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
dgux*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
;;
|
|
||||||
freebsd2.2*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
freebsd2*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
freebsd* | dragonfly*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
hpux9*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
hardcode_direct=yes
|
|
||||||
# hardcode_minus_L: Not really in the search PATH,
|
|
||||||
# but as the default location of the library.
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
hpux10*)
|
|
||||||
if test "$with_gnu_ld" = no; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
hardcode_direct=yes
|
|
||||||
# hardcode_minus_L: Not really in the search PATH,
|
|
||||||
# but as the default location of the library.
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
hpux11*)
|
|
||||||
if test "$with_gnu_ld" = no; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
case $host_cpu in
|
|
||||||
hppa*64*|ia64*)
|
|
||||||
hardcode_direct=no
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
hardcode_direct=yes
|
|
||||||
# hardcode_minus_L: Not really in the search PATH,
|
|
||||||
# but as the default location of the library.
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
irix5* | irix6* | nonstopux*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
;;
|
|
||||||
newsos6)
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
*nto* | *qnx*)
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
if test -f /usr/libexec/ld.so; then
|
|
||||||
hardcode_direct=yes
|
|
||||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
else
|
|
||||||
case "$host_os" in
|
|
||||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
ld_shlibs=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
os2*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
osf3*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
osf4* | osf5*)
|
|
||||||
if test "$GCC" = yes; then
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
|
||||||
else
|
|
||||||
# Both cc and cxx compiler support -rpath directly
|
|
||||||
hardcode_libdir_flag_spec='-rpath $libdir'
|
|
||||||
fi
|
|
||||||
hardcode_libdir_separator=:
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
hardcode_direct=yes
|
|
||||||
hardcode_minus_L=yes
|
|
||||||
;;
|
|
||||||
sysv4)
|
|
||||||
case $host_vendor in
|
|
||||||
sni)
|
|
||||||
hardcode_direct=yes # is this really true???
|
|
||||||
;;
|
|
||||||
siemens)
|
|
||||||
hardcode_direct=no
|
|
||||||
;;
|
|
||||||
motorola)
|
|
||||||
hardcode_direct=no #Motorola manual says yes, but my tests say they lie
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
sysv4.3*)
|
|
||||||
;;
|
|
||||||
sysv4*MP*)
|
|
||||||
if test -d /usr/nec; then
|
|
||||||
ld_shlibs=yes
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
|
||||||
;;
|
|
||||||
sysv5* | sco3.2v5* | sco5v6*)
|
|
||||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
|
||||||
hardcode_libdir_separator=':'
|
|
||||||
;;
|
|
||||||
uts4*)
|
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check dynamic linker characteristics
|
|
||||||
# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
|
|
||||||
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
|
||||||
# only about the one the linker finds when passed -lNAME. This is the last
|
|
||||||
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
|
||||||
# linker has special search rules.
|
|
||||||
library_names_spec= # the last element of library_names_spec in libtool.m4
|
|
||||||
libname_spec='lib$name'
|
|
||||||
case "$host_os" in
|
|
||||||
aix3*)
|
|
||||||
library_names_spec='$libname.a'
|
|
||||||
;;
|
|
||||||
aix[4-9]*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
amigaos*)
|
|
||||||
case "$host_cpu" in
|
|
||||||
powerpc*)
|
|
||||||
library_names_spec='$libname$shrext' ;;
|
|
||||||
m68k)
|
|
||||||
library_names_spec='$libname.a' ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
beos*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
bsdi[45]*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
cygwin* | mingw* | pw32* | cegcc*)
|
|
||||||
shrext=.dll
|
|
||||||
library_names_spec='$libname.dll.a $libname.lib'
|
|
||||||
;;
|
|
||||||
darwin* | rhapsody*)
|
|
||||||
shrext=.dylib
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
dgux*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
freebsd* | dragonfly*)
|
|
||||||
case "$host_os" in
|
|
||||||
freebsd[123]*)
|
|
||||||
library_names_spec='$libname$shrext$versuffix' ;;
|
|
||||||
*)
|
|
||||||
library_names_spec='$libname$shrext' ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
gnu*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
haiku*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
hpux9* | hpux10* | hpux11*)
|
|
||||||
case $host_cpu in
|
|
||||||
ia64*)
|
|
||||||
shrext=.so
|
|
||||||
;;
|
|
||||||
hppa*64*)
|
|
||||||
shrext=.sl
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
shrext=.sl
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
interix[3-9]*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
irix5* | irix6* | nonstopux*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
case "$host_os" in
|
|
||||||
irix5* | nonstopux*)
|
|
||||||
libsuff= shlibsuff=
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
case $LD in
|
|
||||||
*-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
|
|
||||||
*-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
|
|
||||||
*-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
|
|
||||||
*) libsuff= shlibsuff= ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
linux*oldld* | linux*aout* | linux*coff*)
|
|
||||||
;;
|
|
||||||
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
knetbsd*-gnu)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
netbsd*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
newsos6)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
*nto* | *qnx*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
openbsd*)
|
|
||||||
library_names_spec='$libname$shrext$versuffix'
|
|
||||||
;;
|
|
||||||
os2*)
|
|
||||||
libname_spec='$name'
|
|
||||||
shrext=.dll
|
|
||||||
library_names_spec='$libname.a'
|
|
||||||
;;
|
|
||||||
osf3* | osf4* | osf5*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
rdos*)
|
|
||||||
;;
|
|
||||||
solaris*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
sunos4*)
|
|
||||||
library_names_spec='$libname$shrext$versuffix'
|
|
||||||
;;
|
|
||||||
sysv4 | sysv4.3*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
sysv4*MP*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
tpf*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
uts4*)
|
|
||||||
library_names_spec='$libname$shrext'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
|
||||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
|
||||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
|
||||||
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
|
||||||
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
|
||||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
|
||||||
|
|
||||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
|
||||||
|
|
||||||
# How to pass a linker flag through the compiler.
|
|
||||||
wl="$escaped_wl"
|
|
||||||
|
|
||||||
# Static library suffix (normally "a").
|
|
||||||
libext="$libext"
|
|
||||||
|
|
||||||
# Shared library suffix (normally "so").
|
|
||||||
shlibext="$shlibext"
|
|
||||||
|
|
||||||
# Format of library name prefix.
|
|
||||||
libname_spec="$escaped_libname_spec"
|
|
||||||
|
|
||||||
# Library names that the linker finds when passed -lNAME.
|
|
||||||
library_names_spec="$escaped_library_names_spec"
|
|
||||||
|
|
||||||
# Flag to hardcode \$libdir into a binary during linking.
|
|
||||||
# This must work even if \$libdir does not exist.
|
|
||||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
|
||||||
|
|
||||||
# Whether we need a single -rpath flag with a separated argument.
|
|
||||||
hardcode_libdir_separator="$hardcode_libdir_separator"
|
|
||||||
|
|
||||||
# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
|
|
||||||
# resulting binary.
|
|
||||||
hardcode_direct="$hardcode_direct"
|
|
||||||
|
|
||||||
# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
|
|
||||||
# resulting binary.
|
|
||||||
hardcode_minus_L="$hardcode_minus_L"
|
|
||||||
|
|
||||||
EOF
|
|
|
@ -1,432 +0,0 @@
|
||||||
eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
|
|
||||||
& eval 'exec perl -wS "$0" $argv:q'
|
|
||||||
if 0;
|
|
||||||
# Convert git log output to ChangeLog format.
|
|
||||||
|
|
||||||
my $VERSION = '2012-07-29 06:11'; # UTC
|
|
||||||
# The definition above must lie within the first 8 lines in order
|
|
||||||
# for the Emacs time-stamp write hook (at end) to update it.
|
|
||||||
# If you change this file with Emacs, please let the write hook
|
|
||||||
# do its job. Otherwise, update this string manually.
|
|
||||||
|
|
||||||
# Copyright (C) 2008-2014 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# Written by Jim Meyering
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
use Getopt::Long;
|
|
||||||
use POSIX qw(strftime);
|
|
||||||
|
|
||||||
(my $ME = $0) =~ s|.*/||;
|
|
||||||
|
|
||||||
# use File::Coda; # http://meyering.net/code/Coda/
|
|
||||||
END {
|
|
||||||
defined fileno STDOUT or return;
|
|
||||||
close STDOUT and return;
|
|
||||||
warn "$ME: failed to close standard output: $!\n";
|
|
||||||
$? ||= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub usage ($)
|
|
||||||
{
|
|
||||||
my ($exit_code) = @_;
|
|
||||||
my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
|
|
||||||
if ($exit_code != 0)
|
|
||||||
{
|
|
||||||
print $STREAM "Try '$ME --help' for more information.\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
print $STREAM <<EOF;
|
|
||||||
Usage: $ME [OPTIONS] [ARGS]
|
|
||||||
|
|
||||||
Convert git log output to ChangeLog format. If present, any ARGS
|
|
||||||
are passed to "git log". To avoid ARGS being parsed as options to
|
|
||||||
$ME, they may be preceded by '--'.
|
|
||||||
|
|
||||||
OPTIONS:
|
|
||||||
|
|
||||||
--amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
|
|
||||||
makes a change to SHA1's commit log text or metadata.
|
|
||||||
--append-dot append a dot to the first line of each commit message if
|
|
||||||
there is no other punctuation or blank at the end.
|
|
||||||
--no-cluster never cluster commit messages under the same date/author
|
|
||||||
header; the default is to cluster adjacent commit messages
|
|
||||||
if their headers are the same and neither commit message
|
|
||||||
contains multiple paragraphs.
|
|
||||||
--srcdir=DIR the root of the source tree, from which the .git/
|
|
||||||
directory can be derived.
|
|
||||||
--since=DATE convert only the logs since DATE;
|
|
||||||
the default is to convert all log entries.
|
|
||||||
--format=FMT set format string for commit subject and body;
|
|
||||||
see 'man git-log' for the list of format metacharacters;
|
|
||||||
the default is '%s%n%b%n'
|
|
||||||
--strip-tab remove one additional leading TAB from commit message lines.
|
|
||||||
--strip-cherry-pick remove data inserted by "git cherry-pick";
|
|
||||||
this includes the "cherry picked from commit ..." line,
|
|
||||||
and the possible final "Conflicts:" paragraph.
|
|
||||||
--help display this help and exit
|
|
||||||
--version output version information and exit
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
$ME --since=2008-01-01 > ChangeLog
|
|
||||||
$ME -- -n 5 foo > last-5-commits-to-branch-foo
|
|
||||||
|
|
||||||
SPECIAL SYNTAX:
|
|
||||||
|
|
||||||
The following types of strings are interpreted specially when they appear
|
|
||||||
at the beginning of a log message line. They are not copied to the output.
|
|
||||||
|
|
||||||
Copyright-paperwork-exempt: Yes
|
|
||||||
Append the "(tiny change)" notation to the usual "date name email"
|
|
||||||
ChangeLog header to mark a change that does not require a copyright
|
|
||||||
assignment.
|
|
||||||
Co-authored-by: Joe User <user\@example.com>
|
|
||||||
List the specified name and email address on a second
|
|
||||||
ChangeLog header, denoting a co-author.
|
|
||||||
Signed-off-by: Joe User <user\@example.com>
|
|
||||||
These lines are simply elided.
|
|
||||||
|
|
||||||
In a FILE specified via --amend, comment lines (starting with "#") are ignored.
|
|
||||||
FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
|
|
||||||
a line) referring to a commit in the current project, and CODE refers to one
|
|
||||||
or more consecutive lines of Perl code. Pairs must be separated by one or
|
|
||||||
more blank line.
|
|
||||||
|
|
||||||
Here is sample input for use with --amend=FILE, from coreutils:
|
|
||||||
|
|
||||||
3a169f4c5d9159283548178668d2fae6fced3030
|
|
||||||
# fix typo in title:
|
|
||||||
s/all tile types/all file types/
|
|
||||||
|
|
||||||
1379ed974f1fa39b12e2ffab18b3f7a607082202
|
|
||||||
# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
|
|
||||||
# Change the author to be Paul. Note the escaped "@":
|
|
||||||
s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
exit $exit_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
# If the string $S is a well-behaved file name, simply return it.
|
|
||||||
# If it contains white space, quotes, etc., quote it, and return the new string.
|
|
||||||
sub shell_quote($)
|
|
||||||
{
|
|
||||||
my ($s) = @_;
|
|
||||||
if ($s =~ m![^\w+/.,-]!)
|
|
||||||
{
|
|
||||||
# Convert each single quote to '\''
|
|
||||||
$s =~ s/\'/\'\\\'\'/g;
|
|
||||||
# Then single quote the string.
|
|
||||||
$s = "'$s'";
|
|
||||||
}
|
|
||||||
return $s;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub quoted_cmd(@)
|
|
||||||
{
|
|
||||||
return join (' ', map {shell_quote $_} @_);
|
|
||||||
}
|
|
||||||
|
|
||||||
# Parse file F.
|
|
||||||
# Comment lines (starting with "#") are ignored.
|
|
||||||
# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
|
|
||||||
# (alone on a line) referring to a commit in the current project, and
|
|
||||||
# CODE refers to one or more consecutive lines of Perl code.
|
|
||||||
# Pairs must be separated by one or more blank line.
|
|
||||||
sub parse_amend_file($)
|
|
||||||
{
|
|
||||||
my ($f) = @_;
|
|
||||||
|
|
||||||
open F, '<', $f
|
|
||||||
or die "$ME: $f: failed to open for reading: $!\n";
|
|
||||||
|
|
||||||
my $fail;
|
|
||||||
my $h = {};
|
|
||||||
my $in_code = 0;
|
|
||||||
my $sha;
|
|
||||||
while (defined (my $line = <F>))
|
|
||||||
{
|
|
||||||
$line =~ /^\#/
|
|
||||||
and next;
|
|
||||||
chomp $line;
|
|
||||||
$line eq ''
|
|
||||||
and $in_code = 0, next;
|
|
||||||
|
|
||||||
if (!$in_code)
|
|
||||||
{
|
|
||||||
$line =~ /^([0-9a-fA-F]{40})$/
|
|
||||||
or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
|
|
||||||
$fail = 1, next;
|
|
||||||
$sha = lc $1;
|
|
||||||
$in_code = 1;
|
|
||||||
exists $h->{$sha}
|
|
||||||
and (warn "$ME: $f:$.: duplicate SHA1\n"),
|
|
||||||
$fail = 1, next;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$h->{$sha} ||= '';
|
|
||||||
$h->{$sha} .= "$line\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close F;
|
|
||||||
|
|
||||||
$fail
|
|
||||||
and exit 1;
|
|
||||||
|
|
||||||
return $h;
|
|
||||||
}
|
|
||||||
|
|
||||||
# git_dir_option $SRCDIR
|
|
||||||
#
|
|
||||||
# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
|
|
||||||
# is undef). Return as a list (0 or 1 element).
|
|
||||||
sub git_dir_option($)
|
|
||||||
{
|
|
||||||
my ($srcdir) = @_;
|
|
||||||
my @res = ();
|
|
||||||
if (defined $srcdir)
|
|
||||||
{
|
|
||||||
my $qdir = shell_quote $srcdir;
|
|
||||||
my $cmd = "cd $qdir && git rev-parse --show-toplevel";
|
|
||||||
my $qcmd = shell_quote $cmd;
|
|
||||||
my $git_dir = qx($cmd);
|
|
||||||
defined $git_dir
|
|
||||||
or die "$ME: cannot run $qcmd: $!\n";
|
|
||||||
$? == 0
|
|
||||||
or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
|
|
||||||
chomp $git_dir;
|
|
||||||
push @res, "--git-dir=$git_dir/.git";
|
|
||||||
}
|
|
||||||
@res;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
my $since_date;
|
|
||||||
my $format_string = '%s%n%b%n';
|
|
||||||
my $amend_file;
|
|
||||||
my $append_dot = 0;
|
|
||||||
my $cluster = 1;
|
|
||||||
my $strip_tab = 0;
|
|
||||||
my $strip_cherry_pick = 0;
|
|
||||||
my $srcdir;
|
|
||||||
GetOptions
|
|
||||||
(
|
|
||||||
help => sub { usage 0 },
|
|
||||||
version => sub { print "$ME version $VERSION\n"; exit },
|
|
||||||
'since=s' => \$since_date,
|
|
||||||
'format=s' => \$format_string,
|
|
||||||
'amend=s' => \$amend_file,
|
|
||||||
'append-dot' => \$append_dot,
|
|
||||||
'cluster!' => \$cluster,
|
|
||||||
'strip-tab' => \$strip_tab,
|
|
||||||
'strip-cherry-pick' => \$strip_cherry_pick,
|
|
||||||
'srcdir=s' => \$srcdir,
|
|
||||||
) or usage 1;
|
|
||||||
|
|
||||||
defined $since_date
|
|
||||||
and unshift @ARGV, "--since=$since_date";
|
|
||||||
|
|
||||||
# This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
|
|
||||||
# that makes a correction in the log or attribution of that commit.
|
|
||||||
my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
|
|
||||||
|
|
||||||
my @cmd = ('git',
|
|
||||||
git_dir_option $srcdir,
|
|
||||||
qw(log --log-size),
|
|
||||||
'--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV);
|
|
||||||
open PIPE, '-|', @cmd
|
|
||||||
or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
|
|
||||||
. "(Is your Git too old? Version 1.5.1 or later is required.)\n");
|
|
||||||
|
|
||||||
my $prev_multi_paragraph;
|
|
||||||
my $prev_date_line = '';
|
|
||||||
my @prev_coauthors = ();
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
defined (my $in = <PIPE>)
|
|
||||||
or last;
|
|
||||||
$in =~ /^log size (\d+)$/
|
|
||||||
or die "$ME:$.: Invalid line (expected log size):\n$in";
|
|
||||||
my $log_nbytes = $1;
|
|
||||||
|
|
||||||
my $log;
|
|
||||||
my $n_read = read PIPE, $log, $log_nbytes;
|
|
||||||
$n_read == $log_nbytes
|
|
||||||
or die "$ME:$.: unexpected EOF\n";
|
|
||||||
|
|
||||||
# Extract leading hash.
|
|
||||||
my ($sha, $rest) = split ':', $log, 2;
|
|
||||||
defined $sha
|
|
||||||
or die "$ME:$.: malformed log entry\n";
|
|
||||||
$sha =~ /^[0-9a-fA-F]{40}$/
|
|
||||||
or die "$ME:$.: invalid SHA1: $sha\n";
|
|
||||||
|
|
||||||
# If this commit's log requires any transformation, do it now.
|
|
||||||
my $code = $amend_code->{$sha};
|
|
||||||
if (defined $code)
|
|
||||||
{
|
|
||||||
eval 'use Safe';
|
|
||||||
my $s = new Safe;
|
|
||||||
# Put the unpreprocessed entry into "$_".
|
|
||||||
$_ = $rest;
|
|
||||||
|
|
||||||
# Let $code operate on it, safely.
|
|
||||||
my $r = $s->reval("$code")
|
|
||||||
or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
|
|
||||||
|
|
||||||
# Note that we've used this entry.
|
|
||||||
delete $amend_code->{$sha};
|
|
||||||
|
|
||||||
# Update $rest upon success.
|
|
||||||
$rest = $_;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove lines inserted by "git cherry-pick".
|
|
||||||
if ($strip_cherry_pick)
|
|
||||||
{
|
|
||||||
$rest =~ s/^\s*Conflicts:\n.*//sm;
|
|
||||||
$rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
|
|
||||||
}
|
|
||||||
|
|
||||||
my @line = split "\n", $rest;
|
|
||||||
my $author_line = shift @line;
|
|
||||||
defined $author_line
|
|
||||||
or die "$ME:$.: unexpected EOF\n";
|
|
||||||
$author_line =~ /^(\d+) (.*>)$/
|
|
||||||
or die "$ME:$.: Invalid line "
|
|
||||||
. "(expected date/author/email):\n$author_line\n";
|
|
||||||
|
|
||||||
# Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
|
|
||||||
# `(tiny change)' annotation.
|
|
||||||
my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
|
|
||||||
? ' (tiny change)' : '');
|
|
||||||
|
|
||||||
my $date_line = sprintf "%s %s$tiny\n",
|
|
||||||
strftime ("%F", localtime ($1)), $2;
|
|
||||||
|
|
||||||
my @coauthors = grep /^Co-authored-by:.*$/, @line;
|
|
||||||
# Omit meta-data lines we've already interpreted.
|
|
||||||
@line = grep !/^(?:Signed-off-by:[ ].*>$
|
|
||||||
|Co-authored-by:[ ]
|
|
||||||
|Copyright-paperwork-exempt:[ ]
|
|
||||||
)/x, @line;
|
|
||||||
|
|
||||||
# Remove leading and trailing blank lines.
|
|
||||||
if (@line)
|
|
||||||
{
|
|
||||||
while ($line[0] =~ /^\s*$/) { shift @line; }
|
|
||||||
while ($line[$#line] =~ /^\s*$/) { pop @line; }
|
|
||||||
}
|
|
||||||
|
|
||||||
# Record whether there are two or more paragraphs.
|
|
||||||
my $multi_paragraph = grep /^\s*$/, @line;
|
|
||||||
|
|
||||||
# Format 'Co-authored-by: A U Thor <email@example.com>' lines in
|
|
||||||
# standard multi-author ChangeLog format.
|
|
||||||
for (@coauthors)
|
|
||||||
{
|
|
||||||
s/^Co-authored-by:\s*/\t /;
|
|
||||||
s/\s*</ </;
|
|
||||||
|
|
||||||
/<.*?@.*\..*>/
|
|
||||||
or warn "$ME: warning: missing email address for "
|
|
||||||
. substr ($_, 5) . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
# If clustering of commit messages has been disabled, if this header
|
|
||||||
# would be different from the previous date/name/email/coauthors header,
|
|
||||||
# or if this or the previous entry consists of two or more paragraphs,
|
|
||||||
# then print the header.
|
|
||||||
if ( ! $cluster
|
|
||||||
|| $date_line ne $prev_date_line
|
|
||||||
|| "@coauthors" ne "@prev_coauthors"
|
|
||||||
|| $multi_paragraph
|
|
||||||
|| $prev_multi_paragraph)
|
|
||||||
{
|
|
||||||
$prev_date_line eq ''
|
|
||||||
or print "\n";
|
|
||||||
print $date_line;
|
|
||||||
@coauthors
|
|
||||||
and print join ("\n", @coauthors), "\n";
|
|
||||||
}
|
|
||||||
$prev_date_line = $date_line;
|
|
||||||
@prev_coauthors = @coauthors;
|
|
||||||
$prev_multi_paragraph = $multi_paragraph;
|
|
||||||
|
|
||||||
# If there were any lines
|
|
||||||
if (@line == 0)
|
|
||||||
{
|
|
||||||
warn "$ME: warning: empty commit message:\n $date_line\n";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ($append_dot)
|
|
||||||
{
|
|
||||||
# If the first line of the message has enough room, then
|
|
||||||
if (length $line[0] < 72)
|
|
||||||
{
|
|
||||||
# append a dot if there is no other punctuation or blank
|
|
||||||
# at the end.
|
|
||||||
$line[0] =~ /[[:punct:]\s]$/
|
|
||||||
or $line[0] .= '.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Remove one additional leading TAB from each line.
|
|
||||||
$strip_tab
|
|
||||||
and map { s/^\t// } @line;
|
|
||||||
|
|
||||||
# Prefix each non-empty line with a TAB.
|
|
||||||
@line = map { length $_ ? "\t$_" : '' } @line;
|
|
||||||
|
|
||||||
print "\n", join ("\n", @line), "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
defined ($in = <PIPE>)
|
|
||||||
or last;
|
|
||||||
$in ne "\n"
|
|
||||||
and die "$ME:$.: unexpected line:\n$in";
|
|
||||||
}
|
|
||||||
|
|
||||||
close PIPE
|
|
||||||
or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
|
|
||||||
# FIXME-someday: include $PROCESS_STATUS in the diagnostic
|
|
||||||
|
|
||||||
# Complain about any unused entry in the --amend=F specified file.
|
|
||||||
my $fail = 0;
|
|
||||||
foreach my $sha (keys %$amend_code)
|
|
||||||
{
|
|
||||||
warn "$ME:$amend_file: unused entry: $sha\n";
|
|
||||||
$fail = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit $fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: perl
|
|
||||||
# indent-tabs-mode: nil
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "my $VERSION = '"
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "'; # UTC"
|
|
||||||
# End:
|
|
|
@ -1,10 +0,0 @@
|
||||||
#if !defined _Noreturn && __STDC_VERSION__ < 201112
|
|
||||||
# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
|
|
||||||
|| 0x5110 <= __SUNPRO_C)
|
|
||||||
# define _Noreturn __attribute__ ((__noreturn__))
|
|
||||||
# elif 1200 <= _MSC_VER
|
|
||||||
# define _Noreturn __declspec (noreturn)
|
|
||||||
# else
|
|
||||||
# define _Noreturn
|
|
||||||
# endif
|
|
||||||
#endif
|
|
|
@ -1,26 +0,0 @@
|
||||||
/* A C macro for declaring that specific arguments must not be NULL.
|
|
||||||
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published
|
|
||||||
by the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
|
||||||
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
|
||||||
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
|
||||||
#ifndef _GL_ARG_NONNULL
|
|
||||||
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
|
||||||
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
|
||||||
# else
|
|
||||||
# define _GL_ARG_NONNULL(params)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
|
@ -1,271 +0,0 @@
|
||||||
/* C++ compatible function declaration macros.
|
|
||||||
Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published
|
|
||||||
by the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
#ifndef _GL_CXXDEFS_H
|
|
||||||
#define _GL_CXXDEFS_H
|
|
||||||
|
|
||||||
/* The three most frequent use cases of these macros are:
|
|
||||||
|
|
||||||
* For providing a substitute for a function that is missing on some
|
|
||||||
platforms, but is declared and works fine on the platforms on which
|
|
||||||
it exists:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if !@HAVE_FOO@
|
|
||||||
_GL_FUNCDECL_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
* For providing a replacement for a function that exists on all platforms,
|
|
||||||
but is broken/insufficient and needs to be replaced on some platforms:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if @REPLACE_FOO@
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef foo
|
|
||||||
# define foo rpl_foo
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (foo, ...);
|
|
||||||
_GL_CXXALIAS_RPL (foo, ...);
|
|
||||||
# else
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
* For providing a replacement for a function that exists on some platforms
|
|
||||||
but is broken/insufficient and needs to be replaced on some of them and
|
|
||||||
is additionally either missing or undeclared on some other platforms:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if @REPLACE_FOO@
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef foo
|
|
||||||
# define foo rpl_foo
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (foo, ...);
|
|
||||||
_GL_CXXALIAS_RPL (foo, ...);
|
|
||||||
# else
|
|
||||||
# if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
|
|
||||||
_GL_FUNCDECL_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* _GL_EXTERN_C declaration;
|
|
||||||
performs the declaration with C linkage. */
|
|
||||||
#if defined __cplusplus
|
|
||||||
# define _GL_EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define _GL_EXTERN_C extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
|
|
||||||
declares a replacement function, named rpl_func, with the given prototype,
|
|
||||||
consisting of return type, parameters, and attributes.
|
|
||||||
Example:
|
|
||||||
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
|
||||||
_GL_ARG_NONNULL ((1)));
|
|
||||||
*/
|
|
||||||
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
|
|
||||||
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C rettype rpl_func parameters_and_attributes
|
|
||||||
|
|
||||||
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
|
|
||||||
declares the system function, named func, with the given prototype,
|
|
||||||
consisting of return type, parameters, and attributes.
|
|
||||||
Example:
|
|
||||||
_GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
|
|
||||||
_GL_ARG_NONNULL ((1)));
|
|
||||||
*/
|
|
||||||
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C rettype func parameters_and_attributes
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
|
||||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
|
||||||
*/
|
|
||||||
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
|
||||||
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
rettype (*const func) parameters = ::rpl_func; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
|
||||||
except that the C function rpl_func may have a slightly different
|
|
||||||
declaration. A cast is used to silence the "invalid conversion" error
|
|
||||||
that would otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
rettype (*const func) parameters = \
|
|
||||||
reinterpret_cast<rettype(*)parameters>(::rpl_func); \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
|
||||||
is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
|
||||||
*/
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
/* If we were to write
|
|
||||||
rettype (*const func) parameters = ::func;
|
|
||||||
like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
|
|
||||||
better (remove an indirection through a 'static' pointer variable),
|
|
||||||
but then the _GL_CXXALIASWARN macro below would cause a warning not only
|
|
||||||
for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */
|
|
||||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static rettype (*func) parameters = ::func; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
except that the C function func may have a slightly different declaration.
|
|
||||||
A cast is used to silence the "invalid conversion" error that would
|
|
||||||
otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static rettype (*func) parameters = \
|
|
||||||
reinterpret_cast<rettype(*)parameters>(::func); \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
|
|
||||||
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
except that the C function is picked among a set of overloaded functions,
|
|
||||||
namely the one with rettype2 and parameters2. Two consecutive casts
|
|
||||||
are used to silence the "cannot find a match" and "invalid conversion"
|
|
||||||
errors that would otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
/* The outer cast must be a reinterpret_cast.
|
|
||||||
The inner cast: When the function is defined as a set of overloaded
|
|
||||||
functions, it works as a static_cast<>, choosing the designated variant.
|
|
||||||
When the function is defined as a single variant, it works as a
|
|
||||||
reinterpret_cast<>. The parenthesized cast syntax works both ways. */
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static rettype (*func) parameters = \
|
|
||||||
reinterpret_cast<rettype(*)parameters>( \
|
|
||||||
(rettype2(*)parameters2)(::func)); \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIASWARN (func);
|
|
||||||
causes a warning to be emitted when ::func is used but not when
|
|
||||||
GNULIB_NAMESPACE::func is used. func must be defined without overloaded
|
|
||||||
variants. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIASWARN(func) \
|
|
||||||
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
|
||||||
# define _GL_CXXALIASWARN_1(func,namespace) \
|
|
||||||
_GL_CXXALIASWARN_2 (func, namespace)
|
|
||||||
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
|
||||||
we enable the warning only when not optimizing. */
|
|
||||||
# if !__OPTIMIZE__
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
_GL_WARN_ON_USE (func, \
|
|
||||||
"The symbol ::" #func " refers to the system function. " \
|
|
||||||
"Use " #namespace "::" #func " instead.")
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
extern __typeof__ (func) func
|
|
||||||
# else
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIASWARN(func) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
|
|
||||||
causes a warning to be emitted when the given overloaded variant of ::func
|
|
||||||
is used but not when GNULIB_NAMESPACE::func is used. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
|
|
||||||
GNULIB_NAMESPACE)
|
|
||||||
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
|
||||||
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
|
||||||
we enable the warning only when not optimizing. */
|
|
||||||
# if !__OPTIMIZE__
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
|
||||||
"The symbol ::" #func " refers to the system function. " \
|
|
||||||
"Use " #namespace "::" #func " instead.")
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
extern __typeof__ (func) func
|
|
||||||
# else
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _GL_CXXDEFS_H */
|
|
|
@ -1,109 +0,0 @@
|
||||||
/* A C macro for emitting warnings if a function is used.
|
|
||||||
Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published
|
|
||||||
by the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
|
||||||
for FUNCTION which will then trigger a compiler warning containing
|
|
||||||
the text of "literal string" anywhere that function is called, if
|
|
||||||
supported by the compiler. If the compiler does not support this
|
|
||||||
feature, the macro expands to an unused extern declaration.
|
|
||||||
|
|
||||||
This macro is useful for marking a function as a potential
|
|
||||||
portability trap, with the intent that "literal string" include
|
|
||||||
instructions on the replacement function that should be used
|
|
||||||
instead. However, one of the reasons that a function is a
|
|
||||||
portability trap is if it has the wrong signature. Declaring
|
|
||||||
FUNCTION with a different signature in C is a compilation error, so
|
|
||||||
this macro must use the same type as any existing declaration so
|
|
||||||
that programs that avoid the problematic FUNCTION do not fail to
|
|
||||||
compile merely because they included a header that poisoned the
|
|
||||||
function. But this implies that _GL_WARN_ON_USE is only safe to
|
|
||||||
use if FUNCTION is known to already have a declaration. Use of
|
|
||||||
this macro implies that there must not be any other macro hiding
|
|
||||||
the declaration of FUNCTION; but undefining FUNCTION first is part
|
|
||||||
of the poisoning process anyway (although for symbols that are
|
|
||||||
provided only via a macro, the result is a compilation error rather
|
|
||||||
than a warning containing "literal string"). Also note that in
|
|
||||||
C++, it is only safe to use if FUNCTION has no overloads.
|
|
||||||
|
|
||||||
For an example, it is possible to poison 'getline' by:
|
|
||||||
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
|
|
||||||
[getline]) in configure.ac, which potentially defines
|
|
||||||
HAVE_RAW_DECL_GETLINE
|
|
||||||
- adding this code to a header that wraps the system <stdio.h>:
|
|
||||||
#undef getline
|
|
||||||
#if HAVE_RAW_DECL_GETLINE
|
|
||||||
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
|
|
||||||
"not universally present; use the gnulib module getline");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
It is not possible to directly poison global variables. But it is
|
|
||||||
possible to write a wrapper accessor function, and poison that
|
|
||||||
(less common usage, like &environ, will cause a compilation error
|
|
||||||
rather than issue the nice warning, but the end result of informing
|
|
||||||
the developer about their portability problem is still achieved):
|
|
||||||
#if HAVE_RAW_DECL_ENVIRON
|
|
||||||
static char ***rpl_environ (void) { return &environ; }
|
|
||||||
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
|
|
||||||
# undef environ
|
|
||||||
# define environ (*rpl_environ ())
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
#ifndef _GL_WARN_ON_USE
|
|
||||||
|
|
||||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
|
||||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
/* Verify the existence of the function. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
extern __typeof__ (function) function
|
|
||||||
# else /* Unsupported. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
|
|
||||||
is like _GL_WARN_ON_USE (function, "string"), except that the function is
|
|
||||||
declared with the given prototype, consisting of return type, parameters,
|
|
||||||
and attributes.
|
|
||||||
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
|
||||||
not work in this case. */
|
|
||||||
#ifndef _GL_WARN_ON_USE_CXX
|
|
||||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
|
||||||
extern rettype function parameters_and_attributes \
|
|
||||||
__attribute__ ((__warning__ (msg)))
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
/* Verify the existence of the function. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
|
||||||
extern rettype function parameters_and_attributes
|
|
||||||
# else /* Unsupported. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
|
||||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_WARN_EXTERN_C declaration;
|
|
||||||
performs the declaration with C linkage. */
|
|
||||||
#ifndef _GL_WARN_EXTERN_C
|
|
||||||
# if defined __cplusplus
|
|
||||||
# define _GL_WARN_EXTERN_C extern "C"
|
|
||||||
# else
|
|
||||||
# define _GL_WARN_EXTERN_C extern
|
|
||||||
# endif
|
|
||||||
#endif
|
|
|
@ -66,7 +66,7 @@ platformdir = $(pkglibdir)/$(target_cpu)-$(platform)
|
||||||
starfielddir = $(pkgdatadir)/themes/starfield
|
starfielddir = $(pkgdatadir)/themes/starfield
|
||||||
|
|
||||||
CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion
|
CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion
|
||||||
CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/gnulib -I$(top_srcdir)/grub-core/gnulib
|
CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/lib/gnulib -I$(top_srcdir)/grub-core/lib/gnulib
|
||||||
|
|
||||||
CFLAGS_POSIX = -fno-builtin
|
CFLAGS_POSIX = -fno-builtin
|
||||||
CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap
|
CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap
|
||||||
|
@ -86,9 +86,11 @@ CPPFLAGS_TERMINAL_LIST += '-Dgrub_term_register_output(...)=OUTPUT_TERMINAL_LIST
|
||||||
CPPFLAGS_COMMAND_LIST = '-Dgrub_register_command(...)=COMMAND_LIST_MARKER(__VA_ARGS__)'
|
CPPFLAGS_COMMAND_LIST = '-Dgrub_register_command(...)=COMMAND_LIST_MARKER(__VA_ARGS__)'
|
||||||
CPPFLAGS_COMMAND_LIST += '-Dgrub_register_extcmd(...)=EXTCOMMAND_LIST_MARKER(__VA_ARGS__)'
|
CPPFLAGS_COMMAND_LIST += '-Dgrub_register_extcmd(...)=EXTCOMMAND_LIST_MARKER(__VA_ARGS__)'
|
||||||
CPPFLAGS_COMMAND_LIST += '-Dgrub_register_command_p1(...)=P1COMMAND_LIST_MARKER(__VA_ARGS__)'
|
CPPFLAGS_COMMAND_LIST += '-Dgrub_register_command_p1(...)=P1COMMAND_LIST_MARKER(__VA_ARGS__)'
|
||||||
|
CPPFLAGS_FDT_LIST := '-Dgrub_fdtbus_register(...)=FDT_DRIVER_LIST_MARKER(__VA_ARGS__)'
|
||||||
CPPFLAGS_MARKER = $(CPPFLAGS_FS_LIST) $(CPPFLAGS_VIDEO_LIST) \
|
CPPFLAGS_MARKER = $(CPPFLAGS_FS_LIST) $(CPPFLAGS_VIDEO_LIST) \
|
||||||
$(CPPFLAGS_PARTTOOL_LIST) $(CPPFLAGS_PARTMAP_LIST) \
|
$(CPPFLAGS_PARTTOOL_LIST) $(CPPFLAGS_PARTMAP_LIST) \
|
||||||
$(CPPFLAGS_TERMINAL_LIST) $(CPPFLAGS_COMMAND_LIST)
|
$(CPPFLAGS_TERMINAL_LIST) $(CPPFLAGS_COMMAND_LIST) \
|
||||||
|
$(CPPFLAGS_FDT_LIST)
|
||||||
|
|
||||||
# Define these variables to calm down automake
|
# Define these variables to calm down automake
|
||||||
|
|
||||||
|
@ -126,11 +128,11 @@ BUILT_SOURCES =
|
||||||
|
|
||||||
.PRECIOUS: $(top_srcdir)/Makefile.util.am
|
.PRECIOUS: $(top_srcdir)/Makefile.util.am
|
||||||
$(top_srcdir)/Makefile.util.am: $(top_srcdir)/gentpl.py $(top_srcdir)/Makefile.util.def $(top_srcdir)/Makefile.utilgcry.def
|
$(top_srcdir)/Makefile.util.am: $(top_srcdir)/gentpl.py $(top_srcdir)/Makefile.util.def $(top_srcdir)/Makefile.utilgcry.def
|
||||||
python $^ > $@.new || (rm -f $@.new; exit 1)
|
$(PYTHON) $^ > $@.new || (rm -f $@.new; exit 1)
|
||||||
mv $@.new $@
|
mv $@.new $@
|
||||||
|
|
||||||
.PRECIOUS: $(top_srcdir)/grub-core/Makefile.core.am
|
.PRECIOUS: $(top_srcdir)/grub-core/Makefile.core.am
|
||||||
$(top_srcdir)/grub-core/Makefile.core.am: $(top_srcdir)/gentpl.py $(top_srcdir)/grub-core/Makefile.core.def $(top_srcdir)/grub-core/Makefile.gcry.def
|
$(top_srcdir)/grub-core/Makefile.core.am: $(top_srcdir)/gentpl.py $(top_srcdir)/grub-core/Makefile.core.def $(top_srcdir)/grub-core/Makefile.gcry.def
|
||||||
if [ "x$$GRUB_CONTRIB" != x ]; then echo "You need to run ./autogen.sh manually." >&2; exit 1; fi
|
if [ "x$$GRUB_CONTRIB" != x ]; then echo "You need to run ./bootstrap manually." >&2; exit 1; fi
|
||||||
python $^ > $@.new || (rm -f $@.new; exit 1)
|
$(PYTHON) $^ > $@.new || (rm -f $@.new; exit 1)
|
||||||
mv $@.new $@
|
mv $@.new $@
|
||||||
|
|
|
@ -28,10 +28,10 @@ EXTRA_DIST += grub-core/gensymlist.sh
|
||||||
EXTRA_DIST += grub-core/genemuinit.sh
|
EXTRA_DIST += grub-core/genemuinit.sh
|
||||||
EXTRA_DIST += grub-core/genemuinitheader.sh
|
EXTRA_DIST += grub-core/genemuinitheader.sh
|
||||||
|
|
||||||
EXTRA_DIST += grub-core/gnulib-fix-null-deref.diff
|
EXTRA_DIST += grub-core/lib/gnulib-patches/fix-base64.patch
|
||||||
EXTRA_DIST += grub-core/gnulib-fix-width.diff
|
EXTRA_DIST += grub-core/lib/gnulib-patches/fix-null-deref.patch
|
||||||
EXTRA_DIST += grub-core/gnulib-no-abort.diff
|
EXTRA_DIST += grub-core/lib/gnulib-patches/fix-width.patch
|
||||||
EXTRA_DIST += grub-core/gnulib-no-gets.diff
|
EXTRA_DIST += grub-core/lib/gnulib-patches/no-abort.patch
|
||||||
|
|
||||||
EXTRA_DIST += grub-core/lib/libgcrypt
|
EXTRA_DIST += grub-core/lib/libgcrypt
|
||||||
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
|
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
|
||||||
|
@ -111,6 +111,21 @@ EXTRA_DIST += grub-core/osdep/windows/password.c
|
||||||
EXTRA_DIST += grub-core/osdep/windows/random.c
|
EXTRA_DIST += grub-core/osdep/windows/random.c
|
||||||
EXTRA_DIST += grub-core/osdep/windows/sleep.c
|
EXTRA_DIST += grub-core/osdep/windows/sleep.c
|
||||||
|
|
||||||
|
EXTRA_DIST += po/gettext-patches/0001-Support-POTFILES-shell.patch
|
||||||
|
EXTRA_DIST += po/gettext-patches/0002-Handle-gettext_printf-shell-function.patch
|
||||||
|
EXTRA_DIST += po/gettext-patches/0003-Make-msgfmt-output-in-little-endian.patch
|
||||||
|
EXTRA_DIST += po/gettext-patches/0004-Use-SHELL-rather-than-bin-sh.patch
|
||||||
|
|
||||||
|
EXTRA_DIST += po/POTFILES-shell.in
|
||||||
|
EXTRA_DIST += po/README
|
||||||
|
EXTRA_DIST += po/Rules-translit
|
||||||
|
EXTRA_DIST += po/Rules-windowsdir
|
||||||
|
EXTRA_DIST += po/arabic.sed
|
||||||
|
EXTRA_DIST += po/cyrillic.sed
|
||||||
|
EXTRA_DIST += po/greek.sed
|
||||||
|
EXTRA_DIST += po/grub.d.sed
|
||||||
|
EXTRA_DIST += po/hebrew.sed
|
||||||
|
|
||||||
EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz
|
EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz
|
||||||
EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz
|
EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz
|
||||||
|
|
||||||
|
|
228
configure.ac
228
configure.ac
|
@ -26,12 +26,15 @@ dnl This is necessary because the target type in autoconf does not
|
||||||
dnl describe such a system very well.
|
dnl describe such a system very well.
|
||||||
dnl
|
dnl
|
||||||
dnl The current strategy is to use variables with no prefix (such as
|
dnl The current strategy is to use variables with no prefix (such as
|
||||||
dnl CC, CFLAGS, etc.) for the host type, variables with prefix "BUILD_"
|
dnl CC, CFLAGS, etc.) for the host and target type, variables with
|
||||||
dnl (such as BUILD_CC, BUILD_CFLAGS, etc.) for the build type and variables
|
dnl prefix "BUILD_" (such as BUILD_CC, BUILD_CFLAGS, etc.) for the
|
||||||
dnl with the prefix "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are
|
dnl build type, variables with prefix "HOST_" (such as HOST_CC,
|
||||||
dnl used for the target type. See INSTALL for full list of variables.
|
dnl HOST_CFLAGS, etc.) for the host type and variables with the prefix
|
||||||
|
dnl "TARGET_" (such as TARGET_CC, TARGET_CFLAGS, etc.) are used for
|
||||||
|
dnl the target type. See INSTALL for full list of variables and
|
||||||
|
dnl description of the relationships between them.
|
||||||
|
|
||||||
AC_INIT([GRUB],[2.02],[bug-grub@gnu.org])
|
AC_INIT([GRUB],[2.05],[bug-grub@gnu.org])
|
||||||
|
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
|
||||||
|
@ -45,11 +48,15 @@ save_program_prefix="${program_prefix}"
|
||||||
AC_CANONICAL_TARGET
|
AC_CANONICAL_TARGET
|
||||||
program_prefix="${save_program_prefix}"
|
program_prefix="${save_program_prefix}"
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.10.1])
|
AM_INIT_AUTOMAKE([1.11])
|
||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.63)
|
||||||
AC_CONFIG_SRCDIR([include/grub/dl.h])
|
AC_CONFIG_SRCDIR([include/grub/dl.h])
|
||||||
AC_CONFIG_HEADER([config-util.h])
|
AC_CONFIG_HEADER([config-util.h])
|
||||||
|
|
||||||
|
# Explicitly check for pkg-config early on, since otherwise conditional
|
||||||
|
# calls are problematic.
|
||||||
|
PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
# Program name transformations
|
# Program name transformations
|
||||||
AC_ARG_PROGRAM
|
AC_ARG_PROGRAM
|
||||||
grub_TRANSFORM([grub-bios-setup])
|
grub_TRANSFORM([grub-bios-setup])
|
||||||
|
@ -73,9 +80,15 @@ grub_TRANSFORM([grub-file])
|
||||||
|
|
||||||
# Optimization flag. Allow user to override.
|
# Optimization flag. Allow user to override.
|
||||||
if test "x$TARGET_CFLAGS" = x; then
|
if test "x$TARGET_CFLAGS" = x; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -Os"
|
TARGET_CFLAGS=-Os
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Enable support for "restrict" keyword and other
|
||||||
|
# features from gnu99 C language standard.
|
||||||
|
BUILD_CFLAGS="-std=gnu99 $BUILD_CFLAGS"
|
||||||
|
HOST_CFLAGS="-std=gnu99 $HOST_CFLAGS"
|
||||||
|
TARGET_CFLAGS="-std=gnu99 $TARGET_CFLAGS"
|
||||||
|
|
||||||
# Default HOST_CPPFLAGS
|
# Default HOST_CPPFLAGS
|
||||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W"
|
HOST_CPPFLAGS="$HOST_CPPFLAGS -Wall -W"
|
||||||
HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1"
|
HOST_CPPFLAGS="$HOST_CPPFLAGS -DGRUB_UTIL=1"
|
||||||
|
@ -100,6 +113,12 @@ case "$target_cpu" in
|
||||||
aarch64*)
|
aarch64*)
|
||||||
target_cpu=arm64
|
target_cpu=arm64
|
||||||
;;
|
;;
|
||||||
|
riscv32*)
|
||||||
|
target_cpu=riscv32
|
||||||
|
;;
|
||||||
|
riscv64*)
|
||||||
|
target_cpu=riscv64
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Specify the platform (such as firmware).
|
# Specify the platform (such as firmware).
|
||||||
|
@ -123,6 +142,8 @@ if test "x$with_platform" = x; then
|
||||||
ia64-*) platform=efi ;;
|
ia64-*) platform=efi ;;
|
||||||
arm-*) platform=uboot ;;
|
arm-*) platform=uboot ;;
|
||||||
arm64-*) platform=efi ;;
|
arm64-*) platform=efi ;;
|
||||||
|
riscv32-*) platform=efi ;;
|
||||||
|
riscv64-*) platform=efi ;;
|
||||||
*)
|
*)
|
||||||
AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities])
|
AC_MSG_WARN([unsupported CPU: "$target_cpu" - only building utilities])
|
||||||
platform=none
|
platform=none
|
||||||
|
@ -147,6 +168,7 @@ case "$target_cpu"-"$platform" in
|
||||||
i386-efi) ;;
|
i386-efi) ;;
|
||||||
x86_64-efi) ;;
|
x86_64-efi) ;;
|
||||||
i386-xen) ;;
|
i386-xen) ;;
|
||||||
|
i386-xen_pvh) ;;
|
||||||
x86_64-xen) ;;
|
x86_64-xen) ;;
|
||||||
i386-pc) ;;
|
i386-pc) ;;
|
||||||
i386-multiboot) ;;
|
i386-multiboot) ;;
|
||||||
|
@ -167,8 +189,11 @@ case "$target_cpu"-"$platform" in
|
||||||
mipsel-fuloong) platform=loongson ;;
|
mipsel-fuloong) platform=loongson ;;
|
||||||
mipsel-loongson) ;;
|
mipsel-loongson) ;;
|
||||||
arm-uboot) ;;
|
arm-uboot) ;;
|
||||||
|
arm-coreboot) ;;
|
||||||
arm-efi) ;;
|
arm-efi) ;;
|
||||||
arm64-efi) ;;
|
arm64-efi) ;;
|
||||||
|
riscv32-efi) ;;
|
||||||
|
riscv64-efi) ;;
|
||||||
*-emu) ;;
|
*-emu) ;;
|
||||||
*-none) ;;
|
*-none) ;;
|
||||||
*) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
|
*) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
|
||||||
|
@ -203,7 +228,8 @@ case "$host_os" in
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
cygwin | windows* | mingw32*) have_exec=n ;;
|
cygwin) have_exec=y ;;
|
||||||
|
windows* | mingw32*) have_exec=n ;;
|
||||||
aros*) have_exec=n ;;
|
aros*) have_exec=n ;;
|
||||||
*) have_exec=y;;
|
*) have_exec=y;;
|
||||||
esac
|
esac
|
||||||
|
@ -213,6 +239,7 @@ case "$platform" in
|
||||||
multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
|
multiboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_MULTIBOOT=1" ;;
|
||||||
efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
|
efi) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_EFI=1" ;;
|
||||||
xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
|
xen) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN=1" ;;
|
||||||
|
xen_pvh) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_XEN_PVH=1" ;;
|
||||||
ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
|
ieee1275) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_IEEE1275=1" ;;
|
||||||
uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
|
uboot) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_UBOOT=1" ;;
|
||||||
qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
|
qemu) machine_CPPFLAGS="$machine_CPPFLAGS -DGRUB_MACHINE_QEMU=1" ;;
|
||||||
|
@ -275,7 +302,7 @@ fi
|
||||||
|
|
||||||
AC_SUBST(bootdirname)
|
AC_SUBST(bootdirname)
|
||||||
AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname",
|
AC_DEFINE_UNQUOTED(GRUB_BOOT_DIR_NAME, "$bootdirname",
|
||||||
[Default boot directory name]")
|
[Default boot directory name])
|
||||||
|
|
||||||
AC_ARG_WITH([grubdir],
|
AC_ARG_WITH([grubdir],
|
||||||
AS_HELP_STRING([--with-grubdir=DIR],
|
AS_HELP_STRING([--with-grubdir=DIR],
|
||||||
|
@ -335,6 +362,7 @@ gl_EARLY
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AM_PROG_CC_C_O
|
AM_PROG_CC_C_O
|
||||||
AM_PROG_AS
|
AM_PROG_AS
|
||||||
|
AM_PATH_PYTHON([2.6])
|
||||||
|
|
||||||
# Must be GCC.
|
# Must be GCC.
|
||||||
test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required])
|
test "x$GCC" = xyes || AC_MSG_ERROR([GCC is required])
|
||||||
|
@ -343,6 +371,7 @@ AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no)
|
||||||
|
|
||||||
AC_GNU_SOURCE
|
AC_GNU_SOURCE
|
||||||
AM_GNU_GETTEXT([external])
|
AM_GNU_GETTEXT([external])
|
||||||
|
AM_GNU_GETTEXT_VERSION([0.18.3])
|
||||||
AC_SYS_LARGEFILE
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
# Identify characteristics of the host architecture.
|
# Identify characteristics of the host architecture.
|
||||||
|
@ -373,7 +402,10 @@ case "$host_os" in
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
AC_CHECK_SIZEOF(off_t)
|
AC_CHECK_SIZEOF(off_t)
|
||||||
test x"$ac_cv_sizeof_off_t" = x8 || AC_MSG_ERROR([Large file support is required]);;
|
if test x"$ac_cv_sizeof_off_t" != x8 ; then
|
||||||
|
AC_CHECK_SIZEOF(off64_t)
|
||||||
|
test x"$ac_cv_sizeof_off64_t" = x8 || AC_MSG_ERROR([Large file support is required])
|
||||||
|
fi;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if test x$USE_NLS = xno; then
|
if test x$USE_NLS = xno; then
|
||||||
|
@ -456,6 +488,16 @@ case "$build_os" in
|
||||||
esac
|
esac
|
||||||
AC_SUBST(BUILD_EXEEXT)
|
AC_SUBST(BUILD_EXEEXT)
|
||||||
|
|
||||||
|
# In some build environments like termux /bin/sh is not a valid
|
||||||
|
# shebang. Use $SHELL instead if it's executable and /bin/sh isn't
|
||||||
|
BUILD_SHEBANG=/bin/sh
|
||||||
|
for she in /bin/sh "$SHELL"; do
|
||||||
|
if test -x "$she" ; then
|
||||||
|
BUILD_SHEBANG="$she"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
AC_SUBST(BUILD_SHEBANG)
|
||||||
|
|
||||||
# For gnulib.
|
# For gnulib.
|
||||||
gl_INIT
|
gl_INIT
|
||||||
|
|
||||||
|
@ -529,6 +571,24 @@ CPPFLAGS="$TARGET_CPPFLAGS"
|
||||||
LDFLAGS="$TARGET_LDFLAGS"
|
LDFLAGS="$TARGET_LDFLAGS"
|
||||||
LIBS=""
|
LIBS=""
|
||||||
|
|
||||||
|
if test "x$target_m32" = x1; then
|
||||||
|
# Force 32-bit mode.
|
||||||
|
TARGET_CFLAGS="$TARGET_CFLAGS -m32"
|
||||||
|
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
|
||||||
|
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
|
||||||
|
TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
|
||||||
|
TARGET_MODULE_FORMAT="elf32"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$target_m64" = x1; then
|
||||||
|
# Force 64-bit mode.
|
||||||
|
TARGET_CFLAGS="$TARGET_CFLAGS -m64"
|
||||||
|
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
|
||||||
|
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
|
||||||
|
TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
|
||||||
|
TARGET_MODULE_FORMAT="elf64"
|
||||||
|
fi
|
||||||
|
|
||||||
# debug flags.
|
# debug flags.
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations"
|
TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations"
|
||||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g"
|
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g"
|
||||||
|
@ -717,24 +777,6 @@ if test "x$target_cpu" = xi386 && test "x$platform" != xemu; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
|
TARGET_CFLAGS="$TARGET_CFLAGS -march=i386"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$target_m32" = x1; then
|
|
||||||
# Force 32-bit mode.
|
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -m32"
|
|
||||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m32"
|
|
||||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m32"
|
|
||||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -m32"
|
|
||||||
TARGET_MODULE_FORMAT="elf32"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$target_m64" = x1; then
|
|
||||||
# Force 64-bit mode.
|
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -m64"
|
|
||||||
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -m64"
|
|
||||||
TARGET_CPPFLAGS="$TARGET_CPPFLAGS -m64"
|
|
||||||
TARGET_LDFLAGS="$TARGET_LDFLAGS -m64"
|
|
||||||
TARGET_MODULE_FORMAT="elf64"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then
|
if test "x$grub_cv_cc_target_clang" = xno && test "x$target_cpu" = xi386 && test "x$platform" != xemu && test "x$platform" != xefi; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
|
TARGET_CFLAGS="$TARGET_CFLAGS -mrtd -mregparm=3"
|
||||||
fi
|
fi
|
||||||
|
@ -806,11 +848,26 @@ if test x"$platform" != xemu ; then
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
[grub_cv_target_cc_soft_float="-mgeneral-regs-only"], [])
|
[grub_cv_target_cc_soft_float="-mgeneral-regs-only"], [])
|
||||||
fi
|
fi
|
||||||
|
if test "x$target_cpu" = xriscv32; then
|
||||||
|
CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
[grub_cv_target_cc_soft_float="-march=rv32imac -mabi=ilp32"], [])
|
||||||
|
fi
|
||||||
|
if test "x$target_cpu" = xriscv64; then
|
||||||
|
CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
[grub_cv_target_cc_soft_float="-march=rv64imac -mabi=lp64"], [])
|
||||||
|
fi
|
||||||
if test "x$target_cpu" = xia64; then
|
if test "x$target_cpu" = xia64; then
|
||||||
CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
|
CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt -Werror"
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
[grub_cv_target_cc_soft_float="-mno-inline-float-divide -mno-inline-sqrt"], [])
|
[grub_cv_target_cc_soft_float="-mno-inline-float-divide -mno-inline-sqrt"], [])
|
||||||
fi
|
fi
|
||||||
|
if test "x$target_cpu" = xsh4; then
|
||||||
|
CFLAGS="$TARGET_CFLAGS -m4-nofpu -Werror"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
[grub_cv_target_cc_soft_float="-m4-nofpu"], [])
|
||||||
|
fi
|
||||||
for cand in "-msoft-float -Xclang -msoft-float -Xclang -no-implicit-float" \
|
for cand in "-msoft-float -Xclang -msoft-float -Xclang -no-implicit-float" \
|
||||||
"-Xclang -msoft-float -Xclang -no-implicit-float" \
|
"-Xclang -msoft-float -Xclang -no-implicit-float" \
|
||||||
"-Xclang -msoft-float" "-msoft-float"; do
|
"-Xclang -msoft-float" "-msoft-float"; do
|
||||||
|
@ -956,6 +1013,17 @@ if test "x$grub_cv_cc_fno_unwind_tables" = xyes; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-unwind-tables"
|
TARGET_CFLAGS="$TARGET_CFLAGS -fno-unwind-tables"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Do not generate .ident sections.
|
||||||
|
AC_CACHE_CHECK([whether -fno-ident works], [grub_cv_cc_fno_ident], [
|
||||||
|
CFLAGS="$TARGET_CFLAGS -fno-ident"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
|
[grub_cv_cc_fno_ident=yes],
|
||||||
|
[grub_cv_cc_fno_ident=no])
|
||||||
|
])
|
||||||
|
|
||||||
|
if test "x$grub_cv_cc_fno_ident" = xyes; then
|
||||||
|
TARGET_CFLAGS="$TARGET_CFLAGS -fno-ident"
|
||||||
|
fi
|
||||||
|
|
||||||
CFLAGS="$TARGET_CFLAGS"
|
CFLAGS="$TARGET_CFLAGS"
|
||||||
|
|
||||||
|
@ -1121,7 +1189,7 @@ AC_SUBST(TARGET_LDFLAGS_OLDMAGIC)
|
||||||
|
|
||||||
LDFLAGS="$TARGET_LDFLAGS"
|
LDFLAGS="$TARGET_LDFLAGS"
|
||||||
|
|
||||||
if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 ; then
|
if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64 ; then
|
||||||
# Use large model to support 4G memory
|
# Use large model to support 4G memory
|
||||||
AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
|
AC_CACHE_CHECK([whether option -mcmodel=large works], grub_cv_cc_mcmodel, [
|
||||||
CFLAGS="$TARGET_CFLAGS -mcmodel=large"
|
CFLAGS="$TARGET_CFLAGS -mcmodel=large"
|
||||||
|
@ -1131,7 +1199,7 @@ if test "$target_cpu" = x86_64 || test "$target_cpu" = sparc64 ; then
|
||||||
])
|
])
|
||||||
if test "x$grub_cv_cc_mcmodel" = xyes; then
|
if test "x$grub_cv_cc_mcmodel" = xyes; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
|
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=large"
|
||||||
elif test "$target_cpu" = sparc64; then
|
elif test "$target_cpu" = sparc64 || test "$target_cpu" = riscv64; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
|
TARGET_CFLAGS="$TARGET_CFLAGS -mcmodel=medany"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -1155,7 +1223,8 @@ if test "x$target_cpu" = xarm; then
|
||||||
AC_CACHE_CHECK([for options to disable movt and movw], grub_cv_target_cc_mno_movt, [
|
AC_CACHE_CHECK([for options to disable movt and movw], grub_cv_target_cc_mno_movt, [
|
||||||
grub_cv_target_cc_mno_movt=no
|
grub_cv_target_cc_mno_movt=no
|
||||||
for cand in "-mno-movt" \
|
for cand in "-mno-movt" \
|
||||||
"-mllvm -arm-use-movt=0"; do
|
"-mllvm -arm-use-movt=0" \
|
||||||
|
"-mword-relocations"; do
|
||||||
if test x"$grub_cv_target_cc_mno_movt" != xno ; then
|
if test x"$grub_cv_target_cc_mno_movt" != xno ; then
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
@ -1185,12 +1254,12 @@ if test "x$target_cpu" = xarm; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
|
AC_CACHE_CHECK([whether option -Qn works], grub_cv_target_cc_qn, [
|
||||||
CFLAGS="$TARGET_CFLAGS -Qn -Werror"
|
CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments -Werror"
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
|
||||||
[grub_cv_target_cc_qn=yes],
|
[grub_cv_target_cc_qn=yes],
|
||||||
[grub_cv_target_cc_qn=no])])
|
[grub_cv_target_cc_qn=no])])
|
||||||
if test "x$grub_cv_target_cc_qn" = xyes; then
|
if test "x$grub_cv_target_cc_qn" = xyes; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -Qn"
|
TARGET_CFLAGS="$TARGET_CFLAGS -Qn -Qunused-arguments"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1208,6 +1277,7 @@ grub_CHECK_LINK_PIE
|
||||||
# `-fPIE' or '-fpie' and '-pie' in the default specs.
|
# `-fPIE' or '-fpie' and '-pie' in the default specs.
|
||||||
if [ x"$pie_possible" = xyes ]; then
|
if [ x"$pie_possible" = xyes ]; then
|
||||||
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE -fno-pie"
|
TARGET_CFLAGS="$TARGET_CFLAGS -fno-PIE -fno-pie"
|
||||||
|
TARGET_CCASFLAGS="$TARGET_CCASFLAGS -fno-PIE -fno-pie"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ x"$link_nopie_needed" = xyes ] || [ x"$pie_possible" = xyes ]; then
|
if [ x"$link_nopie_needed" = xyes ] || [ x"$pie_possible" = xyes ]; then
|
||||||
|
@ -1315,7 +1385,7 @@ fi
|
||||||
|
|
||||||
# Check for libgcc symbols
|
# Check for libgcc symbols
|
||||||
if test x"$platform" = xemu; then
|
if test x"$platform" = xemu; then
|
||||||
AC_CHECK_FUNCS(__udivsi3 __umodsi3 __divsi3 __modsi3 __divdi3 __moddi3 __udivdi3 __umoddi3 __ctzdi2 __ctzsi2 __aeabi_uidiv __aeabi_uidivmod __aeabi_idiv __aeabi_idivmod __aeabi_ulcmp __muldi3 __aeabi_lmul __aeabi_memcpy __aeabi_memcpy4 __aeabi_memcpy8 __aeabi_memclr __aeabi_memclr4 __aeabi_memclr8 __aeabi_memset __aeabi_lasr __aeabi_llsl __aeabi_llsr _restgpr_14_x __ucmpdi2 __ashldi3 __ashrdi3 __lshrdi3 __bswapsi2 __bswapdi2 __bzero __register_frame_info __deregister_frame_info ___chkstk_ms __chkstk_ms)
|
AC_CHECK_FUNCS(__udivsi3 __umodsi3 __divsi3 __modsi3 __divdi3 __moddi3 __udivdi3 __umoddi3 __ctzdi2 __ctzsi2 __clzdi2 __aeabi_uidiv __aeabi_uidivmod __aeabi_idiv __aeabi_idivmod __aeabi_ulcmp __muldi3 __aeabi_lmul __aeabi_memcpy __aeabi_memcpy4 __aeabi_memcpy8 __aeabi_memclr __aeabi_memclr4 __aeabi_memclr8 __aeabi_memset __aeabi_lasr __aeabi_llsl __aeabi_llsr _restgpr_14_x __ucmpdi2 __ashldi3 __ashrdi3 __lshrdi3 __bswapsi2 __bswapdi2 __bzero __register_frame_info __deregister_frame_info ___chkstk_ms __chkstk_ms)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$TARGET_APPLE_LINKER" = x1 ; then
|
if test "x$TARGET_APPLE_LINKER" = x1 ; then
|
||||||
|
@ -1352,7 +1422,7 @@ AC_SUBST(TARGET_NMFLAGS_DEFINED_ONLY)
|
||||||
if test "$platform" != emu; then
|
if test "$platform" != emu; then
|
||||||
AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
|
AC_CACHE_CHECK([whether -nostdinc -isystem works], [grub_cv_cc_isystem], [
|
||||||
SAVED_CPPFLAGS="$CPPFLAGS"
|
SAVED_CPPFLAGS="$CPPFLAGS"
|
||||||
CPPFLAGS="$TARGET_CPPFLAGS -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
|
CPPFLAGS="$TARGET_CPPFLAGS -nostdlib -nostdinc -isystem `$TARGET_CC -print-file-name=include`"
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
int va_arg_func (int fixed, va_list args);]], [[]])],
|
int va_arg_func (int fixed, va_list args);]], [[]])],
|
||||||
|
@ -1392,9 +1462,11 @@ LIBS="$tmp_LIBS"
|
||||||
# Memory manager debugging.
|
# Memory manager debugging.
|
||||||
AC_ARG_ENABLE([mm-debug],
|
AC_ARG_ENABLE([mm-debug],
|
||||||
AS_HELP_STRING([--enable-mm-debug],
|
AS_HELP_STRING([--enable-mm-debug],
|
||||||
[include memory manager debugging]),
|
[include memory manager debugging]))
|
||||||
[AC_DEFINE([MM_DEBUG], [1],
|
if test x$enable_mm_debug = xyes; then
|
||||||
[Define to 1 if you enable memory manager debugging.])])
|
AC_DEFINE([MM_DEBUG], [1],
|
||||||
|
[Define to 1 if you enable memory manager debugging.])
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE([cache-stats],
|
AC_ARG_ENABLE([cache-stats],
|
||||||
AS_HELP_STRING([--enable-cache-stats],
|
AS_HELP_STRING([--enable-cache-stats],
|
||||||
|
@ -1493,29 +1565,22 @@ if test x"$enable_grub_mkfont" = xno ; then
|
||||||
grub_mkfont_excuse="explicitly disabled"
|
grub_mkfont_excuse="explicitly disabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test x"$grub_mkfont_excuse" = x ; then
|
|
||||||
# Check for freetype libraries.
|
|
||||||
AC_CHECK_TOOLS([FREETYPE], [freetype-config])
|
|
||||||
if test "x$FREETYPE" = x ; then
|
|
||||||
grub_mkfont_excuse=["need freetype2 library"]
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
unset ac_cv_header_ft2build_h
|
unset ac_cv_header_ft2build_h
|
||||||
|
|
||||||
if test x"$grub_mkfont_excuse" = x ; then
|
if test x"$grub_mkfont_excuse" = x ; then
|
||||||
# Check for freetype libraries.
|
# Check for freetype libraries.
|
||||||
freetype_cflags=`$FREETYPE --cflags`
|
PKG_CHECK_MODULES([FREETYPE], [freetype2], [
|
||||||
freetype_libs=`$FREETYPE --libs`
|
SAVED_CPPFLAGS="$CPPFLAGS"
|
||||||
SAVED_CPPFLAGS="$CPPFLAGS"
|
SAVED_LIBS="$LIBS"
|
||||||
SAVED_LIBS="$LIBS"
|
CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS"
|
||||||
CPPFLAGS="$CPPFLAGS $freetype_cflags"
|
LIBS="$LIBS $FREETYPE_LIBS"
|
||||||
LIBS="$LIBS $freetype_libs"
|
AC_CHECK_HEADERS([ft2build.h], [],
|
||||||
AC_CHECK_HEADERS([ft2build.h], [],
|
[grub_mkfont_excuse=["need freetype2 headers"]])
|
||||||
[grub_mkfont_excuse=["need freetype2 headers"]])
|
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [],
|
||||||
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_mkfont_excuse=["freetype2 library unusable"]])
|
[grub_mkfont_excuse=["freetype2 library unusable"]])
|
||||||
CPPFLAGS="$SAVED_CPPFLAGS"
|
CPPFLAGS="$SAVED_CPPFLAGS"
|
||||||
LIBS="$SAVED_LIBS"
|
LIBS="$SAVED_LIBS"
|
||||||
|
], [grub_mkfont_excuse=["need freetype2 library"]])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
|
if test x"$enable_grub_mkfont" = xyes && test x"$grub_mkfont_excuse" != x ; then
|
||||||
|
@ -1527,8 +1592,6 @@ else
|
||||||
enable_grub_mkfont=no
|
enable_grub_mkfont=no
|
||||||
fi
|
fi
|
||||||
AC_SUBST([enable_grub_mkfont])
|
AC_SUBST([enable_grub_mkfont])
|
||||||
AC_SUBST([freetype_cflags])
|
|
||||||
AC_SUBST([freetype_libs])
|
|
||||||
|
|
||||||
SAVED_CC="$CC"
|
SAVED_CC="$CC"
|
||||||
SAVED_CPP="$CPP"
|
SAVED_CPP="$CPP"
|
||||||
|
@ -1558,25 +1621,21 @@ AC_SUBST([BUILD_WORDS_BIGENDIAN])
|
||||||
|
|
||||||
if test x"$grub_build_mkfont_excuse" = x ; then
|
if test x"$grub_build_mkfont_excuse" = x ; then
|
||||||
# Check for freetype libraries.
|
# Check for freetype libraries.
|
||||||
AC_CHECK_PROGS([BUILD_FREETYPE], [freetype-config])
|
SAVED_PKG_CONFIG="$PKG_CONFIG"
|
||||||
if test "x$BUILD_FREETYPE" = x ; then
|
test -z "$BUILD_PKG_CONFIG" || PKG_CONFIG="$BUILD_PKG_CONFIG"
|
||||||
grub_build_mkfont_excuse=["need freetype2 library"]
|
PKG_CHECK_MODULES([BUILD_FREETYPE], [freetype2], [
|
||||||
fi
|
SAVED_CPPFLAGS_2="$CPPFLAGS"
|
||||||
fi
|
SAVED_LIBS="$LIBS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $BUILD_FREETYPE_CFLAGS"
|
||||||
if test x"$grub_build_mkfont_excuse" = x ; then
|
LIBS="$LIBS $BUILD_FREETYPE_LIBS"
|
||||||
# Check for freetype libraries.
|
AC_CHECK_HEADERS([ft2build.h], [],
|
||||||
build_freetype_cflags=`$BUILD_FREETYPE --cflags`
|
[grub_build_mkfont_excuse=["need freetype2 headers"]])
|
||||||
build_freetype_libs=`$BUILD_FREETYPE --libs`
|
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [],
|
||||||
SAVED_CPPFLAGS_2="$CPPFLAGS"
|
[grub_build_mkfont_excuse=["freetype2 library unusable"]])
|
||||||
SAVED_LIBS="$LIBS"
|
LIBS="$SAVED_LIBS"
|
||||||
CPPFLAGS="$CPPFLAGS $build_freetype_cflags"
|
CPPFLAGS="$SAVED_CPPFLAGS_2"
|
||||||
LIBS="$LIBS $build_freetype_libs"
|
], [grub_build_mkfont_excuse=["need freetype2 library"]])
|
||||||
AC_CHECK_HEADERS([ft2build.h], [],
|
PKG_CONFIG="$SAVED_PKG_CONFIG"
|
||||||
[grub_build_mkfont_excuse=["need freetype2 headers"]])
|
|
||||||
AC_LINK_IFELSE([AC_LANG_CALL([], [FT_Load_Glyph])], [], [grub_build_mkfont_excuse=["freetype2 library unusable"]])
|
|
||||||
LIBS="$SAVED_LIBS"
|
|
||||||
CPPFLAGS="$SAVED_CPPFLAGS_2"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
|
if test x"$enable_build_grub_mkfont" = xyes && test x"$grub_build_mkfont_excuse" != x ; then
|
||||||
|
@ -1595,9 +1654,6 @@ if test x"$enable_build_grub_mkfont" = xno && ( test "x$platform" = xqemu || tes
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_SUBST([build_freetype_cflags])
|
|
||||||
AC_SUBST([build_freetype_libs])
|
|
||||||
|
|
||||||
CC="$SAVED_CC"
|
CC="$SAVED_CC"
|
||||||
CPP="$SAVED_CPP"
|
CPP="$SAVED_CPP"
|
||||||
CFLAGS="$SAVED_CFLAGS"
|
CFLAGS="$SAVED_CFLAGS"
|
||||||
|
@ -1893,6 +1949,7 @@ AM_CONDITIONAL([COND_i386_coreboot], [test x$target_cpu = xi386 -a x$platform =
|
||||||
AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
|
AM_CONDITIONAL([COND_i386_multiboot], [test x$target_cpu = xi386 -a x$platform = xmultiboot])
|
||||||
AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
|
AM_CONDITIONAL([COND_x86_64_efi], [test x$target_cpu = xx86_64 -a x$platform = xefi])
|
||||||
AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
|
AM_CONDITIONAL([COND_i386_xen], [test x$target_cpu = xi386 -a x$platform = xxen])
|
||||||
|
AM_CONDITIONAL([COND_i386_xen_pvh], [test x$target_cpu = xi386 -a x$platform = xxen_pvh])
|
||||||
AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
|
AM_CONDITIONAL([COND_x86_64_xen], [test x$target_cpu = xx86_64 -a x$platform = xxen])
|
||||||
AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
|
AM_CONDITIONAL([COND_mips_loongson], [test x$target_cpu = xmipsel -a x$platform = xloongson])
|
||||||
AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips])
|
AM_CONDITIONAL([COND_mips_qemu_mips], [test "(" x$target_cpu = xmips -o x$target_cpu = xmipsel ")" -a x$platform = xqemu_mips])
|
||||||
|
@ -1905,9 +1962,14 @@ AM_CONDITIONAL([COND_mipsel], [test x$target_cpu = xmipsel])
|
||||||
AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips])
|
AM_CONDITIONAL([COND_mipseb], [test x$target_cpu = xmips])
|
||||||
AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ])
|
AM_CONDITIONAL([COND_arm], [test x$target_cpu = xarm ])
|
||||||
AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot])
|
AM_CONDITIONAL([COND_arm_uboot], [test x$target_cpu = xarm -a x$platform = xuboot])
|
||||||
|
AM_CONDITIONAL([COND_arm_coreboot], [test x$target_cpu = xarm -a x$platform = xcoreboot])
|
||||||
AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
|
AM_CONDITIONAL([COND_arm_efi], [test x$target_cpu = xarm -a x$platform = xefi])
|
||||||
AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
|
AM_CONDITIONAL([COND_arm64], [test x$target_cpu = xarm64 ])
|
||||||
AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
|
AM_CONDITIONAL([COND_arm64_efi], [test x$target_cpu = xarm64 -a x$platform = xefi])
|
||||||
|
AM_CONDITIONAL([COND_riscv32], [test x$target_cpu = xriscv32 ])
|
||||||
|
AM_CONDITIONAL([COND_riscv64], [test x$target_cpu = xriscv64 ])
|
||||||
|
AM_CONDITIONAL([COND_riscv32_efi], [test x$target_cpu = xriscv32 -a x$platform = xefi])
|
||||||
|
AM_CONDITIONAL([COND_riscv64_efi], [test x$target_cpu = xriscv64 -a x$platform = xefi])
|
||||||
|
|
||||||
AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
|
AM_CONDITIONAL([COND_HOST_HURD], [test x$host_kernel = xhurd])
|
||||||
AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
|
AM_CONDITIONAL([COND_HOST_LINUX], [test x$host_kernel = xlinux])
|
||||||
|
@ -1982,7 +2044,7 @@ fi
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile])
|
AC_CONFIG_FILES([Makefile])
|
||||||
AC_CONFIG_FILES([grub-core/Makefile])
|
AC_CONFIG_FILES([grub-core/Makefile])
|
||||||
AC_CONFIG_FILES([grub-core/gnulib/Makefile])
|
AC_CONFIG_FILES([grub-core/lib/gnulib/Makefile])
|
||||||
AC_CONFIG_FILES([po/Makefile.in])
|
AC_CONFIG_FILES([po/Makefile.in])
|
||||||
AC_CONFIG_FILES([docs/Makefile])
|
AC_CONFIG_FILES([docs/Makefile])
|
||||||
AC_CONFIG_FILES([util/bash-completion.d/Makefile])
|
AC_CONFIG_FILES([util/bash-completion.d/Makefile])
|
||||||
|
|
|
@ -77,6 +77,7 @@ This edition documents version @value{VERSION}.
|
||||||
* Coding style::
|
* Coding style::
|
||||||
* Finding your way around::
|
* Finding your way around::
|
||||||
* Contributing Changes::
|
* Contributing Changes::
|
||||||
|
* Updating External Code::
|
||||||
* Porting::
|
* Porting::
|
||||||
* Error Handling::
|
* Error Handling::
|
||||||
* Stack and heap size::
|
* Stack and heap size::
|
||||||
|
@ -84,6 +85,7 @@ This edition documents version @value{VERSION}.
|
||||||
* Video Subsystem::
|
* Video Subsystem::
|
||||||
* PFF2 Font File Format::
|
* PFF2 Font File Format::
|
||||||
* Graphical Menu Software Design::
|
* Graphical Menu Software Design::
|
||||||
|
* Verifiers framework::
|
||||||
* Copying This Manual:: Copying This Manual
|
* Copying This Manual:: Copying This Manual
|
||||||
* Index::
|
* Index::
|
||||||
@end menu
|
@end menu
|
||||||
|
@ -181,38 +183,44 @@ If a macro is global, its name must be prefixed with GRUB_ and must consist of o
|
||||||
@section Comments
|
@section Comments
|
||||||
|
|
||||||
All comments shall be C-style comments, of the form @samp{/* @dots{} */}.
|
All comments shall be C-style comments, of the form @samp{/* @dots{} */}.
|
||||||
|
A comment can be placed immediately preceding the entity it describes or it
|
||||||
Comments shall be placed only on a line by themselves. They shall not be placed together with code, variable declarations, or other non-comment entities. A comment should be placed immediately preceding the entity it describes.
|
can be placed together with code, variable declarations, or other non-comment
|
||||||
|
entities. However, it is recommended to not mix various forms especially in
|
||||||
|
types/structs descriptions.
|
||||||
|
|
||||||
Acceptable:
|
Acceptable:
|
||||||
@example
|
@example
|
||||||
/* The page # that is the front buffer. */
|
/* The page # that is the front buffer. */
|
||||||
int displayed_page;
|
int displayed_page;
|
||||||
/* The page # that is the back buffer. */
|
|
||||||
int render_page;
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Unacceptable:
|
|
||||||
@example
|
@example
|
||||||
int displayed_page; /* The page # that is the front buffer. */
|
int render_page; /* The page # that is the back buffer. */
|
||||||
int render_page; /* The page # that is the back buffer. */
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@node Multi-Line Comments
|
@node Multi-Line Comments
|
||||||
@section Multi-Line Comments
|
@section Multi-Line Comments
|
||||||
|
|
||||||
Comments spanning multiple lines shall be formatted with all lines after the first aligned with the first line.
|
Comments spanning multiple lines shall be formatted with all lines after the
|
||||||
|
first aligned with the first line. Asterisk characters should be repeated at
|
||||||
Asterisk characters should not be repeated a the start of each subsequent line.
|
the start of each subsequent line.
|
||||||
|
|
||||||
Acceptable:
|
Acceptable:
|
||||||
@example
|
@example
|
||||||
/* This is a comment
|
/*
|
||||||
which spans multiple lines.
|
* This is a comment
|
||||||
It is long. */
|
* which spans multiple lines.
|
||||||
|
* It is long.
|
||||||
|
*/
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Unacceptable:
|
Unacceptable:
|
||||||
|
@example
|
||||||
|
/* This is a comment
|
||||||
|
which spans multiple lines.
|
||||||
|
It is long. */
|
||||||
|
@end example
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/*
|
/*
|
||||||
* This is a comment
|
* This is a comment
|
||||||
|
@ -220,7 +228,16 @@ Unacceptable:
|
||||||
* It is long. */
|
* It is long. */
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
The opening @samp{/*} and closing @samp{*/} should be placed together on a line with text.
|
@example
|
||||||
|
/* This is a comment
|
||||||
|
* which spans multiple lines.
|
||||||
|
* It is long.
|
||||||
|
*/
|
||||||
|
@end example
|
||||||
|
|
||||||
|
In particular first unacceptable form makes comment difficult to distinguish
|
||||||
|
from the code itself. Especially if it contains the code snippets and/or is
|
||||||
|
long. So, its usage is disallowed.
|
||||||
|
|
||||||
@node Finding your way around
|
@node Finding your way around
|
||||||
@chapter Finding your way around
|
@chapter Finding your way around
|
||||||
|
@ -465,6 +482,106 @@ If your intention is to just get started, please do not submit a inclusion
|
||||||
request. Instead, please subscribe to the mailing list, and communicate first
|
request. Instead, please subscribe to the mailing list, and communicate first
|
||||||
(e.g. sending a patch, asking a question, commenting on another message...).
|
(e.g. sending a patch, asking a question, commenting on another message...).
|
||||||
|
|
||||||
|
@node Updating External Code
|
||||||
|
@chapter Updating external code
|
||||||
|
|
||||||
|
GRUB includes some code from other projects, and it is sometimes necessary
|
||||||
|
to update it.
|
||||||
|
|
||||||
|
@menu
|
||||||
|
* Gnulib::
|
||||||
|
* jsmn::
|
||||||
|
* minilzo::
|
||||||
|
@end menu
|
||||||
|
|
||||||
|
@node Gnulib
|
||||||
|
@section Gnulib
|
||||||
|
|
||||||
|
Gnulib is a source code library that provides basic functionality to
|
||||||
|
programs and libraries. Many software packages make use of Gnulib
|
||||||
|
to avoid reinventing the portability wheel.
|
||||||
|
|
||||||
|
GRUB imports Gnulib using its @command{bootstrap} utility, identifying a
|
||||||
|
particular Git commit in @file{bootstrap.conf}. To upgrade to a new Gnulib
|
||||||
|
commit, set @code{GNULIB_REVISION} in @file{bootstrap.conf} to the new commit
|
||||||
|
ID, then run @kbd{./bootstrap} and whatever else you need to make sure it
|
||||||
|
works. Check for changes to Gnulib's @file{NEWS} file between the old and new
|
||||||
|
commits; in some cases it will be necessary to adjust GRUB to match. You may
|
||||||
|
also need to update the patches in @file{grub-core/lib/gnulib-patches/}.
|
||||||
|
|
||||||
|
To add a new Gnulib module or remove one that is no longer needed, change
|
||||||
|
@code{gnulib_modules} in @file{bootstrap.conf}. Again, run @kbd{./bootstrap}
|
||||||
|
and whatever else you need to make sure it works.
|
||||||
|
|
||||||
|
Bootstrapping from an older distribution containing gettext version < 0.18.3,
|
||||||
|
will require a patch similar to this to be applied first before running the
|
||||||
|
@command{./bootstrap} utility:
|
||||||
|
|
||||||
|
@example
|
||||||
|
diff --git a/bootstrap.conf b/bootstrap.conf
|
||||||
|
index 988dda0..a3193a9 100644
|
||||||
|
--- a/bootstrap.conf
|
||||||
|
+++ b/bootstrap.conf
|
||||||
|
@@ -67,7 +67,7 @@ SKIP_PO=t
|
||||||
|
buildreq="\
|
||||||
|
autoconf 2.63
|
||||||
|
automake 1.11
|
||||||
|
-gettext 0.18.3
|
||||||
|
+gettext 0.17
|
||||||
|
git 1.5.5
|
||||||
|
tar -
|
||||||
|
"
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 08b518f..99f5b36 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -362,7 +362,7 @@ AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no)
|
||||||
|
|
||||||
|
AC_GNU_SOURCE
|
||||||
|
AM_GNU_GETTEXT([external])
|
||||||
|
-AM_GNU_GETTEXT_VERSION([0.18.3])
|
||||||
|
+AM_GNU_GETTEXT_VERSION([0.17])
|
||||||
|
AC_SYS_LARGEFILE
|
||||||
|
|
||||||
|
# Identify characteristics of the host architecture.
|
||||||
|
|
||||||
|
@end example
|
||||||
|
|
||||||
|
It will also be necessary to adjust the patches in
|
||||||
|
@file{po/gettext-patches/} to apply to an older version of gettext.
|
||||||
|
|
||||||
|
@node jsmn
|
||||||
|
@section jsmn
|
||||||
|
|
||||||
|
jsmn is a minimalistic JSON parser which is implemented in a single header file
|
||||||
|
@file{jsmn.h}. To import a different version of the jsmn parser, you may simply
|
||||||
|
download the @file{jsmn.h} header from the desired tag or commit to the target
|
||||||
|
directory:
|
||||||
|
|
||||||
|
@example
|
||||||
|
curl -L https://raw.githubusercontent.com/zserge/jsmn/v1.1.0/jsmn.h \
|
||||||
|
-o grub-core/lib/json/jsmn.h
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@node minilzo
|
||||||
|
@section minilzo
|
||||||
|
|
||||||
|
miniLZO is a very lightweight subset of the LZO library intended for easy
|
||||||
|
inclusion in other projects. It is generated automatically from the LZO
|
||||||
|
source code and contains the most important LZO functions.
|
||||||
|
|
||||||
|
To upgrade to a new version of the miniLZO library, download the release
|
||||||
|
tarball and copy the files into the target directory:
|
||||||
|
|
||||||
|
@example
|
||||||
|
curl -L -O http://www.oberhumer.com/opensource/lzo/download/minilzo-2.08.tar.gz
|
||||||
|
tar -zxf minilzo-2.08.tar.gz
|
||||||
|
rm minilzo-2.08/testmini.c
|
||||||
|
rm -r grub-core/lib/minilzo/*
|
||||||
|
cp minilzo-2.08/*.[hc] grub-core/lib/minilzo
|
||||||
|
rm -r minilzo-2.08*
|
||||||
|
@end example
|
||||||
|
|
||||||
@node Porting
|
@node Porting
|
||||||
@chapter Porting
|
@chapter Porting
|
||||||
|
|
||||||
|
@ -671,7 +788,7 @@ is already present and you'll need to make it follow the existant code paths
|
||||||
for your platform adding adjustments if necessary. When done compile:
|
for your platform adding adjustments if necessary. When done compile:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
./autogen.sh
|
./bootstrap
|
||||||
./configure --target=$cpu --with-platform=$platform TARGET_CC=.. OBJCOPY=... STRIP=...
|
./configure --target=$cpu --with-platform=$platform TARGET_CC=.. OBJCOPY=... STRIP=...
|
||||||
make > /dev/null
|
make > /dev/null
|
||||||
@end example
|
@end example
|
||||||
|
@ -1949,6 +2066,63 @@ the graphics mode that was in use before @code{grub_video_setup()} was called
|
||||||
might fix some of the problems.
|
might fix some of the problems.
|
||||||
|
|
||||||
|
|
||||||
|
@node Verifiers framework
|
||||||
|
@chapter Verifiers framework
|
||||||
|
|
||||||
|
To register your own verifier call @samp{grub_verifier_register} with a structure
|
||||||
|
pointing to your functions.
|
||||||
|
|
||||||
|
The interface is inspired by the hash interface with @samp{init}/@samp{write}/@samp{fini}.
|
||||||
|
|
||||||
|
There are essentially 2 ways of using it, hashing and whole-file verification.
|
||||||
|
|
||||||
|
With the hashing approach:
|
||||||
|
During @samp{init} you decide whether you want to check the given file and init context.
|
||||||
|
In @samp{write} you update your hashing state.
|
||||||
|
In @samp{fini} you check that the hash matches the expected value/passes some check/...
|
||||||
|
|
||||||
|
With whole-file verification:
|
||||||
|
During @samp{init} you decide whether you want to check the given file and init context.
|
||||||
|
In @samp{write} you verify the file and return an error if it fails.
|
||||||
|
You don't have @samp{fini}.
|
||||||
|
|
||||||
|
Additional @samp{verify_string} receives various strings like kernel parameters
|
||||||
|
to verify. Returning no error means successful verification and an error stops
|
||||||
|
the current action.
|
||||||
|
|
||||||
|
Detailed description of the API:
|
||||||
|
|
||||||
|
Every time a file is opened your @samp{init} function is called with file descriptor
|
||||||
|
and file type. Your function can have the following outcomes:
|
||||||
|
|
||||||
|
@itemize
|
||||||
|
|
||||||
|
@item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_DEFER_AUTH}.
|
||||||
|
In this case verification is deferred to other active verifiers. Verification
|
||||||
|
fails if nobody cares or selected verifier fails.
|
||||||
|
|
||||||
|
@item returning no error and setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION}.
|
||||||
|
In this case your verifier will not be called anymore and it is assumed to have
|
||||||
|
skipped verification.
|
||||||
|
|
||||||
|
@item returning no error and not setting @samp{*flags} to @samp{GRUB_VERIFY_FLAGS_SKIP_VERIFICATION}
|
||||||
|
In this case verification is done as described in the following section.
|
||||||
|
|
||||||
|
@item returning an error. Then opening of the file will fail due to failed verification.
|
||||||
|
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
In the third case your @samp{write} will be called with chunks of the file. If
|
||||||
|
you need the whole file in a single chunk then during @samp{init} set the bit
|
||||||
|
@samp{GRUB_VERIFY_FLAGS_SINGLE_CHUNK} in @samp{*flags}. During @samp{init} you
|
||||||
|
may set @samp{*context} if you need additional context. At every iteration you
|
||||||
|
may return an error and the file will be considered as having failed the
|
||||||
|
verification. If you return no error then verification continues.
|
||||||
|
|
||||||
|
Optionally at the end of the file @samp{fini}, if it exists, is called with just
|
||||||
|
the context. If you return no error during any of @samp{init}, @samp{write} and
|
||||||
|
@samp{fini} then the file is considered as having succeded verification.
|
||||||
|
|
||||||
@node Copying This Manual
|
@node Copying This Manual
|
||||||
@appendix Copying This Manual
|
@appendix Copying This Manual
|
||||||
|
|
||||||
|
|
554
docs/grub.texi
554
docs/grub.texi
|
@ -360,8 +360,9 @@ blocklist notation. The currently supported filesystem types are @dfn{Amiga
|
||||||
Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS},
|
Fast FileSystem (AFFS)}, @dfn{AtheOS fs}, @dfn{BeFS},
|
||||||
@dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo),
|
@dfn{BtrFS} (including raid0, raid1, raid10, gzip and lzo),
|
||||||
@dfn{cpio} (little- and big-endian bin, odc and newc variants),
|
@dfn{cpio} (little- and big-endian bin, odc and newc variants),
|
||||||
@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32}, @dfn{exFAT}, @dfn{HFS},
|
@dfn{Linux ext2/ext3/ext4}, @dfn{DOS FAT12/FAT16/FAT32},
|
||||||
@dfn{HFS+}, @dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files),
|
@dfn{exFAT}, @dfn{F2FS}, @dfn{HFS}, @dfn{HFS+},
|
||||||
|
@dfn{ISO9660} (including Joliet, Rock-ridge and multi-chunk files),
|
||||||
@dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2},
|
@dfn{JFS}, @dfn{Minix fs} (versions 1, 2 and 3), @dfn{nilfs2},
|
||||||
@dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS},
|
@dfn{NTFS} (including compression), @dfn{ReiserFS}, @dfn{ROMFS},
|
||||||
@dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF},
|
@dfn{Amiga Smart FileSystem (SFS)}, @dfn{Squash4}, @dfn{tar}, @dfn{UDF},
|
||||||
|
@ -893,6 +894,7 @@ magic.
|
||||||
@menu
|
@menu
|
||||||
* General boot methods:: How to boot OSes with GRUB generally
|
* General boot methods:: How to boot OSes with GRUB generally
|
||||||
* Loopback booting:: Notes on booting from loopbacks
|
* Loopback booting:: Notes on booting from loopbacks
|
||||||
|
* LVM cache booting:: Notes on booting from LVM cache logical volume
|
||||||
* OS-specific notes:: Notes on some operating systems
|
* OS-specific notes:: Notes on some operating systems
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
@ -990,6 +992,26 @@ way. Please consider alternative boot methods like copying all files
|
||||||
from the image to actual partition. Consult your OS documentation for
|
from the image to actual partition. Consult your OS documentation for
|
||||||
more details
|
more details
|
||||||
|
|
||||||
|
@node LVM cache booting
|
||||||
|
@section Booting from LVM cache logical volume
|
||||||
|
|
||||||
|
The LVM cache logical volume is the logical volume consisting of the original
|
||||||
|
and the cache pool logical volume. The original is usually on a larger and
|
||||||
|
slower storage device while the cache pool is on a smaller and faster one. The
|
||||||
|
performance of the original volume can be improved by storing the frequently
|
||||||
|
used data on the cache pool to utilize the greater performance of faster
|
||||||
|
device.
|
||||||
|
|
||||||
|
GRUB boots from LVM cache logical volume merely by reading it's original
|
||||||
|
logical volume so that dirty data in cache pool volume is disregarded. This is
|
||||||
|
not a problem for "writethrough" cache mode as it ensures that any data written
|
||||||
|
will be stored both on the cache and the origin LV. For the other cache mode
|
||||||
|
"writeback", which delays writing from the cache pool back to the origin LV to
|
||||||
|
boost performance, GRUB may fail to boot in the wake of accidental power outage
|
||||||
|
due to it's inability to assemble the cache device for reading the required
|
||||||
|
dirty data left behind. The situation will be improved after adding full
|
||||||
|
support to the LVM cache logical volume in the future.
|
||||||
|
|
||||||
@node OS-specific notes
|
@node OS-specific notes
|
||||||
@section Some caveats on OS-specific issues
|
@section Some caveats on OS-specific issues
|
||||||
|
|
||||||
|
@ -1092,12 +1114,6 @@ grub> @kbd{initrd16 /initrd}
|
||||||
Finally, run the command @command{boot} (@pxref{boot}).
|
Finally, run the command @command{boot} (@pxref{boot}).
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
@strong{Caution:} If you use an initrd and specify the @samp{mem=}
|
|
||||||
option to the kernel to let it use less than actual memory size, you
|
|
||||||
will also have to specify the same memory size to GRUB. To let GRUB know
|
|
||||||
the size, run the command @command{uppermem} @emph{before} loading the
|
|
||||||
kernel. @xref{uppermem}, for more information.
|
|
||||||
|
|
||||||
|
|
||||||
@node NetBSD
|
@node NetBSD
|
||||||
@subsection NetBSD
|
@subsection NetBSD
|
||||||
|
@ -1213,10 +1229,11 @@ GRUB is configured using @file{grub.cfg}, usually located under
|
||||||
need to write the whole thing by hand.
|
need to write the whole thing by hand.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Simple configuration:: Recommended for most users
|
* Simple configuration:: Recommended for most users
|
||||||
* Shell-like scripting:: For power users and developers
|
* Root Identifcation Heuristics:: Summary on how the root file system is identified.
|
||||||
* Multi-boot manual config:: For non-standard multi-OS scenarios
|
* Shell-like scripting:: For power users and developers
|
||||||
* Embedded configuration:: Embedding a configuration file into GRUB
|
* Multi-boot manual config:: For non-standard multi-OS scenarios
|
||||||
|
* Embedded configuration:: Embedding a configuration file into GRUB
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@ -1307,12 +1324,12 @@ menu and then wait for the timeout set by @samp{GRUB_TIMEOUT} to expire
|
||||||
before booting the default entry. Pressing a key interrupts the timeout.
|
before booting the default entry. Pressing a key interrupts the timeout.
|
||||||
|
|
||||||
If this option is set to @samp{countdown} or @samp{hidden}, then, before
|
If this option is set to @samp{countdown} or @samp{hidden}, then, before
|
||||||
displaying the menu, GRUB will wait for the timeout set by
|
displaying the menu, GRUB will wait for the timeout set by @samp{GRUB_TIMEOUT}
|
||||||
@samp{GRUB_TIMEOUT} to expire. If @key{ESC} is pressed during that time, it
|
to expire. If @key{ESC} or @key{F4} are pressed, or @key{SHIFT} is held down
|
||||||
will display the menu and wait for input. If a hotkey associated with a
|
during that time, it will display the menu and wait for input. If a hotkey
|
||||||
menu entry is pressed, it will boot the associated menu entry immediately.
|
associated with a menu entry is pressed, it will boot the associated menu entry
|
||||||
If the timeout expires before either of these happens, it will boot the
|
immediately. If the timeout expires before either of these happens, it will
|
||||||
default entry. In the @samp{countdown} case, it will show a one-line
|
boot the default entry. In the @samp{countdown} case, it will show a one-line
|
||||||
indication of the remaining time.
|
indication of the remaining time.
|
||||||
|
|
||||||
@item GRUB_DEFAULT_BUTTON
|
@item GRUB_DEFAULT_BUTTON
|
||||||
|
@ -1398,6 +1415,25 @@ for all respectively normal entries.
|
||||||
The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
|
The values of these options replace the values of @samp{GRUB_CMDLINE_LINUX}
|
||||||
and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
|
and @samp{GRUB_CMDLINE_LINUX_DEFAULT} for Linux and Xen menu entries.
|
||||||
|
|
||||||
|
@item GRUB_EARLY_INITRD_LINUX_CUSTOM
|
||||||
|
@itemx GRUB_EARLY_INITRD_LINUX_STOCK
|
||||||
|
List of space-separated early initrd images to be loaded from @samp{/boot}.
|
||||||
|
This is for loading things like CPU microcode, firmware, ACPI tables, crypto
|
||||||
|
keys, and so on. These early images will be loaded in the order declared,
|
||||||
|
and all will be loaded before the actual functional initrd image.
|
||||||
|
|
||||||
|
@samp{GRUB_EARLY_INITRD_LINUX_STOCK} is for your distribution to declare
|
||||||
|
images that are provided by the distribution. It should not be modified
|
||||||
|
without understanding the consequences. They will be loaded first.
|
||||||
|
|
||||||
|
@samp{GRUB_EARLY_INITRD_LINUX_CUSTOM} is for your custom created images.
|
||||||
|
|
||||||
|
The default stock images are as follows, though they may be overridden by
|
||||||
|
your distribution:
|
||||||
|
@example
|
||||||
|
intel-uc.img intel-ucode.img amd-uc.img amd-ucode.img early_ucode.cpio microcode.cpio
|
||||||
|
@end example
|
||||||
|
|
||||||
@item GRUB_DISABLE_LINUX_UUID
|
@item GRUB_DISABLE_LINUX_UUID
|
||||||
Normally, @command{grub-mkconfig} will generate menu entries that use
|
Normally, @command{grub-mkconfig} will generate menu entries that use
|
||||||
universally-unique identifiers (UUIDs) to identify the root filesystem to
|
universally-unique identifiers (UUIDs) to identify the root filesystem to
|
||||||
|
@ -1405,10 +1441,30 @@ the Linux kernel, using a @samp{root=UUID=...} kernel parameter. This is
|
||||||
usually more reliable, but in some cases it may not be appropriate. To
|
usually more reliable, but in some cases it may not be appropriate. To
|
||||||
disable the use of UUIDs, set this option to @samp{true}.
|
disable the use of UUIDs, set this option to @samp{true}.
|
||||||
|
|
||||||
|
@item GRUB_DISABLE_LINUX_PARTUUID
|
||||||
|
If @command{grub-mkconfig} cannot identify the root filesystem via its
|
||||||
|
universally-unique indentifier (UUID), @command{grub-mkconfig} can use the UUID
|
||||||
|
of the partition containing the filesystem to identify the root filesystem to
|
||||||
|
the Linux kernel via a @samp{root=PARTUUID=...} kernel parameter. This is not
|
||||||
|
as reliable as using the filesystem UUID, but is more reliable than using the
|
||||||
|
Linux device names. When @samp{GRUB_DISABLE_LINUX_PARTUUID} is set to
|
||||||
|
@samp{false}, the Linux kernel version must be 2.6.37 (3.10 for systems using
|
||||||
|
the MSDOS partition scheme) or newer. This option defaults to @samp{true}. To
|
||||||
|
enable the use of partition UUIDs, set this option to @samp{false}.
|
||||||
|
|
||||||
@item GRUB_DISABLE_RECOVERY
|
@item GRUB_DISABLE_RECOVERY
|
||||||
If this option is set to @samp{true}, disable the generation of recovery
|
If this option is set to @samp{true}, disable the generation of recovery
|
||||||
mode menu entries.
|
mode menu entries.
|
||||||
|
|
||||||
|
@item GRUB_DISABLE_UUID
|
||||||
|
Normally, @command{grub-mkconfig} will generate menu entries that use
|
||||||
|
universally-unique identifiers (UUIDs) to identify various filesystems to
|
||||||
|
search for files. This is usually more reliable, but in some cases it may
|
||||||
|
not be appropriate. To disable this use of UUIDs, set this option to
|
||||||
|
@samp{true}. Setting this option to @samp{true}, will also set the options
|
||||||
|
@samp{GRUB_DISABLE_LINUX_UUID} and @samp{GRUB_DISABLE_LINUX_PARTUUID} to
|
||||||
|
@samp{true}, unless they have been explicilty set to @samp{false}.
|
||||||
|
|
||||||
@item GRUB_VIDEO_BACKEND
|
@item GRUB_VIDEO_BACKEND
|
||||||
If graphical video support is required, either because the @samp{gfxterm}
|
If graphical video support is required, either because the @samp{gfxterm}
|
||||||
graphical terminal is in use or because @samp{GRUB_GFXPAYLOAD_LINUX} is set,
|
graphical terminal is in use or because @samp{GRUB_GFXPAYLOAD_LINUX} is set,
|
||||||
|
@ -1463,7 +1519,7 @@ Normally, @command{grub-mkconfig} will generate top level menu entry for
|
||||||
the kernel with highest version number and put all other found kernels
|
the kernel with highest version number and put all other found kernels
|
||||||
or alternative menu entries for recovery mode in submenu. For entries returned
|
or alternative menu entries for recovery mode in submenu. For entries returned
|
||||||
by @command{os-prober} first entry will be put on top level and all others
|
by @command{os-prober} first entry will be put on top level and all others
|
||||||
in submenu. If this option is set to @samp{y}, flat menu with all entries
|
in submenu. If this option is set to @samp{true}, flat menu with all entries
|
||||||
on top level will be generated instead. Changing this option will require
|
on top level will be generated instead. Changing this option will require
|
||||||
changing existing values of @samp{GRUB_DEFAULT}, @samp{fallback} (@pxref{fallback})
|
changing existing values of @samp{GRUB_DEFAULT}, @samp{fallback} (@pxref{fallback})
|
||||||
and @samp{default} (@pxref{default}) environment variables as well as saved
|
and @samp{default} (@pxref{default}) environment variables as well as saved
|
||||||
|
@ -1497,16 +1553,16 @@ configurations, but have better replacements:
|
||||||
|
|
||||||
@table @samp
|
@table @samp
|
||||||
@item GRUB_HIDDEN_TIMEOUT
|
@item GRUB_HIDDEN_TIMEOUT
|
||||||
Wait this many seconds before displaying the menu. If @key{ESC} is pressed
|
Wait this many seconds before displaying the menu. If @key{ESC} or @key{F4} are
|
||||||
during that time, display the menu and wait for input according to
|
pressed, or @key{SHIFT} is held down during that time, display the menu and wait
|
||||||
@samp{GRUB_TIMEOUT}. If a hotkey associated with a menu entry is pressed,
|
for input according to @samp{GRUB_TIMEOUT}. If a hotkey associated with a menu
|
||||||
boot the associated menu entry immediately. If the timeout expires before
|
entry is pressed, boot the associated menu entry immediately. If the timeout
|
||||||
either of these happens, display the menu for the number of seconds
|
expires before either of these happens, display the menu for the number of
|
||||||
specified in @samp{GRUB_TIMEOUT} before booting the default entry.
|
seconds specified in @samp{GRUB_TIMEOUT} before booting the default entry.
|
||||||
|
|
||||||
If you set @samp{GRUB_HIDDEN_TIMEOUT}, you should also set
|
If you set @samp{GRUB_HIDDEN_TIMEOUT}, you should also set
|
||||||
@samp{GRUB_TIMEOUT=0} so that the menu is not displayed at all unless
|
@samp{GRUB_TIMEOUT=0} so that the menu is not displayed at all unless
|
||||||
@key{ESC} is pressed.
|
@key{ESC} or @key{F4} are pressed, or @key{SHIFT} is held down.
|
||||||
|
|
||||||
This option is unset by default, and is deprecated in favour of the less
|
This option is unset by default, and is deprecated in favour of the less
|
||||||
confusing @samp{GRUB_TIMEOUT_STYLE=countdown} or
|
confusing @samp{GRUB_TIMEOUT_STYLE=countdown} or
|
||||||
|
@ -1536,6 +1592,53 @@ edit the scripts in @file{/etc/grub.d} directly.
|
||||||
menu entries; simply type the menu entries you want to add at the end of
|
menu entries; simply type the menu entries you want to add at the end of
|
||||||
that file, making sure to leave at least the first two lines intact.
|
that file, making sure to leave at least the first two lines intact.
|
||||||
|
|
||||||
|
@node Root Identifcation Heuristics
|
||||||
|
@section Root Identifcation Heuristics
|
||||||
|
If the target operating system uses the Linux kernel, @command{grub-mkconfig}
|
||||||
|
attempts to identify the root file system via a heuristic algoirthm. This
|
||||||
|
algorithm selects the identification method of the root file system by
|
||||||
|
considering three factors. The first is if an initrd for the target operating
|
||||||
|
system is also present. The second is @samp{GRUB_DISABLE_LINUX_UUID} and if set
|
||||||
|
to @samp{true}, prevents @command{grub-mkconfig} from identifying the root file
|
||||||
|
system by its UUID. The third is @samp{GRUB_DISABLE_LINUX_PARTUUID} and if set
|
||||||
|
to @samp{true}, prevents @command{grub-mkconfig} from identifying the root file
|
||||||
|
system via the UUID of its enclosing partition. If the variables are assigned
|
||||||
|
any other value, that value is considered equivalent to @samp{false}. The
|
||||||
|
variables are also considered to be set to @samp{false} if they are not set.
|
||||||
|
|
||||||
|
When booting, the Linux kernel will delegate the task of mounting the root
|
||||||
|
filesystem to the initrd. Most initrd images determine the root file system by
|
||||||
|
checking the Linux kernel's command-line for the @samp{root} key and use its
|
||||||
|
value as the identification method of the root file system. To improve the
|
||||||
|
reliability of booting, most initrd images also allow the root file system to be
|
||||||
|
identified by its UUID. Because of this behavior, the @command{grub-mkconfig}
|
||||||
|
command will set @samp{root} to @samp{root=UUID=...} to provide the initrd with
|
||||||
|
the filesystem UUID of the root file system.
|
||||||
|
|
||||||
|
If no initrd is detected or @samp{GRUB_DISABLE_LINUX_UUID} is set to @samp{true}
|
||||||
|
then @command{grub-command} will identify the root filesystem by setting the
|
||||||
|
kernel command-line variable @samp{root} to @samp{root=PARTUUID=...} unless
|
||||||
|
@samp{GRUB_DISABLE_LINUX_PARTUUID} is also set to @samp{true}. If
|
||||||
|
@samp{GRUB_DISABLE_LINUX_PARTUUID} is also set to @samp{true},
|
||||||
|
@command{grub-command} will identify by its Linux device name.
|
||||||
|
|
||||||
|
The following table summarizes the behavior of the @command{grub-mkconfig}
|
||||||
|
command.
|
||||||
|
|
||||||
|
@multitable {detected} {GRUB_DISABLE_LINUX_PARTUUID} {GRUB_DISABLE_LINUX_UUID} {Linux Root}
|
||||||
|
@headitem Initrd detected @tab GRUB_DISABLE_LINUX_PARTUUID Set To @tab GRUB_DISABLE_LINUX_UUID Set To @tab Linux Root ID Method
|
||||||
|
@item false @tab false @tab false @tab part UUID
|
||||||
|
@item false @tab false @tab true @tab part UUID
|
||||||
|
@item false @tab true @tab false @tab dev name
|
||||||
|
@item false @tab true @tab true @tab dev name
|
||||||
|
@item true @tab false @tab false @tab fs UUID
|
||||||
|
@item true @tab false @tab true @tab part UUID
|
||||||
|
@item true @tab true @tab false @tab fs UUID
|
||||||
|
@item true @tab true @tab true @tab dev name
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
Remember, @samp{GRUB_DISABLE_LINUX_PARTUUID} and @samp{GRUB_DISABLE_LINUX_UUID}
|
||||||
|
are also considered to be set to @samp{false} when they are unset.
|
||||||
|
|
||||||
@node Shell-like scripting
|
@node Shell-like scripting
|
||||||
@section Writing full configuration files directly
|
@section Writing full configuration files directly
|
||||||
|
@ -2407,6 +2510,57 @@ grub-mknetdir --net-directory=/srv/tftp --subdir=/boot/grub -d /usr/lib/grub/i38
|
||||||
Then follow instructions printed out by grub-mknetdir on configuring your DHCP
|
Then follow instructions printed out by grub-mknetdir on configuring your DHCP
|
||||||
server.
|
server.
|
||||||
|
|
||||||
|
The grub.cfg file is placed in the same directory as the path output by
|
||||||
|
grub-mknetdir hereafter referred to as FWPATH. GRUB will search for its
|
||||||
|
configuration files in order using the following rules where the appended
|
||||||
|
value corresponds to a value on the client machine.
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
@samp{(FWPATH)}/grub.cfg-@samp{(UUID OF MACHINE)}
|
||||||
|
@samp{(FWPATH)}/grub.cfg-@samp{(MAC ADDRESS OF NIC)}
|
||||||
|
@samp{(FWPATH)}/grub.cfg-@samp{(IPv4 OR IPv6 ADDRESS)}
|
||||||
|
@samp{(FWPATH)}/grub.cfg
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
The UUID is the Client Machine Identifier Option Definition as specified in
|
||||||
|
RFC 4578. The client will only attempt to loouk up a UUID config file if it
|
||||||
|
was provided by the DHCP server.
|
||||||
|
|
||||||
|
The client will only attempt to look up an IPv6 address config once, however,
|
||||||
|
it will try the IPv4 multiple times. The concrete example below shows what
|
||||||
|
would happen under the IPv4 case.
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
UUID: 7726a678-7fc0-4853-a4f6-c85ac36a120a
|
||||||
|
MAC: 52:54:00:ec:33:81
|
||||||
|
IPV4: 10.0.0.130 (0A000082)
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@example
|
||||||
|
@group
|
||||||
|
@samp{(FWPATH)}/grub.cfg-7726a678-7fc0-4853-a4f6-c85ac36a120a
|
||||||
|
@samp{(FWPATH)}/grub.cfg-52-54-00-ec-33-81
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A000082
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A00008
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A0000
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A000
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A00
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A0
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0A
|
||||||
|
@samp{(FWPATH)}/grub.cfg-0
|
||||||
|
@samp{(FWPATH)}/grub.cfg
|
||||||
|
@end group
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This feature is enabled by default but it can be disabled by setting the
|
||||||
|
@samp{feature_net_search_cfg} to @samp{n}. Since this happens before the
|
||||||
|
configuration file is read by GRUB, this option has to be disabled in an
|
||||||
|
embedded configuration file (@pxref{Embedded configuration}).
|
||||||
|
|
||||||
After GRUB has started, files on the TFTP server will be accessible via the
|
After GRUB has started, files on the TFTP server will be accessible via the
|
||||||
@samp{(tftp)} device.
|
@samp{(tftp)} device.
|
||||||
|
|
||||||
|
@ -3851,7 +4005,7 @@ you forget a command, you can run the command @command{help}
|
||||||
* password_pbkdf2:: Set a hashed password
|
* password_pbkdf2:: Set a hashed password
|
||||||
* play:: Play a tune
|
* play:: Play a tune
|
||||||
* probe:: Retrieve device info
|
* probe:: Retrieve device info
|
||||||
* pxe_unload:: Unload the PXE environment
|
* rdmsr:: Read values from model-specific registers
|
||||||
* read:: Read user input
|
* read:: Read user input
|
||||||
* reboot:: Reboot your computer
|
* reboot:: Reboot your computer
|
||||||
* regexp:: Test if regular expression matches string
|
* regexp:: Test if regular expression matches string
|
||||||
|
@ -3864,20 +4018,19 @@ you forget a command, you can run the command @command{help}
|
||||||
* sha256sum:: Compute or check SHA256 hash
|
* sha256sum:: Compute or check SHA256 hash
|
||||||
* sha512sum:: Compute or check SHA512 hash
|
* sha512sum:: Compute or check SHA512 hash
|
||||||
* sleep:: Wait for a specified number of seconds
|
* sleep:: Wait for a specified number of seconds
|
||||||
|
* smbios:: Retrieve SMBIOS information
|
||||||
* source:: Read a configuration file in same context
|
* source:: Read a configuration file in same context
|
||||||
* test:: Check file types and compare values
|
* test:: Check file types and compare values
|
||||||
* true:: Do nothing, successfully
|
* true:: Do nothing, successfully
|
||||||
* trust:: Add public key to list of trusted keys
|
* trust:: Add public key to list of trusted keys
|
||||||
* unset:: Unset an environment variable
|
* unset:: Unset an environment variable
|
||||||
* uppermem:: Set the upper memory size
|
|
||||||
@comment * vbeinfo:: List available video modes
|
@comment * vbeinfo:: List available video modes
|
||||||
* verify_detached:: Verify detached digital signature
|
* verify_detached:: Verify detached digital signature
|
||||||
* videoinfo:: List available video modes
|
* videoinfo:: List available video modes
|
||||||
@comment * xen_*:: Xen boot commands
|
@comment * xen_*:: Xen boot commands for AArch64
|
||||||
* xen_hypervisor:: Load xen hypervisor binary
|
* wrmsr:: Write values to model-specific registers
|
||||||
* xen_linux:: Load dom0 kernel for xen hypervisor
|
* xen_hypervisor:: Load xen hypervisor binary (only on AArch64)
|
||||||
* xen_initrd:: Load dom0 initrd for dom0 kernel
|
* xen_module:: Load xen modules for xen hypervisor (only on AArch64)
|
||||||
* xen_xsm:: Load xen security module for xen hypervisor
|
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@ -4122,8 +4275,9 @@ is requested interactively. Option @var{device} configures specific grub device
|
||||||
with specified @var{uuid}; option @option{-a} configures all detected encrypted
|
with specified @var{uuid}; option @option{-a} configures all detected encrypted
|
||||||
devices; option @option{-b} configures all geli containers that have boot flag set.
|
devices; option @option{-b} configures all geli containers that have boot flag set.
|
||||||
|
|
||||||
GRUB suports devices encrypted using LUKS and geli. Note that necessary modules (@var{luks} and @var{geli}) have to be loaded manually before this command can
|
GRUB suports devices encrypted using LUKS, LUKS2 and geli. Note that necessary
|
||||||
be used.
|
modules (@var{luks}, @var{luks2} and @var{geli}) have to be loaded manually
|
||||||
|
before this command can be used.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@ -4141,13 +4295,12 @@ hour, minute, and second unchanged.
|
||||||
|
|
||||||
|
|
||||||
@node devicetree
|
@node devicetree
|
||||||
@subsection linux
|
@subsection devicetree
|
||||||
|
|
||||||
@deffn Command devicetree file
|
@deffn Command devicetree file
|
||||||
Load a device tree blob (.dtb) from a filesystem, for later use by a Linux
|
Load a device tree blob (.dtb) from a filesystem, for later use by a Linux
|
||||||
kernel. Does not perform merging with any device tree supplied by firmware,
|
kernel. Does not perform merging with any device tree supplied by firmware,
|
||||||
but rather replaces it completely.
|
but rather replaces it completely.
|
||||||
@ref{GNU/Linux}.
|
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@node distrust
|
@node distrust
|
||||||
|
@ -4344,22 +4497,22 @@ about each of the commands whose names begin with those @var{patterns}.
|
||||||
@node initrd
|
@node initrd
|
||||||
@subsection initrd
|
@subsection initrd
|
||||||
|
|
||||||
@deffn Command initrd file
|
@deffn Command initrd file [file @dots{}]
|
||||||
Load an initial ramdisk for a Linux kernel image, and set the appropriate
|
Load, in order, all initial ramdisks for a Linux kernel image, and set
|
||||||
parameters in the Linux setup area in memory. This may only be used after
|
the appropriate parameters in the Linux setup area in memory. This may only
|
||||||
the @command{linux} command (@pxref{linux}) has been run. See also
|
be used after the @command{linux} command (@pxref{linux}) has been run. See
|
||||||
@ref{GNU/Linux}.
|
also @ref{GNU/Linux}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node initrd16
|
@node initrd16
|
||||||
@subsection initrd16
|
@subsection initrd16
|
||||||
|
|
||||||
@deffn Command initrd16 file
|
@deffn Command initrd16 file [file @dots{}]
|
||||||
Load an initial ramdisk for a Linux kernel image to be booted in 16-bit
|
Load, in order, all initial ramdisks for a Linux kernel image to be booted in
|
||||||
mode, and set the appropriate parameters in the Linux setup area in memory.
|
16-bit mode, and set the appropriate parameters in the Linux setup area in
|
||||||
This may only be used after the @command{linux16} command (@pxref{linux16})
|
memory. This may only be used after the @command{linux16} command
|
||||||
has been run. See also @ref{GNU/Linux}.
|
(@pxref{linux16}) has been run. See also @ref{GNU/Linux}.
|
||||||
|
|
||||||
This command is only available on x86 systems.
|
This command is only available on x86 systems.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
@ -4567,7 +4720,7 @@ be reloaded after using this command (@pxref{module}).
|
||||||
Some kernels have known problems. You need to specify --quirk-* for those.
|
Some kernels have known problems. You need to specify --quirk-* for those.
|
||||||
--quirk-bad-kludge is a problem seen in several products that they include
|
--quirk-bad-kludge is a problem seen in several products that they include
|
||||||
loading kludge information with invalid data in ELF file. GRUB prior to 0.97
|
loading kludge information with invalid data in ELF file. GRUB prior to 0.97
|
||||||
and some custom builds prefered ELF information while 0.97 and GRUB 2
|
and some custom builds preferred ELF information while 0.97 and GRUB 2
|
||||||
use kludge. Use this option to ignore kludge.
|
use kludge. Use this option to ignore kludge.
|
||||||
Known affected systems: old Solaris, SkyOS.
|
Known affected systems: old Solaris, SkyOS.
|
||||||
|
|
||||||
|
@ -4645,7 +4798,7 @@ range 0-0xFF (prefix with @samp{0x} to enter it in hexadecimal).
|
||||||
When enabled, this hides the selected partition by setting the @dfn{hidden}
|
When enabled, this hides the selected partition by setting the @dfn{hidden}
|
||||||
bit in its partition type code; when disabled, unhides the selected
|
bit in its partition type code; when disabled, unhides the selected
|
||||||
partition by clearing this bit. This is useful only when booting DOS or
|
partition by clearing this bit. This is useful only when booting DOS or
|
||||||
Wwindows and multiple primary FAT partitions exist in one disk. See also
|
Windows and multiple primary FAT partitions exist in one disk. See also
|
||||||
@ref{DOS/Windows}.
|
@ref{DOS/Windows}.
|
||||||
@end table
|
@end table
|
||||||
@end deffn
|
@end deffn
|
||||||
|
@ -4692,19 +4845,29 @@ a rest.
|
||||||
@node probe
|
@node probe
|
||||||
@subsection probe
|
@subsection probe
|
||||||
|
|
||||||
@deffn Command probe [@option{--set} var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label} device
|
@deffn Command probe [@option{--set} var] @option{--driver}|@option{--partmap}|@option{--fs}|@option{--fs-uuid}|@option{--label}|@option{--part-uuid} device
|
||||||
Retrieve device information. If option @option{--set} is given, assign result
|
Retrieve device information. If option @option{--set} is given, assign result
|
||||||
to variable @var{var}, otherwise print information on the screen.
|
to variable @var{var}, otherwise print information on the screen.
|
||||||
|
|
||||||
|
The option @option{--part-uuid} is currently only implemented for MSDOS and GPT formatted disks.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node pxe_unload
|
@node rdmsr
|
||||||
@subsection pxe_unload
|
@subsection rdmsr
|
||||||
|
|
||||||
@deffn Command pxe_unload
|
@deffn Command: rdmsr 0xADDR [-v VARNAME]
|
||||||
Unload the PXE environment (@pxref{Network}).
|
Read a model-specific register at address 0xADDR. If the parameter
|
||||||
|
@option{-v} is used and an environment variable @var{VARNAME} is
|
||||||
|
given, set that environment variable to the value that was read.
|
||||||
|
|
||||||
This command is only available on PC BIOS systems.
|
Please note that on SMP systems, reading from a MSR that has a
|
||||||
|
scope per hardware thread, implies that the value that is returned
|
||||||
|
only applies to the particular cpu/core/thread that runs the command.
|
||||||
|
|
||||||
|
Also, if you specify a reserved or unimplemented MSR address, it will
|
||||||
|
cause a general protection exception (which is not currently being handled)
|
||||||
|
and the system will reboot.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@ -4980,9 +5143,84 @@ Alias for @code{hashsum --hash sha512 arg @dots{}}. See command @command{hashsum
|
||||||
|
|
||||||
@deffn Command sleep [@option{--verbose}] [@option{--interruptible}] count
|
@deffn Command sleep [@option{--verbose}] [@option{--interruptible}] count
|
||||||
Sleep for @var{count} seconds. If option @option{--interruptible} is given,
|
Sleep for @var{count} seconds. If option @option{--interruptible} is given,
|
||||||
allow @key{ESC} to interrupt sleep. With @option{--verbose} show countdown
|
allow pressing @key{ESC}, @key{F4} or holding down @key{SHIFT} to interrupt
|
||||||
of remaining seconds. Exit code is set to 0 if timeout expired and to 1
|
sleep. With @option{--verbose} show countdown of remaining seconds. Exit code
|
||||||
if timeout was interrupted by @key{ESC}.
|
is set to 0 if timeout expired and to 1 if timeout was interrupted using any
|
||||||
|
of the mentioned keys.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@node smbios
|
||||||
|
@subsection smbios
|
||||||
|
|
||||||
|
@deffn Command smbios @
|
||||||
|
[@option{--type} @var{type}] @
|
||||||
|
[@option{--handle} @var{handle}] @
|
||||||
|
[@option{--match} @var{match}] @
|
||||||
|
(@option{--get-byte} | @option{--get-word} | @option{--get-dword} | @
|
||||||
|
@option{--get-qword} | @option{--get-string} | @option{--get-uuid}) @
|
||||||
|
@var{offset} @
|
||||||
|
[@option{--set} @var{variable}]
|
||||||
|
Retrieve SMBIOS information.
|
||||||
|
|
||||||
|
The @command{smbios} command returns the value of a field in an SMBIOS
|
||||||
|
structure. The following options determine which structure to select.
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item
|
||||||
|
Specifying @option{--type} will select structures with a matching
|
||||||
|
@var{type}. The type can be any integer from 0 to 255.
|
||||||
|
@item
|
||||||
|
Specifying @option{--handle} will select structures with a matching
|
||||||
|
@var{handle}. The handle can be any integer from 0 to 65535.
|
||||||
|
@item
|
||||||
|
Specifying @option{--match} will select structure number @var{match} in the
|
||||||
|
filtered list of structures; e.g. @code{smbios --type 4 --match 2} will select
|
||||||
|
the second Process Information (Type 4) structure. The list is always ordered
|
||||||
|
the same as the hardware's SMBIOS table. The match number must be a positive
|
||||||
|
integer. If unspecified, the first matching structure will be selected.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
The remaining options determine which field in the selected SMBIOS structure to
|
||||||
|
return. Only one of these options may be specified at a time.
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item
|
||||||
|
When given @option{--get-byte}, return the value of the byte
|
||||||
|
at @var{offset} bytes into the selected SMBIOS structure.
|
||||||
|
It will be formatted as an unsigned decimal integer.
|
||||||
|
@item
|
||||||
|
When given @option{--get-word}, return the value of the word (two bytes)
|
||||||
|
at @var{offset} bytes into the selected SMBIOS structure.
|
||||||
|
It will be formatted as an unsigned decimal integer.
|
||||||
|
@item
|
||||||
|
When given @option{--get-dword}, return the value of the dword (four bytes)
|
||||||
|
at @var{offset} bytes into the selected SMBIOS structure.
|
||||||
|
It will be formatted as an unsigned decimal integer.
|
||||||
|
@item
|
||||||
|
When given @option{--get-qword}, return the value of the qword (eight bytes)
|
||||||
|
at @var{offset} bytes into the selected SMBIOS structure.
|
||||||
|
It will be formatted as an unsigned decimal integer.
|
||||||
|
@item
|
||||||
|
When given @option{--get-string}, return the string with its index found
|
||||||
|
at @var{offset} bytes into the selected SMBIOS structure.
|
||||||
|
@item
|
||||||
|
When given @option{--get-uuid}, return the value of the UUID (sixteen bytes)
|
||||||
|
at @var{offset} bytes into the selected SMBIOS structure.
|
||||||
|
It will be formatted as lower-case hyphenated hexadecimal digits, with the
|
||||||
|
first three fields as little-endian, and the rest printed byte-by-byte.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
The default action is to print the value of the requested field to the console,
|
||||||
|
but a variable name can be specified with @option{--set} to store the value
|
||||||
|
instead of printing it.
|
||||||
|
|
||||||
|
For example, this will store and then display the system manufacturer's name.
|
||||||
|
|
||||||
|
@example
|
||||||
|
smbios --type 1 --get-string 4 --set system_manufacturer
|
||||||
|
echo $system_manufacturer
|
||||||
|
@end example
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@ -5102,12 +5340,6 @@ Unset the environment variable @var{envvar}.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node uppermem
|
|
||||||
@subsection uppermem
|
|
||||||
|
|
||||||
This command is not yet implemented for GRUB 2, although it is planned.
|
|
||||||
|
|
||||||
|
|
||||||
@ignore
|
@ignore
|
||||||
@node vbeinfo
|
@node vbeinfo
|
||||||
@subsection vbeinfo
|
@subsection vbeinfo
|
||||||
|
@ -5146,6 +5378,21 @@ successfully. If validation fails, it is set to a non-zero value.
|
||||||
List available video modes. If resolution is given, show only matching modes.
|
List available video modes. If resolution is given, show only matching modes.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@node wrmsr
|
||||||
|
@subsection wrmsr
|
||||||
|
|
||||||
|
@deffn Command: wrmsr 0xADDR 0xVALUE
|
||||||
|
Write a 0xVALUE to a model-specific register at address 0xADDR.
|
||||||
|
|
||||||
|
Please note that on SMP systems, writing to a MSR that has a scope
|
||||||
|
per hardware thread, implies that the value that is written
|
||||||
|
only applies to the particular cpu/core/thread that runs the command.
|
||||||
|
|
||||||
|
Also, if you specify a reserved or unimplemented MSR address, it will
|
||||||
|
cause a general protection exception (which is not currently being handled)
|
||||||
|
and the system will reboot.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@node xen_hypervisor
|
@node xen_hypervisor
|
||||||
@subsection xen_hypervisor
|
@subsection xen_hypervisor
|
||||||
|
|
||||||
|
@ -5153,32 +5400,22 @@ List available video modes. If resolution is given, show only matching modes.
|
||||||
Load a Xen hypervisor binary from @var{file}. The rest of the line is passed
|
Load a Xen hypervisor binary from @var{file}. The rest of the line is passed
|
||||||
verbatim as the @dfn{kernel command-line}. Any other binaries must be
|
verbatim as the @dfn{kernel command-line}. Any other binaries must be
|
||||||
reloaded after using this command.
|
reloaded after using this command.
|
||||||
|
This command is only available on AArch64 systems.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@node xen_linux
|
@node xen_module
|
||||||
@subsection xen_linux
|
@subsection xen_module
|
||||||
|
|
||||||
@deffn Command xen_linux file [arguments]
|
@deffn Command xen_module [--nounzip] file [arguments]
|
||||||
Load a dom0 kernel image for xen hypervisor at the booting process of xen.
|
Load a module for xen hypervisor at the booting process of xen.
|
||||||
The rest of the line is passed verbatim as the module command line.
|
The rest of the line is passed verbatim as the module command line.
|
||||||
|
Modules should be loaded in the following order:
|
||||||
|
- dom0 kernel image
|
||||||
|
- dom0 ramdisk if present
|
||||||
|
- XSM policy if present
|
||||||
|
This command is only available on AArch64 systems.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
@node xen_initrd
|
|
||||||
@subsection xen_initrd
|
|
||||||
|
|
||||||
@deffn Command xen_initrd file
|
|
||||||
Load a initrd image for dom0 kernel at the booting process of xen.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
@node xen_xsm
|
|
||||||
@subsection xen_xsm
|
|
||||||
|
|
||||||
@deffn Command xen_xsm file
|
|
||||||
Load a xen security module for xen hypervisor at the booting process of xen.
|
|
||||||
See @uref{http://wiki.xen.org/wiki/XSM} for more detail.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node Networking commands
|
@node Networking commands
|
||||||
@section The list of networking commands
|
@section The list of networking commands
|
||||||
|
|
||||||
|
@ -5186,10 +5423,11 @@ See @uref{http://wiki.xen.org/wiki/XSM} for more detail.
|
||||||
* net_add_addr:: Add a network address
|
* net_add_addr:: Add a network address
|
||||||
* net_add_dns:: Add a DNS server
|
* net_add_dns:: Add a DNS server
|
||||||
* net_add_route:: Add routing entry
|
* net_add_route:: Add routing entry
|
||||||
* net_bootp:: Perform a bootp autoconfiguration
|
* net_bootp:: Perform a bootp/DHCP autoconfiguration
|
||||||
* net_del_addr:: Remove IP address from interface
|
* net_del_addr:: Remove IP address from interface
|
||||||
* net_del_dns:: Remove a DNS server
|
* net_del_dns:: Remove a DNS server
|
||||||
* net_del_route:: Remove a route entry
|
* net_del_route:: Remove a route entry
|
||||||
|
* net_dhcp:: Perform a DHCP autoconfiguration
|
||||||
* net_get_dhcp_option:: Retrieve DHCP options
|
* net_get_dhcp_option:: Retrieve DHCP options
|
||||||
* net_ipv6_autoconf:: Perform IPv6 autoconfiguration
|
* net_ipv6_autoconf:: Perform IPv6 autoconfiguration
|
||||||
* net_ls_addr:: List interfaces
|
* net_ls_addr:: List interfaces
|
||||||
|
@ -5236,8 +5474,44 @@ by @var{shortname} which can be used to remove it (@pxref{net_del_route}).
|
||||||
@subsection net_bootp
|
@subsection net_bootp
|
||||||
|
|
||||||
@deffn Command net_bootp [@var{card}]
|
@deffn Command net_bootp [@var{card}]
|
||||||
|
Alias for net_dhcp, for compatibility with older Grub versions. Will perform
|
||||||
|
the same DHCP handshake with potential fallback to BOOTP as the net_dhcp
|
||||||
|
command (@pxref{net_dhcp}).
|
||||||
|
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@node net_del_addr
|
||||||
|
@subsection net_del_addr
|
||||||
|
|
||||||
|
@deffn Command net_del_addr @var{interface}
|
||||||
|
Remove configured @var{interface} with associated address.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@node net_del_dns
|
||||||
|
@subsection net_del_dns
|
||||||
|
|
||||||
|
@deffn Command net_del_dns @var{address}
|
||||||
|
Remove @var{address} from list of servers used during name lookup.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@node net_del_route
|
||||||
|
@subsection net_del_route
|
||||||
|
|
||||||
|
@deffn Command net_del_route @var{shortname}
|
||||||
|
Remove route entry identified by @var{shortname}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
|
@node net_dhcp
|
||||||
|
@subsection net_dhcp
|
||||||
|
|
||||||
|
@deffn Command net_dhcp [@var{card}]
|
||||||
Perform configuration of @var{card} using DHCP protocol. If no card name
|
Perform configuration of @var{card} using DHCP protocol. If no card name
|
||||||
is specified, try to configure all existing cards. If configuration was
|
is specified, try to configure all existing cards.
|
||||||
|
Falls back to the BOOTP protocol, if needed. If configuration was
|
||||||
successful, interface with name @var{card}@samp{:dhcp} and configured
|
successful, interface with name @var{card}@samp{:dhcp} and configured
|
||||||
address is added to @var{card}.
|
address is added to @var{card}.
|
||||||
@comment If server provided gateway information in
|
@comment If server provided gateway information in
|
||||||
|
@ -5264,35 +5538,17 @@ Sets environment variable @samp{net_}@var{<card>}@samp{_dhcp_rootpath}
|
||||||
@item 18 (Extensions Path)
|
@item 18 (Extensions Path)
|
||||||
Sets environment variable @samp{net_}@var{<card>}@samp{_dhcp_extensionspath}
|
Sets environment variable @samp{net_}@var{<card>}@samp{_dhcp_extensionspath}
|
||||||
(@pxref{net_@var{<interface>}_extensionspath}) to the value of option.
|
(@pxref{net_@var{<interface>}_extensionspath}) to the value of option.
|
||||||
|
@item 66 (TFTP Server Name)
|
||||||
|
Sets environment variable @samp{net_}@var{<card>}@samp{_dhcp_server_name}
|
||||||
|
(@pxref{net_@var{<interface>}_dhcp_server_name}) to the value of option.
|
||||||
|
@item 67 (Filename)
|
||||||
|
Sets environment variable @samp{net_}@var{<card>}@samp{_boot_file}
|
||||||
|
(@pxref{net_@var{<interface>}_boot_file}) to the value of option.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node net_del_addr
|
|
||||||
@subsection net_del_addr
|
|
||||||
|
|
||||||
@deffn Command net_del_addr @var{interface}
|
|
||||||
Remove configured @var{interface} with associated address.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node net_del_dns
|
|
||||||
@subsection net_del_dns
|
|
||||||
|
|
||||||
@deffn Command net_del_dns @var{address}
|
|
||||||
Remove @var{address} from list of servers used during name lookup.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node net_del_route
|
|
||||||
@subsection net_del_route
|
|
||||||
|
|
||||||
@deffn Command net_del_route @var{shortname}
|
|
||||||
Remove route entry identified by @var{shortname}.
|
|
||||||
@end deffn
|
|
||||||
|
|
||||||
|
|
||||||
@node net_get_dhcp_option
|
@node net_get_dhcp_option
|
||||||
@subsection net_get_dhcp_option
|
@subsection net_get_dhcp_option
|
||||||
|
|
||||||
|
@ -5368,7 +5624,7 @@ NTFS, JFS, UDF, HFS+, exFAT, long filenames in FAT, Joliet part of
|
||||||
ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read
|
ISO9660 are treated as UTF-16 as per specification. AFS and BFS are read
|
||||||
as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
|
as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
|
||||||
minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names),
|
minix2, minix3, ROMFS, ReiserFS, XFS, ext2, ext3, ext4, FAT (short names),
|
||||||
RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed
|
F2FS, RockRidge part of ISO9660, nilfs2, UFS1, UFS2 and ZFS are assumed
|
||||||
to be UTF-8. This might be false on systems configured with legacy charset
|
to be UTF-8. This might be false on systems configured with legacy charset
|
||||||
but as long as the charset used is superset of ASCII you should be able to
|
but as long as the charset used is superset of ASCII you should be able to
|
||||||
access ASCII-named files. And it's recommended to configure your system to use
|
access ASCII-named files. And it's recommended to configure your system to use
|
||||||
|
@ -5477,6 +5733,8 @@ environment variables and commands are listed in the same order.
|
||||||
@menu
|
@menu
|
||||||
* Authentication and authorisation:: Users and access control
|
* Authentication and authorisation:: Users and access control
|
||||||
* Using digital signatures:: Booting digitally signed code
|
* Using digital signatures:: Booting digitally signed code
|
||||||
|
* UEFI secure boot and shim:: Booting digitally signed PE files
|
||||||
|
* Measured Boot:: Measuring boot components
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@node Authentication and authorisation
|
@node Authentication and authorisation
|
||||||
|
@ -5508,7 +5766,8 @@ the GRUB command line, edit menu entries, and execute any menu entry. If
|
||||||
@samp{superusers} is set, then use of the command line and editing of menu
|
@samp{superusers} is set, then use of the command line and editing of menu
|
||||||
entries are automatically restricted to superusers. Setting @samp{superusers}
|
entries are automatically restricted to superusers. Setting @samp{superusers}
|
||||||
to empty string effectively disables both access to CLI and editing of menu
|
to empty string effectively disables both access to CLI and editing of menu
|
||||||
entries.
|
entries. Note: The environment variable needs to be exported to also affect
|
||||||
|
the section defined by the @samp{submenu} command (@pxref{submenu}).
|
||||||
|
|
||||||
Other users may be allowed to execute specific menu entries by giving a list of
|
Other users may be allowed to execute specific menu entries by giving a list of
|
||||||
usernames (as above) using the @option{--users} option to the
|
usernames (as above) using the @option{--users} option to the
|
||||||
|
@ -5639,6 +5898,57 @@ or BIOS) configuration to cause the machine to boot from a different
|
||||||
(attacker-controlled) device. GRUB is at best only one link in a
|
(attacker-controlled) device. GRUB is at best only one link in a
|
||||||
secure boot chain.
|
secure boot chain.
|
||||||
|
|
||||||
|
@node UEFI secure boot and shim
|
||||||
|
@section UEFI secure boot and shim support
|
||||||
|
|
||||||
|
The GRUB, except the @command{chainloader} command, works with the UEFI secure
|
||||||
|
boot and the shim. This functionality is provided by the shim_lock module. It
|
||||||
|
is recommend to build in this and other required modules into the @file{core.img}.
|
||||||
|
All modules not stored in the @file{core.img} and the ACPI tables for the
|
||||||
|
@command{acpi} command have to be signed, e.g. using PGP. Additionally, the
|
||||||
|
@command{iorw}, the @command{memrw} and the @command{wrmsr} commands are
|
||||||
|
prohibited if the UEFI secure boot is enabled. This is done due to
|
||||||
|
security reasons. All above mentioned requirements are enforced by the
|
||||||
|
shim_lock module. And itself it is a persistent module which means that
|
||||||
|
it cannot be unloaded if it was loaded into the memory.
|
||||||
|
|
||||||
|
@node Measured Boot
|
||||||
|
@section Measuring boot components
|
||||||
|
|
||||||
|
If the tpm module is loaded and the platform has a Trusted Platform Module
|
||||||
|
installed, GRUB will log each command executed and each file loaded into the
|
||||||
|
TPM event log and extend the PCR values in the TPM correspondingly. All events
|
||||||
|
will be logged into the PCR described below with a type of EV_IPL and an
|
||||||
|
event description as described below.
|
||||||
|
|
||||||
|
@multitable @columnfractions 0.3 0.1 0.6
|
||||||
|
@headitem Event type @tab PCR @tab Description
|
||||||
|
@item Command
|
||||||
|
@tab 8
|
||||||
|
@tab All executed commands (including those from configuration files) will be
|
||||||
|
logged and measured as entered with a prefix of ``grub_cmd: ``
|
||||||
|
@item Kernel command line
|
||||||
|
@tab 8
|
||||||
|
@tab Any command line passed to a kernel will be logged and measured as entered
|
||||||
|
with a prefix of ``kernel_cmdline: ''
|
||||||
|
@item Module command line
|
||||||
|
@tab 8
|
||||||
|
@tab Any command line passed to a kernel module will be logged and measured as
|
||||||
|
entered with a prefix of ``module_cmdline: ``
|
||||||
|
@item Files
|
||||||
|
@tab 9
|
||||||
|
@tab Any file read by GRUB will be logged and measured with a descriptive text
|
||||||
|
corresponding to the filename.
|
||||||
|
@end multitable
|
||||||
|
|
||||||
|
GRUB will not measure its own @file{core.img} - it is expected that firmware
|
||||||
|
will carry this out. GRUB will also not perform any measurements until the
|
||||||
|
tpm module is loaded. As such it is recommended that the tpm module be built
|
||||||
|
into @file{core.img} in order to avoid a potential gap in measurement between
|
||||||
|
@file{core.img} being loaded and the tpm module being loaded.
|
||||||
|
|
||||||
|
Measured boot is currently only supported on EFI platforms.
|
||||||
|
|
||||||
@node Platform limitations
|
@node Platform limitations
|
||||||
@chapter Platform limitations
|
@chapter Platform limitations
|
||||||
|
|
||||||
|
@ -5711,6 +6021,8 @@ to install to is specified, UUID is used instead as well.
|
||||||
@item USB @tab yes @tab yes @tab yes @tab yes
|
@item USB @tab yes @tab yes @tab yes @tab yes
|
||||||
@item chainloader @tab local @tab yes @tab yes @tab no
|
@item chainloader @tab local @tab yes @tab yes @tab no
|
||||||
@item cpuid @tab partial @tab partial @tab partial @tab partial
|
@item cpuid @tab partial @tab partial @tab partial @tab partial
|
||||||
|
@item rdmsr @tab partial @tab partial @tab partial @tab partial
|
||||||
|
@item wrmsr @tab partial @tab partial @tab partial @tab partial
|
||||||
@item hints @tab guess @tab guess @tab guess @tab guess
|
@item hints @tab guess @tab guess @tab guess @tab guess
|
||||||
@item PCI @tab yes @tab yes @tab yes @tab yes
|
@item PCI @tab yes @tab yes @tab yes @tab yes
|
||||||
@item badram @tab yes @tab yes @tab yes @tab yes
|
@item badram @tab yes @tab yes @tab yes @tab yes
|
||||||
|
@ -5730,6 +6042,8 @@ to install to is specified, UUID is used instead as well.
|
||||||
@item USB @tab yes @tab yes @tab yes @tab no
|
@item USB @tab yes @tab yes @tab yes @tab no
|
||||||
@item chainloader @tab local @tab local @tab no @tab local
|
@item chainloader @tab local @tab local @tab no @tab local
|
||||||
@item cpuid @tab partial @tab partial @tab partial @tab no
|
@item cpuid @tab partial @tab partial @tab partial @tab no
|
||||||
|
@item rdmsr @tab partial @tab partial @tab partial @tab no
|
||||||
|
@item wrmsr @tab partial @tab partial @tab partial @tab no
|
||||||
@item hints @tab guess @tab guess @tab good @tab guess
|
@item hints @tab guess @tab guess @tab good @tab guess
|
||||||
@item PCI @tab yes @tab yes @tab yes @tab no
|
@item PCI @tab yes @tab yes @tab yes @tab no
|
||||||
@item badram @tab yes @tab yes @tab no @tab yes
|
@item badram @tab yes @tab yes @tab no @tab yes
|
||||||
|
@ -5749,6 +6063,8 @@ to install to is specified, UUID is used instead as well.
|
||||||
@item USB @tab yes @tab no @tab no @tab no
|
@item USB @tab yes @tab no @tab no @tab no
|
||||||
@item chainloader @tab yes @tab no @tab no @tab no
|
@item chainloader @tab yes @tab no @tab no @tab no
|
||||||
@item cpuid @tab no @tab no @tab no @tab no
|
@item cpuid @tab no @tab no @tab no @tab no
|
||||||
|
@item rdmsr @tab no @tab no @tab no @tab no
|
||||||
|
@item wrmsr @tab no @tab no @tab no @tab no
|
||||||
@item hints @tab good @tab good @tab good @tab no
|
@item hints @tab good @tab good @tab good @tab no
|
||||||
@item PCI @tab yes @tab no @tab no @tab no
|
@item PCI @tab yes @tab no @tab no @tab no
|
||||||
@item badram @tab yes (*) @tab no @tab no @tab no
|
@item badram @tab yes (*) @tab no @tab no @tab no
|
||||||
|
@ -5768,6 +6084,8 @@ to install to is specified, UUID is used instead as well.
|
||||||
@item USB @tab N/A @tab yes @tab no
|
@item USB @tab N/A @tab yes @tab no
|
||||||
@item chainloader @tab yes @tab no @tab yes
|
@item chainloader @tab yes @tab no @tab yes
|
||||||
@item cpuid @tab no @tab no @tab yes
|
@item cpuid @tab no @tab no @tab yes
|
||||||
|
@item rdmsr @tab no @tab no @tab yes
|
||||||
|
@item wrmsr @tab no @tab no @tab yes
|
||||||
@item hints @tab guess @tab no @tab no
|
@item hints @tab guess @tab no @tab no
|
||||||
@item PCI @tab no @tab no @tab no
|
@item PCI @tab no @tab no @tab no
|
||||||
@item badram @tab yes (*) @tab no @tab no
|
@item badram @tab yes (*) @tab no @tab no
|
||||||
|
@ -5968,6 +6286,7 @@ Required files are:
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* GRUB only offers a rescue shell::
|
* GRUB only offers a rescue shell::
|
||||||
|
* Firmware stalls instead of booting GRUB::
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@ -6038,6 +6357,17 @@ support has not yet been added to GRUB.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
|
||||||
|
@node Firmware stalls instead of booting GRUB
|
||||||
|
@section Firmware stalls instead of booting GRUB
|
||||||
|
|
||||||
|
The EFI implementation of some older MacBook laptops stalls when it gets
|
||||||
|
presented a grub-mkrescue ISO image for x86_64-efi target on an USB stick.
|
||||||
|
Affected are models of year 2010 or earlier. Workaround is to zeroize the
|
||||||
|
bytes 446 to 461 of the EFI partition, where mformat has put a partition table
|
||||||
|
entry which claims partition start at block 0. This change will not hamper
|
||||||
|
bootability on other machines.
|
||||||
|
|
||||||
|
|
||||||
@node Invoking grub-install
|
@node Invoking grub-install
|
||||||
@chapter Invoking grub-install
|
@chapter Invoking grub-install
|
||||||
|
|
||||||
|
|
25
gentpl.py
25
gentpl.py
|
@ -28,10 +28,11 @@ import re
|
||||||
|
|
||||||
GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
|
GRUB_PLATFORMS = [ "emu", "i386_pc", "i386_efi", "i386_qemu", "i386_coreboot",
|
||||||
"i386_multiboot", "i386_ieee1275", "x86_64_efi",
|
"i386_multiboot", "i386_ieee1275", "x86_64_efi",
|
||||||
"i386_xen", "x86_64_xen",
|
"i386_xen", "x86_64_xen", "i386_xen_pvh",
|
||||||
"mips_loongson", "sparc64_ieee1275",
|
"mips_loongson", "sparc64_ieee1275",
|
||||||
"powerpc_ieee1275", "mips_arc", "ia64_efi",
|
"powerpc_ieee1275", "mips_arc", "ia64_efi",
|
||||||
"mips_qemu_mips", "arm_uboot", "arm_efi", "arm64_efi" ]
|
"mips_qemu_mips", "arm_uboot", "arm_efi", "arm64_efi",
|
||||||
|
"arm_coreboot", "riscv32_efi", "riscv64_efi" ]
|
||||||
|
|
||||||
GROUPS = {}
|
GROUPS = {}
|
||||||
|
|
||||||
|
@ -44,14 +45,18 @@ GROUPS["x86"] = GROUPS["i386"] + GROUPS["x86_64"]
|
||||||
GROUPS["mips"] = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ]
|
GROUPS["mips"] = [ "mips_loongson", "mips_qemu_mips", "mips_arc" ]
|
||||||
GROUPS["sparc64"] = [ "sparc64_ieee1275" ]
|
GROUPS["sparc64"] = [ "sparc64_ieee1275" ]
|
||||||
GROUPS["powerpc"] = [ "powerpc_ieee1275" ]
|
GROUPS["powerpc"] = [ "powerpc_ieee1275" ]
|
||||||
GROUPS["arm"] = [ "arm_uboot", "arm_efi" ]
|
GROUPS["arm"] = [ "arm_uboot", "arm_efi", "arm_coreboot" ]
|
||||||
GROUPS["arm64"] = [ "arm64_efi" ]
|
GROUPS["arm64"] = [ "arm64_efi" ]
|
||||||
|
GROUPS["riscv32"] = [ "riscv32_efi" ]
|
||||||
|
GROUPS["riscv64"] = [ "riscv64_efi" ]
|
||||||
|
|
||||||
# Groups based on firmware
|
# Groups based on firmware
|
||||||
GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi", "arm64_efi" ]
|
GROUPS["efi"] = [ "i386_efi", "x86_64_efi", "ia64_efi", "arm_efi", "arm64_efi",
|
||||||
|
"riscv32_efi", "riscv64_efi" ]
|
||||||
GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
|
GROUPS["ieee1275"] = [ "i386_ieee1275", "sparc64_ieee1275", "powerpc_ieee1275" ]
|
||||||
GROUPS["uboot"] = [ "arm_uboot" ]
|
GROUPS["uboot"] = [ "arm_uboot" ]
|
||||||
GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ]
|
GROUPS["xen"] = [ "i386_xen", "x86_64_xen" ]
|
||||||
|
GROUPS["coreboot"] = [ "i386_coreboot", "arm_coreboot" ]
|
||||||
|
|
||||||
# emu is a special case so many core functionality isn't needed on this platform
|
# emu is a special case so many core functionality isn't needed on this platform
|
||||||
GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
GROUPS["noemu"] = GRUB_PLATFORMS[:]; GROUPS["noemu"].remove("emu")
|
||||||
|
@ -61,24 +66,24 @@ GROUPS["cmos"] = GROUPS["x86"][:] + ["mips_loongson", "mips_qemu_mips",
|
||||||
"sparc64_ieee1275", "powerpc_ieee1275"]
|
"sparc64_ieee1275", "powerpc_ieee1275"]
|
||||||
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi");
|
GROUPS["cmos"].remove("i386_efi"); GROUPS["cmos"].remove("x86_64_efi");
|
||||||
GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"]
|
GROUPS["pci"] = GROUPS["x86"] + ["mips_loongson"]
|
||||||
GROUPS["usb"] = GROUPS["pci"]
|
GROUPS["usb"] = GROUPS["pci"] + ["arm_coreboot"]
|
||||||
|
|
||||||
# If gfxterm is main output console integrate it into kernel
|
# If gfxterm is main output console integrate it into kernel
|
||||||
GROUPS["videoinkernel"] = ["mips_loongson", "i386_coreboot" ]
|
GROUPS["videoinkernel"] = ["mips_loongson", "i386_coreboot", "arm_coreboot" ]
|
||||||
GROUPS["videomodules"] = GRUB_PLATFORMS[:];
|
GROUPS["videomodules"] = GRUB_PLATFORMS[:];
|
||||||
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
|
for i in GROUPS["videoinkernel"]: GROUPS["videomodules"].remove(i)
|
||||||
|
|
||||||
# Similar for terminfo
|
# Similar for terminfo
|
||||||
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
GROUPS["terminfoinkernel"] = [ "emu", "mips_loongson", "mips_arc", "mips_qemu_mips", "i386_xen_pvh" ] + GROUPS["xen"] + GROUPS["ieee1275"] + GROUPS["uboot"];
|
||||||
GROUPS["terminfomodule"] = GRUB_PLATFORMS[:];
|
GROUPS["terminfomodule"] = GRUB_PLATFORMS[:];
|
||||||
for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
|
for i in GROUPS["terminfoinkernel"]: GROUPS["terminfomodule"].remove(i)
|
||||||
|
|
||||||
# Flattened Device Trees (FDT)
|
# Flattened Device Trees (FDT)
|
||||||
GROUPS["fdt"] = [ "arm64_efi", "arm_uboot", "arm_efi" ]
|
GROUPS["fdt"] = [ "arm64_efi", "arm_uboot", "arm_efi", "riscv32_efi", "riscv64_efi" ]
|
||||||
|
|
||||||
# Needs software helpers for division
|
# Needs software helpers for division
|
||||||
# Must match GRUB_DIVISION_IN_SOFTWARE in misc.h
|
# Must match GRUB_DIVISION_IN_SOFTWARE in misc.h
|
||||||
GROUPS["softdiv"] = GROUPS["arm"] + ["ia64_efi"]
|
GROUPS["softdiv"] = GROUPS["arm"] + ["ia64_efi"] + GROUPS["riscv32"]
|
||||||
GROUPS["no_softdiv"] = GRUB_PLATFORMS[:]
|
GROUPS["no_softdiv"] = GRUB_PLATFORMS[:]
|
||||||
for i in GROUPS["softdiv"]: GROUPS["no_softdiv"].remove(i)
|
for i in GROUPS["softdiv"]: GROUPS["no_softdiv"].remove(i)
|
||||||
|
|
||||||
|
@ -761,7 +766,7 @@ def image(defn, platform):
|
||||||
if test x$(TARGET_APPLE_LINKER) = x1; then \
|
if test x$(TARGET_APPLE_LINKER) = x1; then \
|
||||||
$(MACHO2IMG) $< $@; \
|
$(MACHO2IMG) $< $@; \
|
||||||
else \
|
else \
|
||||||
$(TARGET_OBJCOPY) $(""" + cname(defn) + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .MIPS.abiflags -R .reginfo -R .rel.dyn -R .note.gnu.gold-version -R .ARM.exidx $< $@; \
|
$(TARGET_OBJCOPY) $(""" + cname(defn) + """_OBJCOPYFLAGS) --strip-unneeded -R .note -R .comment -R .note.gnu.build-id -R .MIPS.abiflags -R .reginfo -R .rel.dyn -R .note.gnu.gold-version -R .note.gnu.property -R .ARM.exidx $< $@; \
|
||||||
fi
|
fi
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,20 @@ KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if COND_i386_xen_pvh
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/int.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
||||||
|
endif
|
||||||
|
|
||||||
if COND_i386_efi
|
if COND_i386_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
@ -111,8 +124,9 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/pmtimer.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_i386_coreboot
|
if COND_i386_coreboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/coreboot/lbio.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/coreboot/lbio.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
|
||||||
|
@ -122,6 +136,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_i386_multiboot
|
if COND_i386_multiboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
endif
|
endif
|
||||||
|
@ -132,6 +147,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_i386_ieee1275
|
if COND_i386_ieee1275
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||||
|
@ -140,6 +156,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_i386_xen
|
if COND_i386_xen
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/xen/hypercall.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||||
|
@ -158,6 +175,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COND_x86_64_efi
|
if COND_x86_64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||||
|
@ -239,8 +257,21 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if COND_arm_coreboot
|
||||||
|
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdt.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/dma.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/coreboot/kernel.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdtbus.h
|
||||||
|
endif
|
||||||
|
|
||||||
if COND_arm_efi
|
if COND_arm_efi
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/efi/loader.h
|
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||||
|
@ -253,6 +284,18 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if COND_riscv32_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
if COND_riscv64_efi
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||||
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/acpi.h
|
||||||
|
endif
|
||||||
|
|
||||||
if COND_emu
|
if COND_emu
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/datetime.h
|
||||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h
|
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/emu/misc.h
|
||||||
|
@ -278,7 +321,7 @@ BUILT_SOURCES += symlist.h
|
||||||
|
|
||||||
symlist.c: symlist.h gensymlist.sh
|
symlist.c: symlist.h gensymlist.sh
|
||||||
$(TARGET_CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS_KERNEL) $(CPPFLAGS) -DGRUB_SYMBOL_GENERATOR=1 symlist.h > symlist.p || (rm -f symlist.p; exit 1)
|
$(TARGET_CPP) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS_KERNEL) $(CPPFLAGS) -DGRUB_SYMBOL_GENERATOR=1 symlist.h > symlist.p || (rm -f symlist.p; exit 1)
|
||||||
cat symlist.p | /bin/sh $(srcdir)/gensymlist.sh $(top_builddir)/config.h $(KERNEL_HEADER_FILES) >$@ || (rm -f $@; exit 1)
|
cat symlist.p | $(SHELL) $(srcdir)/gensymlist.sh $(top_builddir)/config.h $(KERNEL_HEADER_FILES) >$@ || (rm -f $@; exit 1)
|
||||||
rm -f symlist.p
|
rm -f symlist.p
|
||||||
CLEANFILES += symlist.c
|
CLEANFILES += symlist.c
|
||||||
BUILT_SOURCES += symlist.c
|
BUILT_SOURCES += symlist.c
|
||||||
|
@ -358,6 +401,16 @@ terminal.lst: $(MARKER_FILES)
|
||||||
platform_DATA += terminal.lst
|
platform_DATA += terminal.lst
|
||||||
CLEANFILES += terminal.lst
|
CLEANFILES += terminal.lst
|
||||||
|
|
||||||
|
fdt.lst: $(MARKER_FILES)
|
||||||
|
(for pp in $^; do \
|
||||||
|
b=`basename $$pp .marker`; \
|
||||||
|
sed -n \
|
||||||
|
-e "/FDT_DRIVER_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/i\1: $$b/;p;}" \
|
||||||
|
-e "/FDT_DRIVER_LIST_MARKER *( *\"/{s/.*( *\"\([^\"]*\)\".*/o\1: $$b/;p;}" $$pp; \
|
||||||
|
done) | sort -u > $@
|
||||||
|
platform_DATA += fdt.lst
|
||||||
|
CLEANFILES += fdt.lst
|
||||||
|
|
||||||
parttool.lst: $(MARKER_FILES)
|
parttool.lst: $(MARKER_FILES)
|
||||||
(for pp in $^; do \
|
(for pp in $^; do \
|
||||||
b=`basename $$pp .marker`; \
|
b=`basename $$pp .marker`; \
|
||||||
|
|
|
@ -65,20 +65,28 @@ kernel = {
|
||||||
arm64_efi_ldflags = '-Wl,-r,-d';
|
arm64_efi_ldflags = '-Wl,-r,-d';
|
||||||
arm64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
|
arm64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
|
||||||
|
|
||||||
|
riscv32_efi_ldflags = '-Wl,-r,-d';
|
||||||
|
riscv32_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
|
||||||
|
|
||||||
|
riscv64_efi_ldflags = '-Wl,-r,-d';
|
||||||
|
riscv64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version -R .eh_frame';
|
||||||
|
|
||||||
i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
|
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
|
||||||
i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
|
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
|
||||||
i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
|
i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
|
||||||
i386_multiboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
i386_multiboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
|
i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
|
||||||
i386_ieee1275_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
i386_ieee1275_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
i386_ieee1275_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x10000';
|
i386_ieee1275_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x10000';
|
||||||
i386_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
i386_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
i386_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
|
i386_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
|
||||||
x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
|
x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
|
||||||
|
i386_xen_pvh_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||||
|
i386_xen_pvh_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x100000';
|
||||||
|
|
||||||
mips_loongson_ldflags = '-Wl,-Ttext,0x80200000';
|
mips_loongson_ldflags = '-Wl,-Ttext,0x80200000';
|
||||||
powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
|
powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
|
||||||
|
@ -92,12 +100,15 @@ kernel = {
|
||||||
emu_cppflags = '$(CPPFLAGS_GNULIB)';
|
emu_cppflags = '$(CPPFLAGS_GNULIB)';
|
||||||
arm_uboot_ldflags = '-Wl,-r,-d';
|
arm_uboot_ldflags = '-Wl,-r,-d';
|
||||||
arm_uboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
arm_uboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||||
|
arm_coreboot_ldflags = '-Wl,-r,-d';
|
||||||
|
arm_coreboot_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||||
|
|
||||||
i386_pc_startup = kern/i386/pc/startup.S;
|
i386_pc_startup = kern/i386/pc/startup.S;
|
||||||
i386_efi_startup = kern/i386/efi/startup.S;
|
i386_efi_startup = kern/i386/efi/startup.S;
|
||||||
x86_64_efi_startup = kern/x86_64/efi/startup.S;
|
x86_64_efi_startup = kern/x86_64/efi/startup.S;
|
||||||
i386_xen_startup = kern/i386/xen/startup.S;
|
i386_xen_startup = kern/i386/xen/startup.S;
|
||||||
x86_64_xen_startup = kern/x86_64/xen/startup.S;
|
x86_64_xen_startup = kern/x86_64/xen/startup.S;
|
||||||
|
i386_xen_pvh_startup = kern/i386/xen/startup_pvh.S;
|
||||||
i386_qemu_startup = kern/i386/qemu/startup.S;
|
i386_qemu_startup = kern/i386/qemu/startup.S;
|
||||||
i386_ieee1275_startup = kern/i386/ieee1275/startup.S;
|
i386_ieee1275_startup = kern/i386/ieee1275/startup.S;
|
||||||
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
||||||
|
@ -105,9 +116,12 @@ kernel = {
|
||||||
mips_startup = kern/mips/startup.S;
|
mips_startup = kern/mips/startup.S;
|
||||||
sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S;
|
sparc64_ieee1275_startup = kern/sparc64/ieee1275/crt0.S;
|
||||||
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
|
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
|
||||||
arm_uboot_startup = kern/arm/uboot/startup.S;
|
arm_uboot_startup = kern/arm/startup.S;
|
||||||
|
arm_coreboot_startup = kern/arm/startup.S;
|
||||||
arm_efi_startup = kern/arm/efi/startup.S;
|
arm_efi_startup = kern/arm/efi/startup.S;
|
||||||
arm64_efi_startup = kern/arm64/efi/startup.S;
|
arm64_efi_startup = kern/arm64/efi/startup.S;
|
||||||
|
riscv32_efi_startup = kern/riscv/efi/startup.S;
|
||||||
|
riscv64_efi_startup = kern/riscv/efi/startup.S;
|
||||||
|
|
||||||
common = kern/command.c;
|
common = kern/command.c;
|
||||||
common = kern/corecmd.c;
|
common = kern/corecmd.c;
|
||||||
|
@ -149,6 +163,21 @@ kernel = {
|
||||||
uboot = kern/uboot/init.c;
|
uboot = kern/uboot/init.c;
|
||||||
uboot = kern/uboot/hw.c;
|
uboot = kern/uboot/hw.c;
|
||||||
uboot = term/uboot/console.c;
|
uboot = term/uboot/console.c;
|
||||||
|
arm_uboot = kern/arm/uboot/init.c;
|
||||||
|
arm_uboot = kern/arm/uboot/uboot.S;
|
||||||
|
|
||||||
|
arm_coreboot = kern/arm/coreboot/init.c;
|
||||||
|
arm_coreboot = kern/arm/coreboot/timer.c;
|
||||||
|
arm_coreboot = kern/arm/coreboot/coreboot.S;
|
||||||
|
arm_coreboot = lib/fdt.c;
|
||||||
|
arm_coreboot = bus/fdt.c;
|
||||||
|
arm_coreboot = term/ps2.c;
|
||||||
|
arm_coreboot = term/arm/pl050.c;
|
||||||
|
arm_coreboot = term/arm/cros.c;
|
||||||
|
arm_coreboot = term/arm/cros_ec.c;
|
||||||
|
arm_coreboot = bus/spi/rk3288_spi.c;
|
||||||
|
arm_coreboot = commands/keylayouts.c;
|
||||||
|
arm_coreboot = kern/arm/coreboot/dma.c;
|
||||||
|
|
||||||
terminfoinkernel = term/terminfo.c;
|
terminfoinkernel = term/terminfo.c;
|
||||||
terminfoinkernel = term/tparm.c;
|
terminfoinkernel = term/tparm.c;
|
||||||
|
@ -159,12 +188,13 @@ kernel = {
|
||||||
|
|
||||||
i386 = kern/i386/dl.c;
|
i386 = kern/i386/dl.c;
|
||||||
i386_xen = kern/i386/dl.c;
|
i386_xen = kern/i386/dl.c;
|
||||||
|
i386_xen_pvh = kern/i386/dl.c;
|
||||||
|
|
||||||
i386_coreboot = kern/i386/coreboot/init.c;
|
i386_coreboot = kern/i386/coreboot/init.c;
|
||||||
i386_multiboot = kern/i386/coreboot/init.c;
|
i386_multiboot = kern/i386/coreboot/init.c;
|
||||||
i386_qemu = kern/i386/qemu/init.c;
|
i386_qemu = kern/i386/qemu/init.c;
|
||||||
i386_coreboot_multiboot_qemu = term/i386/pc/vga_text.c;
|
i386_coreboot_multiboot_qemu = term/i386/pc/vga_text.c;
|
||||||
i386_coreboot = video/i386/coreboot/cbfb.c;
|
coreboot = video/coreboot/cbfb.c;
|
||||||
|
|
||||||
efi = disk/efi/efidisk.c;
|
efi = disk/efi/efidisk.c;
|
||||||
efi = kern/efi/efi.c;
|
efi = kern/efi/efi.c;
|
||||||
|
@ -204,6 +234,14 @@ kernel = {
|
||||||
xen = disk/xen/xendisk.c;
|
xen = disk/xen/xendisk.c;
|
||||||
xen = commands/boot.c;
|
xen = commands/boot.c;
|
||||||
|
|
||||||
|
i386_xen_pvh = commands/boot.c;
|
||||||
|
i386_xen_pvh = disk/xen/xendisk.c;
|
||||||
|
i386_xen_pvh = kern/i386/tsc.c;
|
||||||
|
i386_xen_pvh = kern/i386/xen/tsc.c;
|
||||||
|
i386_xen_pvh = kern/i386/xen/pvh.c;
|
||||||
|
i386_xen_pvh = kern/xen/init.c;
|
||||||
|
i386_xen_pvh = term/xen/console.c;
|
||||||
|
|
||||||
ia64_efi = kern/ia64/efi/startup.S;
|
ia64_efi = kern/ia64/efi/startup.S;
|
||||||
ia64_efi = kern/ia64/efi/init.c;
|
ia64_efi = kern/ia64/efi/init.c;
|
||||||
ia64_efi = kern/ia64/dl.c;
|
ia64_efi = kern/ia64/dl.c;
|
||||||
|
@ -211,12 +249,17 @@ kernel = {
|
||||||
ia64_efi = kern/ia64/cache.c;
|
ia64_efi = kern/ia64/cache.c;
|
||||||
|
|
||||||
arm_efi = kern/arm/efi/init.c;
|
arm_efi = kern/arm/efi/init.c;
|
||||||
arm_efi = kern/arm/efi/misc.c;
|
|
||||||
arm_efi = kern/efi/fdt.c;
|
arm_efi = kern/efi/fdt.c;
|
||||||
|
|
||||||
arm64_efi = kern/arm64/efi/init.c;
|
arm64_efi = kern/arm64/efi/init.c;
|
||||||
arm64_efi = kern/efi/fdt.c;
|
arm64_efi = kern/efi/fdt.c;
|
||||||
|
|
||||||
|
riscv32_efi = kern/riscv/efi/init.c;
|
||||||
|
riscv32_efi = kern/efi/fdt.c;
|
||||||
|
|
||||||
|
riscv64_efi = kern/riscv/efi/init.c;
|
||||||
|
riscv64_efi = kern/efi/fdt.c;
|
||||||
|
|
||||||
i386_pc = kern/i386/pc/init.c;
|
i386_pc = kern/i386/pc/init.c;
|
||||||
i386_pc = kern/i386/pc/mmap.c;
|
i386_pc = kern/i386/pc/mmap.c;
|
||||||
i386_pc = term/i386/pc/console.c;
|
i386_pc = term/i386/pc/console.c;
|
||||||
|
@ -225,8 +268,10 @@ kernel = {
|
||||||
i386_qemu = kern/vga_init.c;
|
i386_qemu = kern/vga_init.c;
|
||||||
i386_qemu = kern/i386/qemu/mmap.c;
|
i386_qemu = kern/i386/qemu/mmap.c;
|
||||||
|
|
||||||
i386_coreboot = kern/i386/coreboot/mmap.c;
|
coreboot = kern/coreboot/mmap.c;
|
||||||
i386_coreboot = kern/i386/coreboot/cbtable.c;
|
i386_coreboot = kern/i386/coreboot/cbtable.c;
|
||||||
|
coreboot = kern/coreboot/cbtable.c;
|
||||||
|
arm_coreboot = kern/arm/coreboot/cbtable.c;
|
||||||
|
|
||||||
i386_multiboot = kern/i386/multiboot_mmap.c;
|
i386_multiboot = kern/i386/multiboot_mmap.c;
|
||||||
|
|
||||||
|
@ -238,6 +283,7 @@ kernel = {
|
||||||
mips_qemu_mips = term/ns8250.c;
|
mips_qemu_mips = term/ns8250.c;
|
||||||
mips_qemu_mips = term/serial.c;
|
mips_qemu_mips = term/serial.c;
|
||||||
mips_qemu_mips = term/at_keyboard.c;
|
mips_qemu_mips = term/at_keyboard.c;
|
||||||
|
mips_qemu_mips = term/ps2.c;
|
||||||
mips_qemu_mips = commands/boot.c;
|
mips_qemu_mips = commands/boot.c;
|
||||||
mips_qemu_mips = commands/keylayouts.c;
|
mips_qemu_mips = commands/keylayouts.c;
|
||||||
mips_qemu_mips = term/i386/pc/vga_text.c;
|
mips_qemu_mips = term/i386/pc/vga_text.c;
|
||||||
|
@ -253,6 +299,7 @@ kernel = {
|
||||||
mips_loongson = bus/pci.c;
|
mips_loongson = bus/pci.c;
|
||||||
mips_loongson = kern/mips/loongson/init.c;
|
mips_loongson = kern/mips/loongson/init.c;
|
||||||
mips_loongson = term/at_keyboard.c;
|
mips_loongson = term/at_keyboard.c;
|
||||||
|
mips_loongson = term/ps2.c;
|
||||||
mips_loongson = commands/boot.c;
|
mips_loongson = commands/boot.c;
|
||||||
mips_loongson = term/serial.c;
|
mips_loongson = term/serial.c;
|
||||||
mips_loongson = video/sm712.c;
|
mips_loongson = video/sm712.c;
|
||||||
|
@ -270,6 +317,7 @@ kernel = {
|
||||||
sparc64_ieee1275 = kern/sparc64/cache.S;
|
sparc64_ieee1275 = kern/sparc64/cache.S;
|
||||||
sparc64_ieee1275 = kern/sparc64/dl.c;
|
sparc64_ieee1275 = kern/sparc64/dl.c;
|
||||||
sparc64_ieee1275 = kern/sparc64/ieee1275/ieee1275.c;
|
sparc64_ieee1275 = kern/sparc64/ieee1275/ieee1275.c;
|
||||||
|
sparc64_ieee1275 = disk/ieee1275/obdisk.c;
|
||||||
|
|
||||||
arm = kern/arm/dl.c;
|
arm = kern/arm/dl.c;
|
||||||
arm = kern/arm/dl_helper.c;
|
arm = kern/arm/dl_helper.c;
|
||||||
|
@ -284,6 +332,14 @@ kernel = {
|
||||||
arm64 = kern/arm64/dl.c;
|
arm64 = kern/arm64/dl.c;
|
||||||
arm64 = kern/arm64/dl_helper.c;
|
arm64 = kern/arm64/dl_helper.c;
|
||||||
|
|
||||||
|
riscv32 = kern/riscv/cache.c;
|
||||||
|
riscv32 = kern/riscv/cache_flush.S;
|
||||||
|
riscv32 = kern/riscv/dl.c;
|
||||||
|
|
||||||
|
riscv64 = kern/riscv/cache.c;
|
||||||
|
riscv64 = kern/riscv/cache_flush.S;
|
||||||
|
riscv64 = kern/riscv/dl.c;
|
||||||
|
|
||||||
emu = disk/host.c;
|
emu = disk/host.c;
|
||||||
emu = kern/emu/cache_s.S;
|
emu = kern/emu/cache_s.S;
|
||||||
emu = kern/emu/hostdisk.c;
|
emu = kern/emu/hostdisk.c;
|
||||||
|
@ -339,7 +395,7 @@ program = {
|
||||||
|
|
||||||
ldadd = 'kernel.exec$(EXEEXT)';
|
ldadd = 'kernel.exec$(EXEEXT)';
|
||||||
ldadd = '$(MODULE_FILES)';
|
ldadd = '$(MODULE_FILES)';
|
||||||
ldadd = 'gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = 'lib/gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
|
|
||||||
enable = emu;
|
enable = emu;
|
||||||
};
|
};
|
||||||
|
@ -351,7 +407,7 @@ program = {
|
||||||
emu_nodist = symlist.c;
|
emu_nodist = symlist.c;
|
||||||
|
|
||||||
ldadd = 'kernel.exec$(EXEEXT)';
|
ldadd = 'kernel.exec$(EXEEXT)';
|
||||||
ldadd = 'gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
ldadd = 'lib/gnulib/libgnu.a $(LIBINTL) $(LIBUTIL) $(LIBSDL) $(LIBUSB) $(LIBPCIACCESS) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||||
|
|
||||||
enable = emu;
|
enable = emu;
|
||||||
};
|
};
|
||||||
|
@ -369,8 +425,14 @@ image = {
|
||||||
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
||||||
i386_qemu_ccasflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
i386_qemu_ccasflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
||||||
|
|
||||||
sparc64_ieee1275_objcopyflags = '-O a.out-sunos-big';
|
/* The entry point for a.out binaries on sparc64 starts
|
||||||
sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x4000';
|
at 0x4000. Since we are writing the 32 bytes long a.out
|
||||||
|
header in the assembly code ourselves, we need to tell
|
||||||
|
the linker to adjust the start of the text segment to
|
||||||
|
0x4000 - 0x20 = 0x3fe0.
|
||||||
|
*/
|
||||||
|
sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x3fe0';
|
||||||
|
sparc64_ieee1275_objcopyflags = '-O binary';
|
||||||
|
|
||||||
objcopyflags = '-O binary';
|
objcopyflags = '-O binary';
|
||||||
enable = i386_pc;
|
enable = i386_pc;
|
||||||
|
@ -399,8 +461,10 @@ image = {
|
||||||
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
|
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x7C00';
|
||||||
|
|
||||||
sparc64_ieee1275 = boot/sparc64/ieee1275/boot.S;
|
sparc64_ieee1275 = boot/sparc64/ieee1275/boot.S;
|
||||||
sparc64_ieee1275_objcopyflags = '-O a.out-sunos-big';
|
|
||||||
sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x4000';
|
/* See comment for sparc64_ieee1275_ldflags above. */
|
||||||
|
sparc64_ieee1275_ldflags = ' -Wl,-Ttext=0x3fe0';
|
||||||
|
sparc64_ieee1275_objcopyflags = '-O binary';
|
||||||
sparc64_ieee1275_cppflags = '-DCDBOOT=1';
|
sparc64_ieee1275_cppflags = '-DCDBOOT=1';
|
||||||
|
|
||||||
objcopyflags = '-O binary';
|
objcopyflags = '-O binary';
|
||||||
|
@ -574,7 +638,10 @@ module = {
|
||||||
module = {
|
module = {
|
||||||
name = ehci;
|
name = ehci;
|
||||||
common = bus/usb/ehci.c;
|
common = bus/usb/ehci.c;
|
||||||
|
arm_coreboot = bus/usb/ehci-fdt.c;
|
||||||
|
pci = bus/usb/ehci-pci.c;
|
||||||
enable = pci;
|
enable = pci;
|
||||||
|
enable = arm_coreboot;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -641,6 +708,7 @@ module = {
|
||||||
module = {
|
module = {
|
||||||
name = cbtable;
|
name = cbtable;
|
||||||
common = kern/i386/coreboot/cbtable.c;
|
common = kern/i386/coreboot/cbtable.c;
|
||||||
|
common = kern/coreboot/cbtable.c;
|
||||||
enable = i386_pc;
|
enable = i386_pc;
|
||||||
enable = i386_efi;
|
enable = i386_efi;
|
||||||
enable = i386_qemu;
|
enable = i386_qemu;
|
||||||
|
@ -671,7 +739,7 @@ module = {
|
||||||
name = regexp;
|
name = regexp;
|
||||||
common = commands/regexp.c;
|
common = commands/regexp.c;
|
||||||
common = commands/wildcard.c;
|
common = commands/wildcard.c;
|
||||||
common = gnulib/regex.c;
|
common = lib/gnulib/regex.c;
|
||||||
cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
|
cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
|
||||||
cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)';
|
cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)';
|
||||||
};
|
};
|
||||||
|
@ -754,6 +822,9 @@ module = {
|
||||||
enable = arm_efi;
|
enable = arm_efi;
|
||||||
enable = arm64_efi;
|
enable = arm64_efi;
|
||||||
enable = arm_uboot;
|
enable = arm_uboot;
|
||||||
|
enable = arm_coreboot;
|
||||||
|
enable = riscv32_efi;
|
||||||
|
enable = riscv64_efi;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -775,6 +846,7 @@ module = {
|
||||||
name = cpuid;
|
name = cpuid;
|
||||||
common = commands/i386/cpuid.c;
|
common = commands/i386/cpuid.c;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = i386_xen;
|
enable = i386_xen;
|
||||||
enable = x86_64_xen;
|
enable = x86_64_xen;
|
||||||
};
|
};
|
||||||
|
@ -834,27 +906,27 @@ module = {
|
||||||
i386_coreboot = lib/i386/halt.c;
|
i386_coreboot = lib/i386/halt.c;
|
||||||
i386_qemu = lib/i386/halt.c;
|
i386_qemu = lib/i386/halt.c;
|
||||||
xen = lib/xen/halt.c;
|
xen = lib/xen/halt.c;
|
||||||
|
i386_xen_pvh = lib/xen/halt.c;
|
||||||
efi = lib/efi/halt.c;
|
efi = lib/efi/halt.c;
|
||||||
ieee1275 = lib/ieee1275/halt.c;
|
ieee1275 = lib/ieee1275/halt.c;
|
||||||
emu = lib/emu/halt.c;
|
emu = lib/emu/halt.c;
|
||||||
uboot = lib/uboot/halt.c;
|
uboot = lib/dummy/halt.c;
|
||||||
|
arm_coreboot = lib/dummy/halt.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = reboot;
|
name = reboot;
|
||||||
i386 = lib/i386/reboot.c;
|
i386 = lib/i386/reboot.c;
|
||||||
i386 = lib/i386/reboot_trampoline.S;
|
i386 = lib/i386/reboot_trampoline.S;
|
||||||
ia64_efi = lib/efi/reboot.c;
|
|
||||||
x86_64_efi = lib/efi/reboot.c;
|
|
||||||
arm_efi = lib/efi/reboot.c;
|
|
||||||
arm64_efi = lib/efi/reboot.c;
|
|
||||||
powerpc_ieee1275 = lib/ieee1275/reboot.c;
|
powerpc_ieee1275 = lib/ieee1275/reboot.c;
|
||||||
sparc64_ieee1275 = lib/ieee1275/reboot.c;
|
sparc64_ieee1275 = lib/ieee1275/reboot.c;
|
||||||
mips_arc = lib/mips/arc/reboot.c;
|
mips_arc = lib/mips/arc/reboot.c;
|
||||||
mips_loongson = lib/mips/loongson/reboot.c;
|
mips_loongson = lib/mips/loongson/reboot.c;
|
||||||
mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
|
mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
|
||||||
xen = lib/xen/reboot.c;
|
xen = lib/xen/reboot.c;
|
||||||
|
i386_xen_pvh = lib/xen/reboot.c;
|
||||||
uboot = lib/uboot/reboot.c;
|
uboot = lib/uboot/reboot.c;
|
||||||
|
arm_coreboot = lib/dummy/reboot.c;
|
||||||
common = commands/reboot.c;
|
common = commands/reboot.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -864,16 +936,26 @@ module = {
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = verify;
|
name = pgp;
|
||||||
common = commands/verify.c;
|
common = commands/pgp.c;
|
||||||
cflags = '$(CFLAGS_POSIX)';
|
cflags = '$(CFLAGS_POSIX)';
|
||||||
cppflags = '-I$(srcdir)/lib/posix_wrap';
|
cppflags = '-I$(srcdir)/lib/posix_wrap';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = verifiers;
|
||||||
|
common = commands/verifiers.c;
|
||||||
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = shim_lock;
|
||||||
|
common = commands/efi/shim_lock.c;
|
||||||
|
enable = efi;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = hdparm;
|
name = hdparm;
|
||||||
common = commands/hdparm.c;
|
common = commands/hdparm.c;
|
||||||
common = lib/hexdump.c;
|
|
||||||
enable = pci;
|
enable = pci;
|
||||||
enable = mips_qemu_mips;
|
enable = mips_qemu_mips;
|
||||||
};
|
};
|
||||||
|
@ -1015,6 +1097,21 @@ module = {
|
||||||
common = commands/sleep.c;
|
common = commands/sleep.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = smbios;
|
||||||
|
|
||||||
|
common = commands/smbios.c;
|
||||||
|
efi = commands/efi/smbios.c;
|
||||||
|
i386_pc = commands/i386/pc/smbios.c;
|
||||||
|
i386_coreboot = commands/i386/pc/smbios.c;
|
||||||
|
i386_multiboot = commands/i386/pc/smbios.c;
|
||||||
|
|
||||||
|
enable = efi;
|
||||||
|
enable = i386_pc;
|
||||||
|
enable = i386_coreboot;
|
||||||
|
enable = i386_multiboot;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = suspend;
|
name = suspend;
|
||||||
ieee1275 = commands/ieee1275/suspend.c;
|
ieee1275 = commands/ieee1275/suspend.c;
|
||||||
|
@ -1079,10 +1176,27 @@ module = {
|
||||||
common = disk/cryptodisk.c;
|
common = disk/cryptodisk.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = json;
|
||||||
|
common = lib/json/json.c;
|
||||||
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = afsplitter;
|
||||||
|
common = disk/AFSplitter.c;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = luks;
|
name = luks;
|
||||||
common = disk/luks.c;
|
common = disk/luks.c;
|
||||||
common = disk/AFSplitter.c;
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = luks2;
|
||||||
|
common = disk/luks2.c;
|
||||||
|
common = lib/gnulib/base64.c;
|
||||||
|
cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
|
||||||
|
cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB) -I$(srcdir)/lib/json';
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -1237,12 +1351,27 @@ module = {
|
||||||
common = fs/bfs.c;
|
common = fs/bfs.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = zstd;
|
||||||
|
common = lib/zstd/debug.c;
|
||||||
|
common = lib/zstd/entropy_common.c;
|
||||||
|
common = lib/zstd/error_private.c;
|
||||||
|
common = lib/zstd/fse_decompress.c;
|
||||||
|
common = lib/zstd/huf_decompress.c;
|
||||||
|
common = lib/zstd/module.c;
|
||||||
|
common = lib/zstd/xxhash.c;
|
||||||
|
common = lib/zstd/zstd_common.c;
|
||||||
|
common = lib/zstd/zstd_decompress.c;
|
||||||
|
cflags = '$(CFLAGS_POSIX) -Wno-undef';
|
||||||
|
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/zstd';
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = btrfs;
|
name = btrfs;
|
||||||
common = fs/btrfs.c;
|
common = fs/btrfs.c;
|
||||||
common = lib/crc.c;
|
common = lib/crc.c;
|
||||||
cflags = '$(CFLAGS_POSIX) -Wno-undef';
|
cflags = '$(CFLAGS_POSIX) -Wno-undef';
|
||||||
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/minilzo -DMINILZO_HAVE_CONFIG_H';
|
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/minilzo -I$(srcdir)/lib/zstd -DMINILZO_HAVE_CONFIG_H';
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -1290,6 +1419,11 @@ module = {
|
||||||
common = fs/exfat.c;
|
common = fs/exfat.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = f2fs;
|
||||||
|
common = fs/f2fs.c;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = fshelp;
|
name = fshelp;
|
||||||
common = fs/fshelp.c;
|
common = fs/fshelp.c;
|
||||||
|
@ -1517,12 +1651,18 @@ module = {
|
||||||
x86 = lib/i386/relocator16.S;
|
x86 = lib/i386/relocator16.S;
|
||||||
x86 = lib/i386/relocator32.S;
|
x86 = lib/i386/relocator32.S;
|
||||||
x86 = lib/i386/relocator64.S;
|
x86 = lib/i386/relocator64.S;
|
||||||
|
i386_xen_pvh = lib/i386/relocator16.S;
|
||||||
|
i386_xen_pvh = lib/i386/relocator32.S;
|
||||||
|
i386_xen_pvh = lib/i386/relocator64.S;
|
||||||
i386 = lib/i386/relocator_asm.S;
|
i386 = lib/i386/relocator_asm.S;
|
||||||
|
i386_xen_pvh = lib/i386/relocator_asm.S;
|
||||||
x86_64 = lib/x86_64/relocator_asm.S;
|
x86_64 = lib/x86_64/relocator_asm.S;
|
||||||
i386_xen = lib/i386/relocator_asm.S;
|
i386_xen = lib/i386/relocator_asm.S;
|
||||||
x86_64_xen = lib/x86_64/relocator_asm.S;
|
x86_64_xen = lib/x86_64/relocator_asm.S;
|
||||||
x86 = lib/i386/relocator.c;
|
x86 = lib/i386/relocator.c;
|
||||||
x86 = lib/i386/relocator_common_c.c;
|
x86 = lib/i386/relocator_common_c.c;
|
||||||
|
i386_xen_pvh = lib/i386/relocator.c;
|
||||||
|
i386_xen_pvh = lib/i386/relocator_common_c.c;
|
||||||
ieee1275 = lib/ieee1275/relocator.c;
|
ieee1275 = lib/ieee1275/relocator.c;
|
||||||
efi = lib/efi/relocator.c;
|
efi = lib/efi/relocator.c;
|
||||||
mips = lib/mips/relocator_asm.S;
|
mips = lib/mips/relocator_asm.S;
|
||||||
|
@ -1541,22 +1681,25 @@ module = {
|
||||||
enable = mips;
|
enable = mips;
|
||||||
enable = powerpc;
|
enable = powerpc;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = xen;
|
enable = xen;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = datetime;
|
name = datetime;
|
||||||
|
common = lib/datetime.c;
|
||||||
cmos = lib/cmos_datetime.c;
|
cmos = lib/cmos_datetime.c;
|
||||||
efi = lib/efi/datetime.c;
|
efi = lib/efi/datetime.c;
|
||||||
uboot = lib/uboot/datetime.c;
|
uboot = lib/dummy/datetime.c;
|
||||||
|
arm_coreboot = lib/dummy/datetime.c;
|
||||||
sparc64_ieee1275 = lib/ieee1275/datetime.c;
|
sparc64_ieee1275 = lib/ieee1275/datetime.c;
|
||||||
powerpc_ieee1275 = lib/ieee1275/datetime.c;
|
powerpc_ieee1275 = lib/ieee1275/datetime.c;
|
||||||
sparc64_ieee1275 = lib/ieee1275/cmos.c;
|
sparc64_ieee1275 = lib/ieee1275/cmos.c;
|
||||||
powerpc_ieee1275 = lib/ieee1275/cmos.c;
|
powerpc_ieee1275 = lib/ieee1275/cmos.c;
|
||||||
xen = lib/xen/datetime.c;
|
xen = lib/xen/datetime.c;
|
||||||
|
i386_xen_pvh = lib/xen/datetime.c;
|
||||||
|
|
||||||
mips_arc = lib/arc/datetime.c;
|
mips_arc = lib/arc/datetime.c;
|
||||||
enable = noemu;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -1571,6 +1714,7 @@ module = {
|
||||||
extra_dist = lib/ia64/longjmp.S;
|
extra_dist = lib/ia64/longjmp.S;
|
||||||
extra_dist = lib/arm/setjmp.S;
|
extra_dist = lib/arm/setjmp.S;
|
||||||
extra_dist = lib/arm64/setjmp.S;
|
extra_dist = lib/arm64/setjmp.S;
|
||||||
|
extra_dist = lib/riscv/setjmp.S;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
|
@ -1601,8 +1745,6 @@ module = {
|
||||||
module = {
|
module = {
|
||||||
name = linux16;
|
name = linux16;
|
||||||
common = loader/i386/pc/linux.c;
|
common = loader/i386/pc/linux.c;
|
||||||
common = loader/linux.c;
|
|
||||||
common = lib/cmdline.c;
|
|
||||||
enable = x86;
|
enable = x86;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1637,24 +1779,24 @@ module = {
|
||||||
cppflags = "-DGRUB_USE_MULTIBOOT2";
|
cppflags = "-DGRUB_USE_MULTIBOOT2";
|
||||||
|
|
||||||
common = loader/multiboot.c;
|
common = loader/multiboot.c;
|
||||||
common = lib/cmdline.c;
|
|
||||||
common = loader/multiboot_mbi2.c;
|
common = loader/multiboot_mbi2.c;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = mips;
|
enable = mips;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = multiboot;
|
name = multiboot;
|
||||||
common = loader/multiboot.c;
|
common = loader/multiboot.c;
|
||||||
common = lib/cmdline.c;
|
|
||||||
x86 = loader/i386/multiboot_mbi.c;
|
x86 = loader/i386/multiboot_mbi.c;
|
||||||
|
i386_xen_pvh = loader/i386/multiboot_mbi.c;
|
||||||
extra_dist = loader/multiboot_elfxx.c;
|
extra_dist = loader/multiboot_elfxx.c;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
};
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = xen_boot;
|
name = xen_boot;
|
||||||
common = lib/cmdline.c;
|
|
||||||
arm64 = loader/arm64/xen_boot.c;
|
arm64 = loader/arm64/xen_boot.c;
|
||||||
enable = arm64;
|
enable = arm64;
|
||||||
};
|
};
|
||||||
|
@ -1662,14 +1804,20 @@ module = {
|
||||||
module = {
|
module = {
|
||||||
name = linux;
|
name = linux;
|
||||||
x86 = loader/i386/linux.c;
|
x86 = loader/i386/linux.c;
|
||||||
|
i386_xen_pvh = loader/i386/linux.c;
|
||||||
xen = loader/i386/xen.c;
|
xen = loader/i386/xen.c;
|
||||||
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
||||||
|
i386_xen_pvh = lib/i386/pc/vesa_modes_table.c;
|
||||||
mips = loader/mips/linux.c;
|
mips = loader/mips/linux.c;
|
||||||
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
||||||
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
|
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
|
||||||
ia64_efi = loader/ia64/efi/linux.c;
|
ia64_efi = loader/ia64/efi/linux.c;
|
||||||
arm = loader/arm/linux.c;
|
arm_coreboot = loader/arm/linux.c;
|
||||||
|
arm_efi = loader/arm64/linux.c;
|
||||||
|
arm_uboot = loader/arm/linux.c;
|
||||||
arm64 = loader/arm64/linux.c;
|
arm64 = loader/arm64/linux.c;
|
||||||
|
riscv32 = loader/riscv/linux.c;
|
||||||
|
riscv64 = loader/riscv/linux.c;
|
||||||
common = loader/linux.c;
|
common = loader/linux.c;
|
||||||
common = lib/cmdline.c;
|
common = lib/cmdline.c;
|
||||||
enable = noemu;
|
enable = noemu;
|
||||||
|
@ -1677,7 +1825,7 @@ module = {
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = fdt;
|
name = fdt;
|
||||||
arm64 = loader/arm64/fdt.c;
|
efi = loader/efi/fdt.c;
|
||||||
common = lib/fdt.c;
|
common = lib/fdt.c;
|
||||||
enable = fdt;
|
enable = fdt;
|
||||||
};
|
};
|
||||||
|
@ -1749,6 +1897,8 @@ module = {
|
||||||
common = mmap/mmap.c;
|
common = mmap/mmap.c;
|
||||||
x86 = mmap/i386/uppermem.c;
|
x86 = mmap/i386/uppermem.c;
|
||||||
x86 = mmap/i386/mmap.c;
|
x86 = mmap/i386/mmap.c;
|
||||||
|
i386_xen_pvh = mmap/i386/uppermem.c;
|
||||||
|
i386_xen_pvh = mmap/i386/mmap.c;
|
||||||
|
|
||||||
i386_pc = mmap/i386/pc/mmap.c;
|
i386_pc = mmap/i386/pc/mmap.c;
|
||||||
i386_pc = mmap/i386/pc/mmap_helper.S;
|
i386_pc = mmap/i386/pc/mmap_helper.S;
|
||||||
|
@ -1758,9 +1908,12 @@ module = {
|
||||||
mips = mmap/mips/uppermem.c;
|
mips = mmap/mips/uppermem.c;
|
||||||
|
|
||||||
enable = x86;
|
enable = x86;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = ia64_efi;
|
enable = ia64_efi;
|
||||||
enable = arm_efi;
|
enable = arm_efi;
|
||||||
enable = arm64_efi;
|
enable = arm64_efi;
|
||||||
|
enable = riscv32_efi;
|
||||||
|
enable = riscv64_efi;
|
||||||
enable = mips;
|
enable = mips;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1773,7 +1926,6 @@ module = {
|
||||||
common = normal/autofs.c;
|
common = normal/autofs.c;
|
||||||
common = normal/color.c;
|
common = normal/color.c;
|
||||||
common = normal/completion.c;
|
common = normal/completion.c;
|
||||||
common = normal/datetime.c;
|
|
||||||
common = normal/menu.c;
|
common = normal/menu.c;
|
||||||
common = normal/menu_entry.c;
|
common = normal/menu_entry.c;
|
||||||
common = normal/menu_text.c;
|
common = normal/menu_text.c;
|
||||||
|
@ -1869,6 +2021,7 @@ module = {
|
||||||
module = {
|
module = {
|
||||||
name = at_keyboard;
|
name = at_keyboard;
|
||||||
common = term/at_keyboard.c;
|
common = term/at_keyboard.c;
|
||||||
|
common = term/ps2.c;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1961,6 +2114,11 @@ module = {
|
||||||
common = tests/example_functional_test.c;
|
common = tests/example_functional_test.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = strtoull_test;
|
||||||
|
common = tests/strtoull_test.c;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = setjmp_test;
|
name = setjmp_test;
|
||||||
common = tests/setjmp_test.c;
|
common = tests/setjmp_test.c;
|
||||||
|
@ -1991,6 +2149,7 @@ module = {
|
||||||
name = legacy_password_test;
|
name = legacy_password_test;
|
||||||
common = tests/legacy_password_test.c;
|
common = tests/legacy_password_test.c;
|
||||||
enable = i386_pc;
|
enable = i386_pc;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = i386_efi;
|
enable = i386_efi;
|
||||||
enable = x86_64_efi;
|
enable = x86_64_efi;
|
||||||
enable = emu;
|
enable = emu;
|
||||||
|
@ -2189,6 +2348,7 @@ module = {
|
||||||
xen = lib/i386/pc/vesa_modes_table.c;
|
xen = lib/i386/pc/vesa_modes_table.c;
|
||||||
|
|
||||||
enable = i386_pc;
|
enable = i386_pc;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = i386_efi;
|
enable = i386_efi;
|
||||||
enable = x86_64_efi;
|
enable = x86_64_efi;
|
||||||
enable = emu;
|
enable = emu;
|
||||||
|
@ -2232,10 +2392,12 @@ module = {
|
||||||
module = {
|
module = {
|
||||||
name = backtrace;
|
name = backtrace;
|
||||||
x86 = lib/i386/backtrace.c;
|
x86 = lib/i386/backtrace.c;
|
||||||
|
i386_xen_pvh = lib/i386/backtrace.c;
|
||||||
i386_xen = lib/i386/backtrace.c;
|
i386_xen = lib/i386/backtrace.c;
|
||||||
x86_64_xen = lib/i386/backtrace.c;
|
x86_64_xen = lib/i386/backtrace.c;
|
||||||
common = lib/backtrace.c;
|
common = lib/backtrace.c;
|
||||||
enable = x86;
|
enable = x86;
|
||||||
|
enable = i386_xen_pvh;
|
||||||
enable = i386_xen;
|
enable = i386_xen;
|
||||||
enable = x86_64_xen;
|
enable = x86_64_xen;
|
||||||
};
|
};
|
||||||
|
@ -2334,6 +2496,13 @@ module = {
|
||||||
common = commands/testspeed.c;
|
common = commands/testspeed.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module = {
|
||||||
|
name = tpm;
|
||||||
|
common = commands/tpm.c;
|
||||||
|
efi = commands/efi/tpm.c;
|
||||||
|
enable = efi;
|
||||||
|
};
|
||||||
|
|
||||||
module = {
|
module = {
|
||||||
name = tr;
|
name = tr;
|
||||||
common = commands/tr.c;
|
common = commands/tr.c;
|
||||||
|
@ -2355,3 +2524,13 @@ module = {
|
||||||
common = loader/i386/xen_file64.c;
|
common = loader/i386/xen_file64.c;
|
||||||
extra_dist = loader/i386/xen_fileXX.c;
|
extra_dist = loader/i386/xen_fileXX.c;
|
||||||
};
|
};
|
||||||
|
module = {
|
||||||
|
name = rdmsr;
|
||||||
|
common = commands/i386/rdmsr.c;
|
||||||
|
enable = x86;
|
||||||
|
};
|
||||||
|
module = {
|
||||||
|
name = wrmsr;
|
||||||
|
common = commands/i386/wrmsr.c;
|
||||||
|
enable = x86;
|
||||||
|
};
|
||||||
|
|
|
@ -37,8 +37,8 @@
|
||||||
start:
|
start:
|
||||||
_start:
|
_start:
|
||||||
/*
|
/*
|
||||||
* _start is loaded at 0x2000 and is jumped to with
|
* _start is loaded at 0x8000 and is jumped to with
|
||||||
* CS:IP 0:0x2000 in kernel.
|
* CS:IP 0:0x8000 in kernel.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -118,7 +118,16 @@ LOCAL (codestart):
|
||||||
|
|
||||||
#include "../../../kern/i386/realmode.S"
|
#include "../../../kern/i386/realmode.S"
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* This is a workaround for clang adding a section containing only .addrsig
|
||||||
|
* Since clang itself is unable to assemble this pseudo-opcode, just replace
|
||||||
|
* it with .text
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define addrsig text
|
||||||
#include <rs_decoder.h>
|
#include <rs_decoder.h>
|
||||||
|
#undef addrsig
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,24 @@
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 4
|
.align 4
|
||||||
|
/*
|
||||||
|
* We're writing the a.out header ourselves as newer
|
||||||
|
* upstream versions of binutils no longer support
|
||||||
|
* the a.out format on sparc64.
|
||||||
|
*
|
||||||
|
* The boot loader fits into 512 bytes with 32 bytes
|
||||||
|
* used for the a.out header, hence the text segment
|
||||||
|
* size is 512 - 32. There is no data segment and no
|
||||||
|
* code relocation, thus those fields remain zero.
|
||||||
|
*/
|
||||||
|
.word 0x1030107 /* Magic number. */
|
||||||
|
.word 512 - GRUB_BOOT_AOUT_HEADER_SIZE /* Size of text segment. */
|
||||||
|
.word 0 /* Size of initialized data. */
|
||||||
|
.word 0 /* Size of uninitialized data. */
|
||||||
|
.word 0 /* Size of symbol table || checksum. */
|
||||||
|
.word _start /* Entry point. */
|
||||||
|
.word 0 /* Size of text relocation. */
|
||||||
|
.word 0 /* Size of data relocation. */
|
||||||
.globl _start
|
.globl _start
|
||||||
_start:
|
_start:
|
||||||
/* OF CIF entry point arrives in %o4 */
|
/* OF CIF entry point arrives in %o4 */
|
||||||
|
@ -30,7 +48,7 @@ pic_base:
|
||||||
|
|
||||||
#ifndef CDBOOT
|
#ifndef CDBOOT
|
||||||
/* The offsets to these locations are defined by the
|
/* The offsets to these locations are defined by the
|
||||||
* GRUB_BOOT_MACHINE_foo macros in include/grub/sparc/ieee1275/boot.h,
|
* GRUB_BOOT_MACHINE_foo macros in include/grub/sparc64/ieee1275/boot.h,
|
||||||
* and grub-setup uses this to patch these next three values as needed.
|
* and grub-setup uses this to patch these next three values as needed.
|
||||||
*
|
*
|
||||||
* The boot_path will be the OF device path of the partition where the
|
* The boot_path will be the OF device path of the partition where the
|
||||||
|
@ -40,10 +58,14 @@ pic_base:
|
||||||
*
|
*
|
||||||
* After loading in that block we will execute it by jumping to the
|
* After loading in that block we will execute it by jumping to the
|
||||||
* load address plus the size of the prepended A.OUT header (32 bytes).
|
* load address plus the size of the prepended A.OUT header (32 bytes).
|
||||||
|
*
|
||||||
|
* Since this assembly code includes the 32 bytes long a.out header,
|
||||||
|
* we need to move the actual code entry point forward by the size
|
||||||
|
* of the a.out header, i.e. += GRUB_BOOT_AOUT_HEADER_SIZE.
|
||||||
*/
|
*/
|
||||||
.org GRUB_BOOT_MACHINE_BOOT_DEVPATH
|
.org GRUB_BOOT_MACHINE_BOOT_DEVPATH + GRUB_BOOT_AOUT_HEADER_SIZE
|
||||||
boot_path:
|
boot_path:
|
||||||
.org GRUB_BOOT_MACHINE_KERNEL_BYTE
|
.org GRUB_BOOT_MACHINE_KERNEL_BYTE + GRUB_BOOT_AOUT_HEADER_SIZE
|
||||||
boot_path_end:
|
boot_path_end:
|
||||||
kernel_byte: .xword (2 << 9)
|
kernel_byte: .xword (2 << 9)
|
||||||
kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
|
kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
|
||||||
|
@ -52,7 +74,7 @@ kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
|
||||||
#define boot_path_end (_start + 1024)
|
#define boot_path_end (_start + 1024)
|
||||||
#include <grub/offsets.h>
|
#include <grub/offsets.h>
|
||||||
|
|
||||||
.org 8
|
.org 8 + GRUB_BOOT_AOUT_HEADER_SIZE
|
||||||
kernel_byte: .xword (2 << 9)
|
kernel_byte: .xword (2 << 9)
|
||||||
kernel_size: .word 512
|
kernel_size: .word 512
|
||||||
kernel_address: .word GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS
|
kernel_address: .word GRUB_BOOT_SPARC64_IEEE1275_IMAGE_ADDRESS
|
||||||
|
@ -69,6 +91,10 @@ prom_seek_name: .asciz "seek"
|
||||||
prom_read_name: .asciz "read"
|
prom_read_name: .asciz "read"
|
||||||
prom_exit_name: .asciz "exit"
|
prom_exit_name: .asciz "exit"
|
||||||
grub_name: .asciz "GRUB "
|
grub_name: .asciz "GRUB "
|
||||||
|
#ifdef CDBOOT
|
||||||
|
prom_close_name: .asciz "close"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GRUB_NAME_LEN 5
|
#define GRUB_NAME_LEN 5
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -213,6 +239,12 @@ bootpath_known:
|
||||||
call prom_call_3_1_o1
|
call prom_call_3_1_o1
|
||||||
#ifdef CDBOOT
|
#ifdef CDBOOT
|
||||||
LDUW_ABS(kernel_size, 0x00, %o3)
|
LDUW_ABS(kernel_size, 0x00, %o3)
|
||||||
|
|
||||||
|
GET_ABS(prom_close_name, %o0)
|
||||||
|
mov 1, %g1
|
||||||
|
mov 0, %o5
|
||||||
|
call prom_call
|
||||||
|
mov BOOTDEV_REG, %o1
|
||||||
#else
|
#else
|
||||||
mov 512, %o3
|
mov 512, %o3
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,256 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2016 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/fdtbus.h>
|
||||||
|
#include <grub/fdt.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
|
||||||
|
static const void *dtb;
|
||||||
|
static grub_size_t root_address_cells, root_size_cells;
|
||||||
|
/* Pointer to this symbol signals invalid mapping. */
|
||||||
|
char grub_fdtbus_invalid_mapping[1];
|
||||||
|
|
||||||
|
struct grub_fdtbus_dev *devs;
|
||||||
|
struct grub_fdtbus_driver *drivers;
|
||||||
|
|
||||||
|
int
|
||||||
|
grub_fdtbus_is_compatible (const char *compat_string,
|
||||||
|
const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
grub_size_t compatible_size;
|
||||||
|
const char *compatible = grub_fdt_get_prop (dtb, dev->node, "compatible",
|
||||||
|
&compatible_size);
|
||||||
|
if (!compatible)
|
||||||
|
return 0;
|
||||||
|
const char *compatible_end = compatible + compatible_size;
|
||||||
|
while (compatible < compatible_end)
|
||||||
|
{
|
||||||
|
if (grub_strcmp (compat_string, compatible) == 0)
|
||||||
|
return 1;
|
||||||
|
compatible += grub_strlen (compatible) + 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fdtbus_scan (struct grub_fdtbus_dev *parent)
|
||||||
|
{
|
||||||
|
int node;
|
||||||
|
for (node = grub_fdt_first_node (dtb, parent ? parent->node : 0); node >= 0;
|
||||||
|
node = grub_fdt_next_node (dtb, node))
|
||||||
|
{
|
||||||
|
struct grub_fdtbus_dev *dev;
|
||||||
|
struct grub_fdtbus_driver *driver;
|
||||||
|
dev = grub_zalloc (sizeof (*dev));
|
||||||
|
if (!dev)
|
||||||
|
{
|
||||||
|
grub_print_error ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dev->node = node;
|
||||||
|
dev->next = devs;
|
||||||
|
dev->parent = parent;
|
||||||
|
devs = dev;
|
||||||
|
FOR_LIST_ELEMENTS(driver, drivers)
|
||||||
|
if (!dev->driver && grub_fdtbus_is_compatible (driver->compatible, dev))
|
||||||
|
{
|
||||||
|
grub_dprintf ("fdtbus", "Attaching %s\n", driver->compatible);
|
||||||
|
if (driver->attach (dev) == GRUB_ERR_NONE)
|
||||||
|
{
|
||||||
|
grub_dprintf ("fdtbus", "Attached %s\n", driver->compatible);
|
||||||
|
dev->driver = driver;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
grub_print_error ();
|
||||||
|
}
|
||||||
|
fdtbus_scan (dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_fdtbus_register (struct grub_fdtbus_driver *driver)
|
||||||
|
{
|
||||||
|
struct grub_fdtbus_dev *dev;
|
||||||
|
grub_dprintf ("fdtbus", "Registering %s\n", driver->compatible);
|
||||||
|
grub_list_push (GRUB_AS_LIST_P (&drivers),
|
||||||
|
GRUB_AS_LIST (driver));
|
||||||
|
for (dev = devs; dev; dev = dev->next)
|
||||||
|
if (!dev->driver && grub_fdtbus_is_compatible (driver->compatible, dev))
|
||||||
|
{
|
||||||
|
grub_dprintf ("fdtbus", "Attaching %s (%p)\n", driver->compatible, dev);
|
||||||
|
if (driver->attach (dev) == GRUB_ERR_NONE)
|
||||||
|
{
|
||||||
|
grub_dprintf ("fdtbus", "Attached %s\n", driver->compatible);
|
||||||
|
dev->driver = driver;
|
||||||
|
}
|
||||||
|
grub_print_error ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_fdtbus_unregister (struct grub_fdtbus_driver *driver)
|
||||||
|
{
|
||||||
|
grub_list_remove (GRUB_AS_LIST (driver));
|
||||||
|
struct grub_fdtbus_dev *dev;
|
||||||
|
for (dev = devs; dev; dev = dev->next)
|
||||||
|
if (dev->driver == driver)
|
||||||
|
{
|
||||||
|
if (driver->detach)
|
||||||
|
driver->detach(dev);
|
||||||
|
dev->driver = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_fdtbus_init (const void *dtb_in, grub_size_t size)
|
||||||
|
{
|
||||||
|
if (!dtb_in || grub_fdt_check_header (dtb_in, size) < 0)
|
||||||
|
grub_fatal ("invalid FDT");
|
||||||
|
dtb = dtb_in;
|
||||||
|
const grub_uint32_t *prop = grub_fdt_get_prop (dtb, 0, "#address-cells", 0);
|
||||||
|
if (prop)
|
||||||
|
root_address_cells = grub_be_to_cpu32 (*prop);
|
||||||
|
else
|
||||||
|
root_address_cells = 1;
|
||||||
|
|
||||||
|
prop = grub_fdt_get_prop (dtb, 0, "#size-cells", 0);
|
||||||
|
if (prop)
|
||||||
|
root_size_cells = grub_be_to_cpu32 (*prop);
|
||||||
|
else
|
||||||
|
root_size_cells = 1;
|
||||||
|
|
||||||
|
fdtbus_scan (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_address_cells (const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
const grub_uint32_t *prop;
|
||||||
|
if (!dev)
|
||||||
|
return root_address_cells;
|
||||||
|
prop = grub_fdt_get_prop (dtb, dev->node, "#address-cells", 0);
|
||||||
|
if (prop)
|
||||||
|
return grub_be_to_cpu32 (*prop);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_size_cells (const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
const grub_uint32_t *prop;
|
||||||
|
if (!dev)
|
||||||
|
return root_size_cells;
|
||||||
|
prop = grub_fdt_get_prop (dtb, dev->node, "#size-cells", 0);
|
||||||
|
if (prop)
|
||||||
|
return grub_be_to_cpu32 (*prop);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_uint64_t
|
||||||
|
get64 (const grub_uint32_t *reg, grub_size_t cells)
|
||||||
|
{
|
||||||
|
grub_uint64_t val = 0;
|
||||||
|
if (cells >= 1)
|
||||||
|
val = grub_be_to_cpu32 (reg[cells - 1]);
|
||||||
|
if (cells >= 2)
|
||||||
|
val |= ((grub_uint64_t) grub_be_to_cpu32 (reg[cells - 2])) << 32;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static volatile void *
|
||||||
|
translate (const struct grub_fdtbus_dev *dev, const grub_uint32_t *reg)
|
||||||
|
{
|
||||||
|
volatile void *ret;
|
||||||
|
const grub_uint32_t *ranges;
|
||||||
|
grub_size_t ranges_size, cells_per_mapping;
|
||||||
|
grub_size_t parent_address_cells, child_address_cells, child_size_cells;
|
||||||
|
grub_size_t nmappings, i;
|
||||||
|
if (dev == 0)
|
||||||
|
{
|
||||||
|
grub_uint64_t val;
|
||||||
|
val = get64 (reg, root_address_cells);
|
||||||
|
if (sizeof (void *) == 4 && (val >> 32))
|
||||||
|
return grub_fdtbus_invalid_mapping;
|
||||||
|
return (void *) (grub_addr_t) val;
|
||||||
|
}
|
||||||
|
ranges = grub_fdt_get_prop (dtb, dev->node, "ranges", &ranges_size);
|
||||||
|
if (!ranges)
|
||||||
|
return grub_fdtbus_invalid_mapping;
|
||||||
|
if (ranges_size == 0)
|
||||||
|
return translate (dev->parent, reg);
|
||||||
|
parent_address_cells = get_address_cells (dev->parent);
|
||||||
|
child_address_cells = get_address_cells (dev);
|
||||||
|
child_size_cells = get_size_cells (dev);
|
||||||
|
cells_per_mapping = parent_address_cells + child_address_cells + child_size_cells;
|
||||||
|
nmappings = ranges_size / 4 / cells_per_mapping;
|
||||||
|
for (i = 0; i < nmappings; i++)
|
||||||
|
{
|
||||||
|
const grub_uint32_t *child_addr = &ranges[i * cells_per_mapping];
|
||||||
|
const grub_uint32_t *parent_addr = child_addr + child_address_cells;
|
||||||
|
grub_uint64_t child_size = get64 (parent_addr + parent_address_cells, child_size_cells);
|
||||||
|
|
||||||
|
if (child_address_cells > 2 && grub_memcmp (reg, child_addr, (child_address_cells - 2) * 4) != 0)
|
||||||
|
continue;
|
||||||
|
if (get64 (reg, child_address_cells) < get64 (child_addr, child_address_cells))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
grub_uint64_t offset = get64 (reg, child_address_cells) - get64 (child_addr, child_address_cells);
|
||||||
|
if (offset >= child_size)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = translate (dev->parent, parent_addr);
|
||||||
|
if (grub_fdtbus_is_mapping_valid (ret))
|
||||||
|
ret = (volatile char *) ret + offset;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
return grub_fdtbus_invalid_mapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
volatile void *
|
||||||
|
grub_fdtbus_map_reg (const struct grub_fdtbus_dev *dev, int regno, grub_size_t *size)
|
||||||
|
{
|
||||||
|
grub_size_t address_cells, size_cells;
|
||||||
|
address_cells = get_address_cells (dev->parent);
|
||||||
|
size_cells = get_size_cells (dev->parent);
|
||||||
|
const grub_uint32_t *reg = grub_fdt_get_prop (dtb, dev->node, "reg", 0);
|
||||||
|
if (size && size_cells)
|
||||||
|
*size = reg[(address_cells + size_cells) * regno + address_cells];
|
||||||
|
if (size && !size_cells)
|
||||||
|
*size = 0;
|
||||||
|
return translate (dev->parent, reg + (address_cells + size_cells) * regno);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
grub_fdtbus_get_name (const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
return grub_fdt_get_nodename (dtb, dev->node);
|
||||||
|
}
|
||||||
|
|
||||||
|
const void *
|
||||||
|
grub_fdtbus_get_prop (const struct grub_fdtbus_dev *dev,
|
||||||
|
const char *name,
|
||||||
|
grub_uint32_t *len)
|
||||||
|
{
|
||||||
|
return grub_fdt_get_prop (dtb, dev->node, name, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
const void *
|
||||||
|
grub_fdtbus_get_fdt (void)
|
||||||
|
{
|
||||||
|
return dtb;
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Google Inc.
|
||||||
|
* Copyright (C) 2016 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This is based on depthcharge code.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/time.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/fdtbus.h>
|
||||||
|
#include <grub/machine/kernel.h>
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
spi_send (const struct grub_fdtbus_dev *dev, const void *data, grub_size_t sz)
|
||||||
|
{
|
||||||
|
const grub_uint8_t *ptr = data, *end = ptr + sz;
|
||||||
|
volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0);
|
||||||
|
spi[2] = 0;
|
||||||
|
spi[1] = sz - 1;
|
||||||
|
spi[0] = ((1 << 18) | spi[0]) & ~(1 << 19);
|
||||||
|
spi[2] = 1;
|
||||||
|
while (ptr < end)
|
||||||
|
{
|
||||||
|
while (spi[9] & 2);
|
||||||
|
spi[256] = *ptr++;
|
||||||
|
}
|
||||||
|
while (spi[9] & 1);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
spi_receive (const struct grub_fdtbus_dev *dev, void *data, grub_size_t sz)
|
||||||
|
{
|
||||||
|
grub_uint8_t *ptr = data, *end = ptr + sz;
|
||||||
|
volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0);
|
||||||
|
spi[2] = 0;
|
||||||
|
spi[1] = sz - 1;
|
||||||
|
spi[0] = ((1 << 19) | spi[0]) & ~(1 << 18);
|
||||||
|
spi[2] = 1;
|
||||||
|
while (ptr < end)
|
||||||
|
{
|
||||||
|
while (spi[9] & 8);
|
||||||
|
*ptr++ = spi[512];
|
||||||
|
}
|
||||||
|
while (spi[9] & 1);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
spi_start (const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0);
|
||||||
|
spi[3] = 1;
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
spi_stop (const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
volatile grub_uint32_t *spi = grub_fdtbus_map_reg (dev, 0, 0);
|
||||||
|
spi[3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
spi_attach(const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
if (!grub_fdtbus_is_mapping_valid (grub_fdtbus_map_reg (dev, 0, 0)))
|
||||||
|
return GRUB_ERR_IO;
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct grub_fdtbus_driver spi =
|
||||||
|
{
|
||||||
|
.compatible = "rockchip,rk3288-spi",
|
||||||
|
.attach = spi_attach,
|
||||||
|
.send = spi_send,
|
||||||
|
.receive = spi_receive,
|
||||||
|
.start = spi_start,
|
||||||
|
.stop = spi_stop,
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_rk3288_spi_init (void)
|
||||||
|
{
|
||||||
|
grub_fdtbus_register (&spi);
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/* ehci.c - EHCI Support. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/time.h>
|
||||||
|
#include <grub/usb.h>
|
||||||
|
#include <grub/fdtbus.h>
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
ehci_attach(const struct grub_fdtbus_dev *dev)
|
||||||
|
{
|
||||||
|
grub_dprintf ("ehci", "Found generic-ehci\n");
|
||||||
|
|
||||||
|
grub_ehci_init_device (grub_fdtbus_map_reg (dev, 0, 0));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_fdtbus_driver ehci =
|
||||||
|
{
|
||||||
|
.compatible = "generic-ehci",
|
||||||
|
.attach = ehci_attach
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_ehci_pci_scan (void)
|
||||||
|
{
|
||||||
|
grub_fdtbus_register (&ehci);
|
||||||
|
}
|
|
@ -0,0 +1,208 @@
|
||||||
|
/* ehci.c - EHCI Support. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2011 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/pci.h>
|
||||||
|
#include <grub/cpu/pci.h>
|
||||||
|
#include <grub/cs5536.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/time.h>
|
||||||
|
#include <grub/usb.h>
|
||||||
|
|
||||||
|
#define GRUB_EHCI_PCI_SBRN_REG 0x60
|
||||||
|
#define GRUB_EHCI_ADDR_MEM_MASK (~0xff)
|
||||||
|
|
||||||
|
/* USBLEGSUP bits and related OS OWNED byte offset */
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
GRUB_EHCI_BIOS_OWNED = (1 << 16),
|
||||||
|
GRUB_EHCI_OS_OWNED = (1 << 24)
|
||||||
|
};
|
||||||
|
|
||||||
|
/* PCI iteration function... */
|
||||||
|
static int
|
||||||
|
grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
|
void *data __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
volatile grub_uint32_t *regs;
|
||||||
|
grub_uint32_t base, base_h;
|
||||||
|
grub_uint32_t eecp_offset;
|
||||||
|
grub_uint32_t usblegsup = 0;
|
||||||
|
grub_uint64_t maxtime;
|
||||||
|
grub_uint32_t interf;
|
||||||
|
grub_uint32_t subclass;
|
||||||
|
grub_uint32_t class;
|
||||||
|
grub_uint8_t release;
|
||||||
|
grub_uint32_t class_code;
|
||||||
|
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: begin\n");
|
||||||
|
|
||||||
|
if (pciid == GRUB_CS5536_PCIID)
|
||||||
|
{
|
||||||
|
grub_uint64_t basereg;
|
||||||
|
|
||||||
|
basereg = grub_cs5536_read_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE);
|
||||||
|
if (!(basereg & GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE))
|
||||||
|
{
|
||||||
|
/* Shouldn't happen. */
|
||||||
|
grub_dprintf ("ehci", "No EHCI address is assigned\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
base = (basereg & GRUB_CS5536_MSR_USB_BASE_ADDR_MASK);
|
||||||
|
basereg |= GRUB_CS5536_MSR_USB_BASE_BUS_MASTER;
|
||||||
|
basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_ENABLED;
|
||||||
|
basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_STATUS;
|
||||||
|
basereg &= ~GRUB_CS5536_MSR_USB_BASE_SMI_ENABLE;
|
||||||
|
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE, basereg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_pci_address_t addr;
|
||||||
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
||||||
|
class_code = grub_pci_read (addr) >> 8;
|
||||||
|
interf = class_code & 0xFF;
|
||||||
|
subclass = (class_code >> 8) & 0xFF;
|
||||||
|
class = class_code >> 16;
|
||||||
|
|
||||||
|
/* If this is not an EHCI controller, just return. */
|
||||||
|
if (class != 0x0c || subclass != 0x03 || interf != 0x20)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: class OK\n");
|
||||||
|
|
||||||
|
/* Check Serial Bus Release Number */
|
||||||
|
addr = grub_pci_make_address (dev, GRUB_EHCI_PCI_SBRN_REG);
|
||||||
|
release = grub_pci_read_byte (addr);
|
||||||
|
if (release != 0x20)
|
||||||
|
{
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: Wrong SBRN: %0x\n",
|
||||||
|
release);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: bus rev. num. OK\n");
|
||||||
|
|
||||||
|
/* Determine EHCI EHCC registers base address. */
|
||||||
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||||
|
base = grub_pci_read (addr);
|
||||||
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
|
||||||
|
base_h = grub_pci_read (addr);
|
||||||
|
/* Stop if registers are mapped above 4G - GRUB does not currently
|
||||||
|
* work with registers mapped above 4G */
|
||||||
|
if (((base & GRUB_PCI_ADDR_MEM_TYPE_MASK) != GRUB_PCI_ADDR_MEM_TYPE_32)
|
||||||
|
&& (base_h != 0))
|
||||||
|
{
|
||||||
|
grub_dprintf ("ehci",
|
||||||
|
"EHCI grub_ehci_pci_iter: registers above 4G are not supported\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
base &= GRUB_PCI_ADDR_MEM_MASK;
|
||||||
|
if (!base)
|
||||||
|
{
|
||||||
|
grub_dprintf ("ehci",
|
||||||
|
"EHCI: EHCI is not mapped\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set bus master - needed for coreboot, VMware, broken BIOSes etc. */
|
||||||
|
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
||||||
|
grub_pci_write_word(addr,
|
||||||
|
GRUB_PCI_COMMAND_MEM_ENABLED
|
||||||
|
| GRUB_PCI_COMMAND_BUS_MASTER
|
||||||
|
| grub_pci_read_word(addr));
|
||||||
|
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: 32-bit EHCI OK\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: iobase of EHCC: %08x\n",
|
||||||
|
(base & GRUB_EHCI_ADDR_MEM_MASK));
|
||||||
|
|
||||||
|
regs = grub_pci_device_map_range (dev,
|
||||||
|
(base & GRUB_EHCI_ADDR_MEM_MASK),
|
||||||
|
0x100);
|
||||||
|
|
||||||
|
/* Is there EECP ? */
|
||||||
|
eecp_offset = (grub_le_to_cpu32 (regs[2]) >> 8) & 0xff;
|
||||||
|
|
||||||
|
/* Determine and change ownership. */
|
||||||
|
/* EECP offset valid in HCCPARAMS */
|
||||||
|
/* Ownership can be changed via EECP only */
|
||||||
|
if (pciid != GRUB_CS5536_PCIID && eecp_offset >= 0x40)
|
||||||
|
{
|
||||||
|
grub_pci_address_t pciaddr_eecp;
|
||||||
|
pciaddr_eecp = grub_pci_make_address (dev, eecp_offset);
|
||||||
|
|
||||||
|
usblegsup = grub_pci_read (pciaddr_eecp);
|
||||||
|
if (usblegsup & GRUB_EHCI_BIOS_OWNED)
|
||||||
|
{
|
||||||
|
grub_boot_time ("Taking ownership of EHCI controller");
|
||||||
|
grub_dprintf ("ehci",
|
||||||
|
"EHCI grub_ehci_pci_iter: EHCI owned by: BIOS\n");
|
||||||
|
/* Ownership change - set OS_OWNED bit */
|
||||||
|
grub_pci_write (pciaddr_eecp, usblegsup | GRUB_EHCI_OS_OWNED);
|
||||||
|
/* Ensure PCI register is written */
|
||||||
|
grub_pci_read (pciaddr_eecp);
|
||||||
|
|
||||||
|
/* Wait for finish of ownership change, EHCI specification
|
||||||
|
* doesn't say how long it can take... */
|
||||||
|
maxtime = grub_get_time_ms () + 1000;
|
||||||
|
while ((grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED)
|
||||||
|
&& (grub_get_time_ms () < maxtime));
|
||||||
|
if (grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED)
|
||||||
|
{
|
||||||
|
grub_dprintf ("ehci",
|
||||||
|
"EHCI grub_ehci_pci_iter: EHCI change ownership timeout");
|
||||||
|
/* Change ownership in "hard way" - reset BIOS ownership */
|
||||||
|
grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED);
|
||||||
|
/* Ensure PCI register is written */
|
||||||
|
grub_pci_read (pciaddr_eecp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (usblegsup & GRUB_EHCI_OS_OWNED)
|
||||||
|
/* XXX: What to do in this case - nothing ? Can it happen ? */
|
||||||
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: EHCI owned by: OS\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_dprintf ("ehci",
|
||||||
|
"EHCI grub_ehci_pci_iter: EHCI owned by: NONE\n");
|
||||||
|
/* XXX: What to do in this case ? Can it happen ?
|
||||||
|
* Is code below correct ? */
|
||||||
|
/* Ownership change - set OS_OWNED bit */
|
||||||
|
grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED);
|
||||||
|
/* Ensure PCI register is written */
|
||||||
|
grub_pci_read (pciaddr_eecp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable SMI, just to be sure. */
|
||||||
|
pciaddr_eecp = grub_pci_make_address (dev, eecp_offset + 4);
|
||||||
|
grub_pci_write (pciaddr_eecp, 0);
|
||||||
|
/* Ensure PCI register is written */
|
||||||
|
grub_pci_read (pciaddr_eecp);
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_dprintf ("ehci", "inithw: EHCI grub_ehci_pci_iter: ownership OK\n");
|
||||||
|
|
||||||
|
grub_ehci_init_device (regs);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_ehci_pci_scan (void)
|
||||||
|
{
|
||||||
|
grub_pci_iterate (grub_ehci_pci_iter, NULL);
|
||||||
|
}
|
|
@ -22,13 +22,10 @@
|
||||||
#include <grub/usb.h>
|
#include <grub/usb.h>
|
||||||
#include <grub/usbtrans.h>
|
#include <grub/usbtrans.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/pci.h>
|
|
||||||
#include <grub/cpu/pci.h>
|
|
||||||
#include <grub/cpu/io.h>
|
|
||||||
#include <grub/time.h>
|
#include <grub/time.h>
|
||||||
#include <grub/loader.h>
|
#include <grub/loader.h>
|
||||||
#include <grub/cs5536.h>
|
|
||||||
#include <grub/disk.h>
|
#include <grub/disk.h>
|
||||||
|
#include <grub/dma.h>
|
||||||
#include <grub/cache.h>
|
#include <grub/cache.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
@ -39,8 +36,6 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
* - is not supporting interrupt transfers
|
* - is not supporting interrupt transfers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define GRUB_EHCI_PCI_SBRN_REG 0x60
|
|
||||||
|
|
||||||
/* Capability registers offsets */
|
/* Capability registers offsets */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -54,7 +49,6 @@ enum
|
||||||
#define GRUB_EHCI_EECP_MASK (0xff << 8)
|
#define GRUB_EHCI_EECP_MASK (0xff << 8)
|
||||||
#define GRUB_EHCI_EECP_SHIFT 8
|
#define GRUB_EHCI_EECP_SHIFT 8
|
||||||
|
|
||||||
#define GRUB_EHCI_ADDR_MEM_MASK (~0xff)
|
|
||||||
#define GRUB_EHCI_POINTER_MASK (~0x1f)
|
#define GRUB_EHCI_POINTER_MASK (~0x1f)
|
||||||
|
|
||||||
/* Capability register SPARAMS bits */
|
/* Capability register SPARAMS bits */
|
||||||
|
@ -85,13 +79,6 @@ enum
|
||||||
|
|
||||||
#define GRUB_EHCI_QH_EMPTY 1
|
#define GRUB_EHCI_QH_EMPTY 1
|
||||||
|
|
||||||
/* USBLEGSUP bits and related OS OWNED byte offset */
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
GRUB_EHCI_BIOS_OWNED = (1 << 16),
|
|
||||||
GRUB_EHCI_OS_OWNED = (1 << 24)
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Operational registers offsets */
|
/* Operational registers offsets */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -455,9 +442,10 @@ grub_ehci_reset (struct grub_ehci *e)
|
||||||
|
|
||||||
sync_all_caches (e);
|
sync_all_caches (e);
|
||||||
|
|
||||||
|
grub_dprintf ("ehci", "reset\n");
|
||||||
|
|
||||||
grub_ehci_oper_write32 (e, GRUB_EHCI_COMMAND,
|
grub_ehci_oper_write32 (e, GRUB_EHCI_COMMAND,
|
||||||
GRUB_EHCI_CMD_HC_RESET
|
GRUB_EHCI_CMD_HC_RESET);
|
||||||
| grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
|
|
||||||
/* Ensure command is written */
|
/* Ensure command is written */
|
||||||
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND);
|
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND);
|
||||||
/* XXX: How long time could take reset of HC ? */
|
/* XXX: How long time could take reset of HC ? */
|
||||||
|
@ -473,116 +461,24 @@ grub_ehci_reset (struct grub_ehci *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PCI iteration function... */
|
/* PCI iteration function... */
|
||||||
static int
|
void
|
||||||
grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
grub_ehci_init_device (volatile void *regs)
|
||||||
void *data __attribute__ ((unused)))
|
|
||||||
{
|
{
|
||||||
grub_uint8_t release;
|
|
||||||
grub_uint32_t class_code;
|
|
||||||
grub_uint32_t interf;
|
|
||||||
grub_uint32_t subclass;
|
|
||||||
grub_uint32_t class;
|
|
||||||
grub_uint32_t base, base_h;
|
|
||||||
struct grub_ehci *e;
|
struct grub_ehci *e;
|
||||||
grub_uint32_t eecp_offset;
|
|
||||||
grub_uint32_t fp;
|
grub_uint32_t fp;
|
||||||
int i;
|
int i;
|
||||||
grub_uint32_t usblegsup = 0;
|
|
||||||
grub_uint64_t maxtime;
|
|
||||||
grub_uint32_t n_ports;
|
grub_uint32_t n_ports;
|
||||||
grub_uint8_t caplen;
|
grub_uint8_t caplen;
|
||||||
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: begin\n");
|
|
||||||
|
|
||||||
if (pciid == GRUB_CS5536_PCIID)
|
|
||||||
{
|
|
||||||
grub_uint64_t basereg;
|
|
||||||
|
|
||||||
basereg = grub_cs5536_read_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE);
|
|
||||||
if (!(basereg & GRUB_CS5536_MSR_USB_BASE_MEMORY_ENABLE))
|
|
||||||
{
|
|
||||||
/* Shouldn't happen. */
|
|
||||||
grub_dprintf ("ehci", "No EHCI address is assigned\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
base = (basereg & GRUB_CS5536_MSR_USB_BASE_ADDR_MASK);
|
|
||||||
basereg |= GRUB_CS5536_MSR_USB_BASE_BUS_MASTER;
|
|
||||||
basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_ENABLED;
|
|
||||||
basereg &= ~GRUB_CS5536_MSR_USB_BASE_PME_STATUS;
|
|
||||||
basereg &= ~GRUB_CS5536_MSR_USB_BASE_SMI_ENABLE;
|
|
||||||
grub_cs5536_write_msr (dev, GRUB_CS5536_MSR_USB_EHCI_BASE, basereg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
grub_pci_address_t addr;
|
|
||||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
|
|
||||||
class_code = grub_pci_read (addr) >> 8;
|
|
||||||
interf = class_code & 0xFF;
|
|
||||||
subclass = (class_code >> 8) & 0xFF;
|
|
||||||
class = class_code >> 16;
|
|
||||||
|
|
||||||
/* If this is not an EHCI controller, just return. */
|
|
||||||
if (class != 0x0c || subclass != 0x03 || interf != 0x20)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: class OK\n");
|
|
||||||
|
|
||||||
/* Check Serial Bus Release Number */
|
|
||||||
addr = grub_pci_make_address (dev, GRUB_EHCI_PCI_SBRN_REG);
|
|
||||||
release = grub_pci_read_byte (addr);
|
|
||||||
if (release != 0x20)
|
|
||||||
{
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: Wrong SBRN: %0x\n",
|
|
||||||
release);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: bus rev. num. OK\n");
|
|
||||||
|
|
||||||
/* Determine EHCI EHCC registers base address. */
|
|
||||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
|
||||||
base = grub_pci_read (addr);
|
|
||||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG1);
|
|
||||||
base_h = grub_pci_read (addr);
|
|
||||||
/* Stop if registers are mapped above 4G - GRUB does not currently
|
|
||||||
* work with registers mapped above 4G */
|
|
||||||
if (((base & GRUB_PCI_ADDR_MEM_TYPE_MASK) != GRUB_PCI_ADDR_MEM_TYPE_32)
|
|
||||||
&& (base_h != 0))
|
|
||||||
{
|
|
||||||
grub_dprintf ("ehci",
|
|
||||||
"EHCI grub_ehci_pci_iter: registers above 4G are not supported\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
base &= GRUB_PCI_ADDR_MEM_MASK;
|
|
||||||
if (!base)
|
|
||||||
{
|
|
||||||
grub_dprintf ("ehci",
|
|
||||||
"EHCI: EHCI is not mapped\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set bus master - needed for coreboot, VMware, broken BIOSes etc. */
|
|
||||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
|
||||||
grub_pci_write_word(addr,
|
|
||||||
GRUB_PCI_COMMAND_MEM_ENABLED
|
|
||||||
| GRUB_PCI_COMMAND_BUS_MASTER
|
|
||||||
| grub_pci_read_word(addr));
|
|
||||||
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: 32-bit EHCI OK\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate memory for the controller and fill basic values. */
|
/* Allocate memory for the controller and fill basic values. */
|
||||||
e = grub_zalloc (sizeof (*e));
|
e = grub_zalloc (sizeof (*e));
|
||||||
if (!e)
|
if (!e)
|
||||||
return 1;
|
return;
|
||||||
e->framelist_chunk = NULL;
|
e->framelist_chunk = NULL;
|
||||||
e->td_chunk = NULL;
|
e->td_chunk = NULL;
|
||||||
e->qh_chunk = NULL;
|
e->qh_chunk = NULL;
|
||||||
e->iobase_ehcc = grub_pci_device_map_range (dev,
|
e->iobase_ehcc = regs;
|
||||||
(base & GRUB_EHCI_ADDR_MEM_MASK),
|
|
||||||
0x100);
|
|
||||||
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: iobase of EHCC: %08x\n",
|
|
||||||
(base & GRUB_EHCI_ADDR_MEM_MASK));
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CAPLEN: %02x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CAPLEN: %02x\n",
|
||||||
grub_ehci_ehcc_read8 (e, GRUB_EHCI_EHCC_CAPLEN));
|
grub_ehci_ehcc_read8 (e, GRUB_EHCI_EHCC_CAPLEN));
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: VERSION: %04x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: VERSION: %04x\n",
|
||||||
|
@ -598,7 +494,7 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
if (caplen & (sizeof (grub_uint32_t) - 1))
|
if (caplen & (sizeof (grub_uint32_t) - 1))
|
||||||
{
|
{
|
||||||
grub_dprintf ("ehci", "Unaligned caplen\n");
|
grub_dprintf ("ehci", "Unaligned caplen\n");
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
e->iobase = ((volatile grub_uint32_t *) e->iobase_ehcc
|
e->iobase = ((volatile grub_uint32_t *) e->iobase_ehcc
|
||||||
+ (caplen / sizeof (grub_uint32_t)));
|
+ (caplen / sizeof (grub_uint32_t)));
|
||||||
|
@ -608,8 +504,8 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
grub_dprintf ("ehci",
|
grub_dprintf ("ehci",
|
||||||
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n",
|
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08llxx\n",
|
||||||
(base & GRUB_EHCI_ADDR_MEM_MASK) + caplen);
|
(unsigned long long) (grub_addr_t) e->iobase_ehcc + caplen);
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n",
|
||||||
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
|
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n",
|
||||||
|
@ -625,10 +521,6 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CONFIG_FLAG: %08x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CONFIG_FLAG: %08x\n",
|
||||||
grub_ehci_oper_read32 (e, GRUB_EHCI_CONFIG_FLAG));
|
grub_ehci_oper_read32 (e, GRUB_EHCI_CONFIG_FLAG));
|
||||||
|
|
||||||
/* Is there EECP ? */
|
|
||||||
eecp_offset = (grub_ehci_ehcc_read32 (e, GRUB_EHCI_EHCC_CPARAMS)
|
|
||||||
& GRUB_EHCI_EECP_MASK) >> GRUB_EHCI_EECP_SHIFT;
|
|
||||||
|
|
||||||
/* Check format of data structures requested by EHCI */
|
/* Check format of data structures requested by EHCI */
|
||||||
/* XXX: In fact it is not used at any place, it is prepared for future
|
/* XXX: In fact it is not used at any place, it is prepared for future
|
||||||
* This implementation uses 32-bits pointers only */
|
* This implementation uses 32-bits pointers only */
|
||||||
|
@ -732,65 +624,6 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: QH/TD init. OK\n");
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: QH/TD init. OK\n");
|
||||||
|
|
||||||
/* Determine and change ownership. */
|
|
||||||
/* EECP offset valid in HCCPARAMS */
|
|
||||||
/* Ownership can be changed via EECP only */
|
|
||||||
if (pciid != GRUB_CS5536_PCIID && eecp_offset >= 0x40)
|
|
||||||
{
|
|
||||||
grub_pci_address_t pciaddr_eecp;
|
|
||||||
pciaddr_eecp = grub_pci_make_address (dev, eecp_offset);
|
|
||||||
|
|
||||||
usblegsup = grub_pci_read (pciaddr_eecp);
|
|
||||||
if (usblegsup & GRUB_EHCI_BIOS_OWNED)
|
|
||||||
{
|
|
||||||
grub_boot_time ("Taking ownership of EHCI controller");
|
|
||||||
grub_dprintf ("ehci",
|
|
||||||
"EHCI grub_ehci_pci_iter: EHCI owned by: BIOS\n");
|
|
||||||
/* Ownership change - set OS_OWNED bit */
|
|
||||||
grub_pci_write (pciaddr_eecp, usblegsup | GRUB_EHCI_OS_OWNED);
|
|
||||||
/* Ensure PCI register is written */
|
|
||||||
grub_pci_read (pciaddr_eecp);
|
|
||||||
|
|
||||||
/* Wait for finish of ownership change, EHCI specification
|
|
||||||
* doesn't say how long it can take... */
|
|
||||||
maxtime = grub_get_time_ms () + 1000;
|
|
||||||
while ((grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED)
|
|
||||||
&& (grub_get_time_ms () < maxtime));
|
|
||||||
if (grub_pci_read (pciaddr_eecp) & GRUB_EHCI_BIOS_OWNED)
|
|
||||||
{
|
|
||||||
grub_dprintf ("ehci",
|
|
||||||
"EHCI grub_ehci_pci_iter: EHCI change ownership timeout");
|
|
||||||
/* Change ownership in "hard way" - reset BIOS ownership */
|
|
||||||
grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED);
|
|
||||||
/* Ensure PCI register is written */
|
|
||||||
grub_pci_read (pciaddr_eecp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (usblegsup & GRUB_EHCI_OS_OWNED)
|
|
||||||
/* XXX: What to do in this case - nothing ? Can it happen ? */
|
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: EHCI owned by: OS\n");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
grub_dprintf ("ehci",
|
|
||||||
"EHCI grub_ehci_pci_iter: EHCI owned by: NONE\n");
|
|
||||||
/* XXX: What to do in this case ? Can it happen ?
|
|
||||||
* Is code below correct ? */
|
|
||||||
/* Ownership change - set OS_OWNED bit */
|
|
||||||
grub_pci_write (pciaddr_eecp, GRUB_EHCI_OS_OWNED);
|
|
||||||
/* Ensure PCI register is written */
|
|
||||||
grub_pci_read (pciaddr_eecp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Disable SMI, just to be sure. */
|
|
||||||
pciaddr_eecp = grub_pci_make_address (dev, eecp_offset + 4);
|
|
||||||
grub_pci_write (pciaddr_eecp, 0);
|
|
||||||
/* Ensure PCI register is written */
|
|
||||||
grub_pci_read (pciaddr_eecp);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
grub_dprintf ("ehci", "inithw: EHCI grub_ehci_pci_iter: ownership OK\n");
|
|
||||||
|
|
||||||
/* Now we can setup EHCI (maybe...) */
|
/* Now we can setup EHCI (maybe...) */
|
||||||
|
|
||||||
/* Check if EHCI is halted and halt it if not */
|
/* Check if EHCI is halted and halt it if not */
|
||||||
|
@ -863,8 +696,8 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: OK at all\n");
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: OK at all\n");
|
||||||
|
|
||||||
grub_dprintf ("ehci",
|
grub_dprintf ("ehci",
|
||||||
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08x\n",
|
"EHCI grub_ehci_pci_iter: iobase of oper. regs: %08llx\n",
|
||||||
(base & GRUB_EHCI_ADDR_MEM_MASK));
|
(unsigned long long) (grub_addr_t) regs);
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: COMMAND: %08x\n",
|
||||||
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
|
grub_ehci_oper_read32 (e, GRUB_EHCI_COMMAND));
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: STATUS: %08x\n",
|
||||||
|
@ -880,7 +713,7 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||||
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CONFIG_FLAG: %08x\n",
|
grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: CONFIG_FLAG: %08x\n",
|
||||||
grub_ehci_oper_read32 (e, GRUB_EHCI_CONFIG_FLAG));
|
grub_ehci_oper_read32 (e, GRUB_EHCI_CONFIG_FLAG));
|
||||||
|
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (e)
|
if (e)
|
||||||
|
@ -894,7 +727,7 @@ fail:
|
||||||
}
|
}
|
||||||
grub_free (e);
|
grub_free (e);
|
||||||
|
|
||||||
return 0;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -1891,12 +1724,6 @@ grub_ehci_detect_dev (grub_usb_controller_t dev, int port, int *changed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
grub_ehci_inithw (void)
|
|
||||||
{
|
|
||||||
grub_pci_iterate (grub_ehci_pci_iter, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_ehci_restore_hw (void)
|
grub_ehci_restore_hw (void)
|
||||||
{
|
{
|
||||||
|
@ -1997,7 +1824,7 @@ GRUB_MOD_INIT (ehci)
|
||||||
grub_stop_disk_firmware ();
|
grub_stop_disk_firmware ();
|
||||||
|
|
||||||
grub_boot_time ("Initing EHCI hardware");
|
grub_boot_time ("Initing EHCI hardware");
|
||||||
grub_ehci_inithw ();
|
grub_ehci_pci_scan ();
|
||||||
grub_boot_time ("Registering EHCI driver");
|
grub_boot_time ("Registering EHCI driver");
|
||||||
grub_usb_controller_dev_register (&usb_controller);
|
grub_usb_controller_dev_register (&usb_controller);
|
||||||
grub_boot_time ("EHCI driver registered");
|
grub_boot_time ("EHCI driver registered");
|
||||||
|
|
|
@ -149,8 +149,8 @@ grub_usb_add_hub (grub_usb_device_t dev)
|
||||||
grub_usb_set_configuration (dev, 1);
|
grub_usb_set_configuration (dev, 1);
|
||||||
|
|
||||||
dev->nports = hubdesc.portcnt;
|
dev->nports = hubdesc.portcnt;
|
||||||
dev->children = grub_zalloc (hubdesc.portcnt * sizeof (dev->children[0]));
|
dev->children = grub_calloc (hubdesc.portcnt, sizeof (dev->children[0]));
|
||||||
dev->ports = grub_zalloc (dev->nports * sizeof (dev->ports[0]));
|
dev->ports = grub_calloc (dev->nports, sizeof (dev->ports[0]));
|
||||||
if (!dev->children || !dev->ports)
|
if (!dev->children || !dev->ports)
|
||||||
{
|
{
|
||||||
grub_free (dev->children);
|
grub_free (dev->children);
|
||||||
|
@ -268,8 +268,8 @@ grub_usb_controller_dev_register_iter (grub_usb_controller_t controller, void *d
|
||||||
|
|
||||||
/* Query the number of ports the root Hub has. */
|
/* Query the number of ports the root Hub has. */
|
||||||
hub->nports = controller->dev->hubports (controller);
|
hub->nports = controller->dev->hubports (controller);
|
||||||
hub->devices = grub_zalloc (sizeof (hub->devices[0]) * hub->nports);
|
hub->devices = grub_calloc (hub->nports, sizeof (hub->devices[0]));
|
||||||
hub->ports = grub_zalloc (sizeof (hub->ports[0]) * hub->nports);
|
hub->ports = grub_calloc (hub->nports, sizeof (hub->ports[0]));
|
||||||
if (!hub->devices || !hub->ports)
|
if (!hub->devices || !hub->ports)
|
||||||
{
|
{
|
||||||
grub_free (hub->devices);
|
grub_free (hub->devices);
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <grub/dl.h>
|
#include <grub/dl.h>
|
||||||
#include <grub/pci.h>
|
#include <grub/dma.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/usb.h>
|
#include <grub/usb.h>
|
||||||
|
|
|
@ -635,7 +635,7 @@ grub_cmd_acpi (struct grub_extcmd_context *ctxt, int argc, char **args)
|
||||||
grub_size_t size;
|
grub_size_t size;
|
||||||
char *buf;
|
char *buf;
|
||||||
|
|
||||||
file = grub_file_open (args[i]);
|
file = grub_file_open (args[i], GRUB_FILE_TYPE_ACPI_TABLE);
|
||||||
if (! file)
|
if (! file)
|
||||||
{
|
{
|
||||||
free_tables ();
|
free_tables ();
|
||||||
|
|
|
@ -121,8 +121,8 @@ grub_cmd_blocklist (grub_command_t cmd __attribute__ ((unused)),
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
grub_file_filter_disable_compression ();
|
file = grub_file_open (args[0], GRUB_FILE_TYPE_PRINT_BLOCKLIST
|
||||||
file = grub_file_open (args[0]);
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ grub_cmd_cat (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (argc != 1)
|
if (argc != 1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
file = grub_file_open (args[0]);
|
file = grub_file_open (args[0], GRUB_FILE_TYPE_CAT);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,8 @@ grub_cmd_cmp (grub_command_t cmd __attribute__ ((unused)),
|
||||||
grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0],
|
grub_printf_ (N_("Compare file `%s' with `%s':\n"), args[0],
|
||||||
args[1]);
|
args[1]);
|
||||||
|
|
||||||
file1 = grub_file_open (args[0]);
|
file1 = grub_file_open (args[0], GRUB_FILE_TYPE_CMP);
|
||||||
file2 = grub_file_open (args[1]);
|
file2 = grub_file_open (args[1], GRUB_FILE_TYPE_CMP);
|
||||||
if (! file1 || ! file2)
|
if (! file1 || ! file2)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,8 @@ grub_cmd_date (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
|
||||||
for (; argc; argc--, args++)
|
for (; argc; argc--, args++)
|
||||||
{
|
{
|
||||||
char *p, c;
|
const char *p;
|
||||||
|
char c;
|
||||||
int m1, ofs, n, cur_mask;
|
int m1, ofs, n, cur_mask;
|
||||||
|
|
||||||
p = args[0];
|
p = args[0];
|
||||||
|
|
|
@ -169,7 +169,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
{
|
{
|
||||||
file = grub_file_open (argv[1]);
|
file = grub_file_open (argv[1], GRUB_FILE_TYPE_VBE_DUMP);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ grub_cmd_loadbios (grub_command_t cmd __attribute__ ((unused)),
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
file = grub_file_open (argv[0]);
|
file = grub_file_open (argv[0], GRUB_FILE_TYPE_VBE_DUMP);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
|
|
@ -109,8 +109,10 @@ grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
|
||||||
status = efi_call_3 (grub_efi_system_table->boot_services->protocols_per_handle,
|
status = efi_call_3 (grub_efi_system_table->boot_services->protocols_per_handle,
|
||||||
handle, &protocols, &num_protocols);
|
handle, &protocols, &num_protocols);
|
||||||
if (status != GRUB_EFI_SUCCESS)
|
if (status != GRUB_EFI_SUCCESS) {
|
||||||
grub_printf ("Unable to retrieve protocols\n");
|
grub_printf ("Unable to retrieve protocols\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
for (j = 0; j < num_protocols; j++)
|
for (j = 0; j < num_protocols; j++)
|
||||||
{
|
{
|
||||||
for (k = 0; k < ARRAY_SIZE (known_protocols); k++)
|
for (k = 0; k < ARRAY_SIZE (known_protocols); k++)
|
||||||
|
|
|
@ -40,6 +40,7 @@ static const struct guid_mapping guid_mappings[] =
|
||||||
{ GRUB_EFI_CRC32_GUIDED_SECTION_EXTRACTION_GUID,
|
{ GRUB_EFI_CRC32_GUIDED_SECTION_EXTRACTION_GUID,
|
||||||
"CRC32 GUIDED SECTION EXTRACTION"},
|
"CRC32 GUIDED SECTION EXTRACTION"},
|
||||||
{ GRUB_EFI_DEBUG_IMAGE_INFO_TABLE_GUID, "DEBUG IMAGE INFO"},
|
{ GRUB_EFI_DEBUG_IMAGE_INFO_TABLE_GUID, "DEBUG IMAGE INFO"},
|
||||||
|
{ GRUB_EFI_DEVICE_TREE_GUID, "DEVICE TREE"},
|
||||||
{ GRUB_EFI_DXE_SERVICES_TABLE_GUID, "DXE SERVICES"},
|
{ GRUB_EFI_DXE_SERVICES_TABLE_GUID, "DXE SERVICES"},
|
||||||
{ GRUB_EFI_HCDP_TABLE_GUID, "HCDP"},
|
{ GRUB_EFI_HCDP_TABLE_GUID, "HCDP"},
|
||||||
{ GRUB_EFI_HOB_LIST_GUID, "HOB LIST"},
|
{ GRUB_EFI_HOB_LIST_GUID, "HOB LIST"},
|
||||||
|
@ -48,6 +49,7 @@ static const struct guid_mapping guid_mappings[] =
|
||||||
{ GRUB_EFI_MPS_TABLE_GUID, "MPS"},
|
{ GRUB_EFI_MPS_TABLE_GUID, "MPS"},
|
||||||
{ GRUB_EFI_SAL_TABLE_GUID, "SAL"},
|
{ GRUB_EFI_SAL_TABLE_GUID, "SAL"},
|
||||||
{ GRUB_EFI_SMBIOS_TABLE_GUID, "SMBIOS"},
|
{ GRUB_EFI_SMBIOS_TABLE_GUID, "SMBIOS"},
|
||||||
|
{ GRUB_EFI_SMBIOS3_TABLE_GUID, "SMBIOS3"},
|
||||||
{ GRUB_EFI_SYSTEM_RESOURCE_TABLE_GUID, "SYSTEM RESOURCE TABLE"},
|
{ GRUB_EFI_SYSTEM_RESOURCE_TABLE_GUID, "SYSTEM RESOURCE TABLE"},
|
||||||
{ GRUB_EFI_TIANO_CUSTOM_DECOMPRESS_GUID, "TIANO CUSTOM DECOMPRESS"},
|
{ GRUB_EFI_TIANO_CUSTOM_DECOMPRESS_GUID, "TIANO CUSTOM DECOMPRESS"},
|
||||||
{ GRUB_EFI_TSC_FREQUENCY_GUID, "TSC FREQUENCY"},
|
{ GRUB_EFI_TSC_FREQUENCY_GUID, "TSC FREQUENCY"},
|
||||||
|
@ -71,7 +73,8 @@ grub_cmd_lsefisystab (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
grub_printf ("Vendor: ");
|
grub_printf ("Vendor: ");
|
||||||
|
|
||||||
for (vendor_utf16 = st->firmware_vendor; *vendor_utf16; vendor_utf16++);
|
for (vendor_utf16 = st->firmware_vendor; *vendor_utf16; vendor_utf16++);
|
||||||
vendor = grub_malloc (4 * (vendor_utf16 - st->firmware_vendor) + 1);
|
/* Allocate extra 3 bytes to simplify math. */
|
||||||
|
vendor = grub_calloc (4, vendor_utf16 - st->firmware_vendor + 1);
|
||||||
if (!vendor)
|
if (!vendor)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
*grub_utf16_to_utf8 ((grub_uint8_t *) vendor, st->firmware_vendor,
|
*grub_utf16_to_utf8 ((grub_uint8_t *) vendor, st->firmware_vendor,
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* EFI shim lock verifier.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/file.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/verify.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
#define GRUB_EFI_SHIM_LOCK_GUID \
|
||||||
|
{ 0x605dab50, 0xe046, 0x4300, \
|
||||||
|
{ 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } \
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_efi_shim_lock_protocol
|
||||||
|
{
|
||||||
|
grub_efi_status_t
|
||||||
|
(*verify) (void *buffer, grub_uint32_t size);
|
||||||
|
};
|
||||||
|
typedef struct grub_efi_shim_lock_protocol grub_efi_shim_lock_protocol_t;
|
||||||
|
|
||||||
|
static grub_efi_guid_t shim_lock_guid = GRUB_EFI_SHIM_LOCK_GUID;
|
||||||
|
static grub_efi_shim_lock_protocol_t *sl;
|
||||||
|
|
||||||
|
/* List of modules which cannot be loaded if UEFI secure boot mode is enabled. */
|
||||||
|
static const char * const disabled_mods[] = {"iorw", "memrw", "wrmsr", NULL};
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
shim_lock_init (grub_file_t io, enum grub_file_type type,
|
||||||
|
void **context __attribute__ ((unused)),
|
||||||
|
enum grub_verify_flags *flags)
|
||||||
|
{
|
||||||
|
const char *b, *e;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
*flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION;
|
||||||
|
|
||||||
|
if (!sl)
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
switch (type & GRUB_FILE_TYPE_MASK)
|
||||||
|
{
|
||||||
|
case GRUB_FILE_TYPE_GRUB_MODULE:
|
||||||
|
/* Establish GRUB module name. */
|
||||||
|
b = grub_strrchr (io->name, '/');
|
||||||
|
e = grub_strrchr (io->name, '.');
|
||||||
|
|
||||||
|
b = b ? (b + 1) : io->name;
|
||||||
|
e = e ? e : io->name + grub_strlen (io->name);
|
||||||
|
e = (e > b) ? e : io->name + grub_strlen (io->name);
|
||||||
|
|
||||||
|
for (i = 0; disabled_mods[i]; i++)
|
||||||
|
if (!grub_strncmp (b, disabled_mods[i], grub_strlen (b) - grub_strlen (e)))
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_ACCESS_DENIED,
|
||||||
|
N_("module cannot be loaded in UEFI secure boot mode: %s"),
|
||||||
|
io->name);
|
||||||
|
return GRUB_ERR_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fall through. */
|
||||||
|
|
||||||
|
case GRUB_FILE_TYPE_ACPI_TABLE:
|
||||||
|
case GRUB_FILE_TYPE_DEVICE_TREE_IMAGE:
|
||||||
|
*flags = GRUB_VERIFY_FLAGS_DEFER_AUTH;
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
case GRUB_FILE_TYPE_LINUX_KERNEL:
|
||||||
|
case GRUB_FILE_TYPE_MULTIBOOT_KERNEL:
|
||||||
|
case GRUB_FILE_TYPE_BSD_KERNEL:
|
||||||
|
case GRUB_FILE_TYPE_XNU_KERNEL:
|
||||||
|
case GRUB_FILE_TYPE_PLAN9_KERNEL:
|
||||||
|
for (i = 0; disabled_mods[i]; i++)
|
||||||
|
if (grub_dl_get (disabled_mods[i]))
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_ACCESS_DENIED,
|
||||||
|
N_("cannot boot due to dangerous module in memory: %s"),
|
||||||
|
disabled_mods[i]);
|
||||||
|
return GRUB_ERR_ACCESS_DENIED;
|
||||||
|
}
|
||||||
|
|
||||||
|
*flags = GRUB_VERIFY_FLAGS_SINGLE_CHUNK;
|
||||||
|
|
||||||
|
/* Fall through. */
|
||||||
|
|
||||||
|
default:
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
shim_lock_write (void *context __attribute__ ((unused)), void *buf, grub_size_t size)
|
||||||
|
{
|
||||||
|
if (sl->verify (buf, size) != GRUB_EFI_SUCCESS)
|
||||||
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad shim signature"));
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_file_verifier shim_lock =
|
||||||
|
{
|
||||||
|
.name = "shim_lock",
|
||||||
|
.init = shim_lock_init,
|
||||||
|
.write = shim_lock_write
|
||||||
|
};
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(shim_lock)
|
||||||
|
{
|
||||||
|
sl = grub_efi_locate_protocol (&shim_lock_guid, 0);
|
||||||
|
grub_verifier_register (&shim_lock);
|
||||||
|
|
||||||
|
if (!sl)
|
||||||
|
return;
|
||||||
|
|
||||||
|
grub_dl_set_persistent (mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(shim_lock)
|
||||||
|
{
|
||||||
|
grub_verifier_unregister (&shim_lock);
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* smbios.c - get smbios tables. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/smbios.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/efi/api.h>
|
||||||
|
|
||||||
|
struct grub_smbios_eps *
|
||||||
|
grub_machine_smbios_get_eps (void)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
static grub_efi_packed_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID;
|
||||||
|
|
||||||
|
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
|
||||||
|
{
|
||||||
|
grub_efi_packed_guid_t *guid =
|
||||||
|
&grub_efi_system_table->configuration_table[i].vendor_guid;
|
||||||
|
|
||||||
|
if (! grub_memcmp (guid, &smbios_guid, sizeof (grub_efi_packed_guid_t)))
|
||||||
|
return (struct grub_smbios_eps *)
|
||||||
|
grub_efi_system_table->configuration_table[i].vendor_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_smbios_eps3 *
|
||||||
|
grub_machine_smbios_get_eps3 (void)
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
static grub_efi_packed_guid_t smbios3_guid = GRUB_EFI_SMBIOS3_TABLE_GUID;
|
||||||
|
|
||||||
|
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
|
||||||
|
{
|
||||||
|
grub_efi_packed_guid_t *guid =
|
||||||
|
&grub_efi_system_table->configuration_table[i].vendor_guid;
|
||||||
|
|
||||||
|
if (! grub_memcmp (guid, &smbios3_guid, sizeof (grub_efi_packed_guid_t)))
|
||||||
|
return (struct grub_smbios_eps3 *)
|
||||||
|
grub_efi_system_table->configuration_table[i].vendor_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,238 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2018 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* EFI TPM support code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/efi/api.h>
|
||||||
|
#include <grub/efi/efi.h>
|
||||||
|
#include <grub/efi/tpm.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/tpm.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
|
||||||
|
typedef TCG_PCR_EVENT grub_tpm_event_t;
|
||||||
|
|
||||||
|
static grub_efi_guid_t tpm_guid = EFI_TPM_GUID;
|
||||||
|
static grub_efi_guid_t tpm2_guid = EFI_TPM2_GUID;
|
||||||
|
|
||||||
|
static grub_efi_handle_t *grub_tpm_handle;
|
||||||
|
static grub_uint8_t grub_tpm_version;
|
||||||
|
|
||||||
|
static grub_int8_t tpm1_present = -1;
|
||||||
|
static grub_int8_t tpm2_present = -1;
|
||||||
|
|
||||||
|
static grub_efi_boolean_t
|
||||||
|
grub_tpm1_present (grub_efi_tpm_protocol_t *tpm)
|
||||||
|
{
|
||||||
|
grub_efi_status_t status;
|
||||||
|
TCG_EFI_BOOT_SERVICE_CAPABILITY caps;
|
||||||
|
grub_uint32_t flags;
|
||||||
|
grub_efi_physical_address_t eventlog, lastevent;
|
||||||
|
|
||||||
|
if (tpm1_present != -1)
|
||||||
|
return (grub_efi_boolean_t) tpm1_present;
|
||||||
|
|
||||||
|
caps.Size = (grub_uint8_t) sizeof (caps);
|
||||||
|
|
||||||
|
status = efi_call_5 (tpm->status_check, tpm, &caps, &flags, &eventlog,
|
||||||
|
&lastevent);
|
||||||
|
|
||||||
|
if (status != GRUB_EFI_SUCCESS || caps.TPMDeactivatedFlag
|
||||||
|
|| !caps.TPMPresentFlag)
|
||||||
|
return tpm1_present = 0;
|
||||||
|
|
||||||
|
return tpm1_present = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_efi_boolean_t
|
||||||
|
grub_tpm2_present (grub_efi_tpm2_protocol_t *tpm)
|
||||||
|
{
|
||||||
|
grub_efi_status_t status;
|
||||||
|
EFI_TCG2_BOOT_SERVICE_CAPABILITY caps;
|
||||||
|
|
||||||
|
caps.Size = (grub_uint8_t) sizeof (caps);
|
||||||
|
|
||||||
|
if (tpm2_present != -1)
|
||||||
|
return (grub_efi_boolean_t) tpm2_present;
|
||||||
|
|
||||||
|
status = efi_call_2 (tpm->get_capability, tpm, &caps);
|
||||||
|
|
||||||
|
if (status != GRUB_EFI_SUCCESS || !caps.TPMPresentFlag)
|
||||||
|
return tpm2_present = 0;
|
||||||
|
|
||||||
|
return tpm2_present = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_efi_boolean_t
|
||||||
|
grub_tpm_handle_find (grub_efi_handle_t *tpm_handle,
|
||||||
|
grub_efi_uint8_t *protocol_version)
|
||||||
|
{
|
||||||
|
grub_efi_handle_t *handles;
|
||||||
|
grub_efi_uintn_t num_handles;
|
||||||
|
|
||||||
|
if (grub_tpm_handle != NULL)
|
||||||
|
{
|
||||||
|
*tpm_handle = grub_tpm_handle;
|
||||||
|
*protocol_version = grub_tpm_version;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm_guid, NULL,
|
||||||
|
&num_handles);
|
||||||
|
if (handles && num_handles > 0)
|
||||||
|
{
|
||||||
|
grub_tpm_handle = handles[0];
|
||||||
|
*tpm_handle = handles[0];
|
||||||
|
grub_tpm_version = 1;
|
||||||
|
*protocol_version = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
handles = grub_efi_locate_handle (GRUB_EFI_BY_PROTOCOL, &tpm2_guid, NULL,
|
||||||
|
&num_handles);
|
||||||
|
if (handles && num_handles > 0)
|
||||||
|
{
|
||||||
|
grub_tpm_handle = handles[0];
|
||||||
|
*tpm_handle = handles[0];
|
||||||
|
grub_tpm_version = 2;
|
||||||
|
*protocol_version = 2;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_tpm1_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf,
|
||||||
|
grub_size_t size, grub_uint8_t pcr,
|
||||||
|
const char *description)
|
||||||
|
{
|
||||||
|
grub_tpm_event_t *event;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_tpm_protocol_t *tpm;
|
||||||
|
grub_efi_physical_address_t lastevent;
|
||||||
|
grub_uint32_t algorithm;
|
||||||
|
grub_uint32_t eventnum = 0;
|
||||||
|
|
||||||
|
tpm = grub_efi_open_protocol (tpm_handle, &tpm_guid,
|
||||||
|
GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||||
|
|
||||||
|
if (!grub_tpm1_present (tpm))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
event = grub_zalloc (sizeof (*event) + grub_strlen (description) + 1);
|
||||||
|
if (!event)
|
||||||
|
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||||
|
N_("cannot allocate TPM event buffer"));
|
||||||
|
|
||||||
|
event->PCRIndex = pcr;
|
||||||
|
event->EventType = EV_IPL;
|
||||||
|
event->EventSize = grub_strlen (description) + 1;
|
||||||
|
grub_memcpy (event->Event, description, event->EventSize);
|
||||||
|
|
||||||
|
algorithm = TCG_ALG_SHA;
|
||||||
|
status = efi_call_7 (tpm->log_extend_event, tpm, (grub_addr_t) buf, (grub_uint64_t) size,
|
||||||
|
algorithm, event, &eventnum, &lastevent);
|
||||||
|
grub_free (event);
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case GRUB_EFI_SUCCESS:
|
||||||
|
return 0;
|
||||||
|
case GRUB_EFI_DEVICE_ERROR:
|
||||||
|
return grub_error (GRUB_ERR_IO, N_("Command failed"));
|
||||||
|
case GRUB_EFI_INVALID_PARAMETER:
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter"));
|
||||||
|
case GRUB_EFI_BUFFER_TOO_SMALL:
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("Output buffer too small"));
|
||||||
|
case GRUB_EFI_NOT_FOUND:
|
||||||
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable"));
|
||||||
|
default:
|
||||||
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_tpm2_log_event (grub_efi_handle_t tpm_handle, unsigned char *buf,
|
||||||
|
grub_size_t size, grub_uint8_t pcr,
|
||||||
|
const char *description)
|
||||||
|
{
|
||||||
|
EFI_TCG2_EVENT *event;
|
||||||
|
grub_efi_status_t status;
|
||||||
|
grub_efi_tpm2_protocol_t *tpm;
|
||||||
|
|
||||||
|
tpm = grub_efi_open_protocol (tpm_handle, &tpm2_guid,
|
||||||
|
GRUB_EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||||
|
|
||||||
|
if (!grub_tpm2_present (tpm))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
event =
|
||||||
|
grub_zalloc (sizeof (EFI_TCG2_EVENT) + grub_strlen (description) + 1);
|
||||||
|
if (!event)
|
||||||
|
return grub_error (GRUB_ERR_OUT_OF_MEMORY,
|
||||||
|
N_("cannot allocate TPM event buffer"));
|
||||||
|
|
||||||
|
event->Header.HeaderSize = sizeof (EFI_TCG2_EVENT_HEADER);
|
||||||
|
event->Header.HeaderVersion = 1;
|
||||||
|
event->Header.PCRIndex = pcr;
|
||||||
|
event->Header.EventType = EV_IPL;
|
||||||
|
event->Size =
|
||||||
|
sizeof (*event) - sizeof (event->Event) + grub_strlen (description) + 1;
|
||||||
|
grub_memcpy (event->Event, description, grub_strlen (description) + 1);
|
||||||
|
|
||||||
|
status = efi_call_5 (tpm->hash_log_extend_event, tpm, 0, (grub_addr_t) buf,
|
||||||
|
(grub_uint64_t) size, event);
|
||||||
|
grub_free (event);
|
||||||
|
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case GRUB_EFI_SUCCESS:
|
||||||
|
return 0;
|
||||||
|
case GRUB_EFI_DEVICE_ERROR:
|
||||||
|
return grub_error (GRUB_ERR_IO, N_("Command failed"));
|
||||||
|
case GRUB_EFI_INVALID_PARAMETER:
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid parameter"));
|
||||||
|
case GRUB_EFI_BUFFER_TOO_SMALL:
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("Output buffer too small"));
|
||||||
|
case GRUB_EFI_NOT_FOUND:
|
||||||
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("TPM unavailable"));
|
||||||
|
default:
|
||||||
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, N_("Unknown TPM error"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_tpm_measure (unsigned char *buf, grub_size_t size, grub_uint8_t pcr,
|
||||||
|
const char *description)
|
||||||
|
{
|
||||||
|
grub_efi_handle_t tpm_handle;
|
||||||
|
grub_efi_uint8_t protocol_version;
|
||||||
|
|
||||||
|
if (!grub_tpm_handle_find (&tpm_handle, &protocol_version))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (protocol_version == 1)
|
||||||
|
return grub_tpm1_log_event (tpm_handle, buf, size, pcr, description);
|
||||||
|
else
|
||||||
|
return grub_tpm2_log_event (tpm_handle, buf, size, pcr, description);
|
||||||
|
}
|
|
@ -27,6 +27,8 @@
|
||||||
#include <grub/elf.h>
|
#include <grub/elf.h>
|
||||||
#include <grub/xen_file.h>
|
#include <grub/xen_file.h>
|
||||||
#include <grub/efi/pe32.h>
|
#include <grub/efi/pe32.h>
|
||||||
|
#include <grub/arm/linux.h>
|
||||||
|
#include <grub/arm64/linux.h>
|
||||||
#include <grub/i386/linux.h>
|
#include <grub/i386/linux.h>
|
||||||
#include <grub/xnu.h>
|
#include <grub/xnu.h>
|
||||||
#include <grub/machoload.h>
|
#include <grub/machoload.h>
|
||||||
|
@ -88,6 +90,10 @@ static const struct grub_arg_option options[] = {
|
||||||
N_("Check if FILE is ARM64 EFI file"), 0, 0},
|
N_("Check if FILE is ARM64 EFI file"), 0, 0},
|
||||||
{"is-arm-efi", 0, 0,
|
{"is-arm-efi", 0, 0,
|
||||||
N_("Check if FILE is ARM EFI file"), 0, 0},
|
N_("Check if FILE is ARM EFI file"), 0, 0},
|
||||||
|
{"is-riscv32-efi", 0, 0,
|
||||||
|
N_("Check if FILE is RISC-V 32bit EFI file"), 0, 0},
|
||||||
|
{"is-riscv64-efi", 0, 0,
|
||||||
|
N_("Check if FILE is RISC-V 64bit EFI file"), 0, 0},
|
||||||
{"is-hibernated-hiberfil", 0, 0,
|
{"is-hibernated-hiberfil", 0, 0,
|
||||||
N_("Check if FILE is hiberfil.sys in hibernated state"), 0, 0},
|
N_("Check if FILE is hiberfil.sys in hibernated state"), 0, 0},
|
||||||
{"is-x86_64-xnu", 0, 0,
|
{"is-x86_64-xnu", 0, 0,
|
||||||
|
@ -128,6 +134,7 @@ enum
|
||||||
IS_IA_EFI,
|
IS_IA_EFI,
|
||||||
IS_ARM64_EFI,
|
IS_ARM64_EFI,
|
||||||
IS_ARM_EFI,
|
IS_ARM_EFI,
|
||||||
|
IS_RISCV_EFI,
|
||||||
IS_HIBERNATED,
|
IS_HIBERNATED,
|
||||||
IS_XNU64,
|
IS_XNU64,
|
||||||
IS_XNU32,
|
IS_XNU32,
|
||||||
|
@ -163,7 +170,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (type == -1)
|
if (type == -1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified");
|
||||||
|
|
||||||
file = grub_file_open (args[0]);
|
file = grub_file_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL);
|
||||||
if (!file)
|
if (!file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -383,21 +390,19 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
}
|
}
|
||||||
case IS_ARM_LINUX:
|
case IS_ARM_LINUX:
|
||||||
{
|
{
|
||||||
grub_uint32_t sig, sig_pi;
|
struct linux_arm_kernel_header lh;
|
||||||
if (grub_file_read (file, &sig_pi, 4) != 4)
|
|
||||||
|
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
|
||||||
break;
|
break;
|
||||||
/* Raspberry pi. */
|
/* Short forward branch in A32 state (for Raspberry pi kernels). */
|
||||||
if (sig_pi == grub_cpu_to_le32_compile_time (0xea000006))
|
if (lh.code0 == grub_cpu_to_le32_compile_time (0xea000006))
|
||||||
{
|
{
|
||||||
ret = 1;
|
ret = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (grub_file_seek (file, 0x24) == (grub_size_t) -1)
|
if (lh.magic ==
|
||||||
break;
|
grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM_MAGIC_SIGNATURE))
|
||||||
if (grub_file_read (file, &sig, 4) != 4)
|
|
||||||
break;
|
|
||||||
if (sig == grub_cpu_to_le32_compile_time (0x016f2818))
|
|
||||||
{
|
{
|
||||||
ret = 1;
|
ret = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -406,13 +411,13 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
}
|
}
|
||||||
case IS_ARM64_LINUX:
|
case IS_ARM64_LINUX:
|
||||||
{
|
{
|
||||||
grub_uint32_t sig;
|
struct linux_arm64_kernel_header lh;
|
||||||
|
|
||||||
if (grub_file_seek (file, 0x38) == (grub_size_t) -1)
|
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
|
||||||
break;
|
break;
|
||||||
if (grub_file_read (file, &sig, 4) != 4)
|
|
||||||
break;
|
if (lh.magic ==
|
||||||
if (sig == grub_cpu_to_le32_compile_time (0x644d5241))
|
grub_cpu_to_le32_compile_time (GRUB_LINUX_ARM64_MAGIC_SIGNATURE))
|
||||||
{
|
{
|
||||||
ret = 1;
|
ret = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -497,7 +502,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
case IS_X86_LINUX32:
|
case IS_X86_LINUX32:
|
||||||
case IS_X86_LINUX:
|
case IS_X86_LINUX:
|
||||||
{
|
{
|
||||||
struct linux_kernel_header lh;
|
struct linux_i386_kernel_header lh;
|
||||||
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
|
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
|
||||||
break;
|
break;
|
||||||
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
|
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
|
||||||
|
@ -508,7 +513,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
|
||||||
/* FIXME: some really old kernels (< 1.3.73) will fail this. */
|
/* FIXME: some really old kernels (< 1.3.73) will fail this. */
|
||||||
if (lh.header !=
|
if (lh.header !=
|
||||||
grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|
grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE)
|
||||||
|| grub_le_to_cpu16 (lh.version) < 0x0200)
|
|| grub_le_to_cpu16 (lh.version) < 0x0200)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -521,7 +526,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
/* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and
|
/* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and
|
||||||
still not support 32-bit boot. */
|
still not support 32-bit boot. */
|
||||||
if (lh.header !=
|
if (lh.header !=
|
||||||
grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|
grub_cpu_to_le32_compile_time (GRUB_LINUX_I386_MAGIC_SIGNATURE)
|
||||||
|| grub_le_to_cpu16 (lh.version) < 0x0203)
|
|| grub_le_to_cpu16 (lh.version) < 0x0203)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -546,7 +551,8 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
case IS_XNU64:
|
case IS_XNU64:
|
||||||
case IS_XNU32:
|
case IS_XNU32:
|
||||||
{
|
{
|
||||||
macho = grub_macho_open (args[0], (type == IS_XNU64));
|
macho = grub_macho_open (args[0], GRUB_FILE_TYPE_XNU_KERNEL,
|
||||||
|
(type == IS_XNU64));
|
||||||
if (!macho)
|
if (!macho)
|
||||||
break;
|
break;
|
||||||
/* FIXME: more checks? */
|
/* FIXME: more checks? */
|
||||||
|
@ -570,6 +576,7 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
case IS_IA_EFI:
|
case IS_IA_EFI:
|
||||||
case IS_ARM64_EFI:
|
case IS_ARM64_EFI:
|
||||||
case IS_ARM_EFI:
|
case IS_ARM_EFI:
|
||||||
|
case IS_RISCV_EFI:
|
||||||
{
|
{
|
||||||
char signature[4];
|
char signature[4];
|
||||||
grub_uint32_t pe_offset;
|
grub_uint32_t pe_offset;
|
||||||
|
@ -615,7 +622,13 @@ grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
&& coff_head.machine !=
|
&& coff_head.machine !=
|
||||||
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARMTHUMB_MIXED))
|
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARMTHUMB_MIXED))
|
||||||
break;
|
break;
|
||||||
if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_EFI)
|
if (type == IS_RISCV_EFI
|
||||||
|
&& coff_head.machine !=
|
||||||
|
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_RISCV64))
|
||||||
|
/* TODO: Determine bitness dynamically */
|
||||||
|
break;
|
||||||
|
if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_EFI ||
|
||||||
|
type == IS_RISCV_EFI)
|
||||||
{
|
{
|
||||||
struct grub_pe64_optional_header o64;
|
struct grub_pe64_optional_header o64;
|
||||||
if (grub_file_read (file, &o64, sizeof (o64)) != sizeof (o64))
|
if (grub_file_read (file, &o64, sizeof (o64)) != sizeof (o64))
|
||||||
|
|
|
@ -113,7 +113,7 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||||
|
|
||||||
hashlist = grub_file_open (hashfilename);
|
hashlist = grub_file_open (hashfilename, GRUB_FILE_TYPE_HASHLIST);
|
||||||
if (!hashlist)
|
if (!hashlist)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -141,17 +141,15 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||||
filename = grub_xasprintf ("%s/%s", prefix, p);
|
filename = grub_xasprintf ("%s/%s", prefix, p);
|
||||||
if (!filename)
|
if (!filename)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
if (!uncompress)
|
file = grub_file_open (filename, GRUB_FILE_TYPE_TO_HASH
|
||||||
grub_file_filter_disable_compression ();
|
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
file = grub_file_open (filename);
|
: GRUB_FILE_TYPE_NONE));
|
||||||
grub_free (filename);
|
grub_free (filename);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
file = grub_file_open (p, GRUB_FILE_TYPE_TO_HASH
|
||||||
if (!uncompress)
|
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
grub_file_filter_disable_compression ();
|
: GRUB_FILE_TYPE_NONE));
|
||||||
file = grub_file_open (p);
|
|
||||||
}
|
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
grub_file_close (hashlist);
|
grub_file_close (hashlist);
|
||||||
|
@ -242,9 +240,9 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
unsigned j;
|
unsigned j;
|
||||||
if (!uncompress)
|
file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
|
||||||
grub_file_filter_disable_compression ();
|
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
file = grub_file_open (args[i]);
|
: GRUB_FILE_TYPE_NONE));
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
if (!keep)
|
if (!keep)
|
||||||
|
|
|
@ -90,7 +90,7 @@ grub_cmd_hexdump (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
|
|
||||||
file = grub_file_open (args[0]);
|
file = grub_file_open (args[0], GRUB_FILE_TYPE_HEXCAT);
|
||||||
if (! file)
|
if (! file)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
parse_args (int argc, char *argv[], int *byte, int *bit)
|
parse_args (int argc, char *argv[], int *byte, int *bit)
|
||||||
{
|
{
|
||||||
char *rest;
|
const char *rest;
|
||||||
|
|
||||||
if (argc != 1)
|
if (argc != 1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "address required");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "address required");
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/command.h>
|
#include <grub/command.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
#include <grub/i386/coreboot/lbio.h>
|
#include <grub/coreboot/lbio.h>
|
||||||
#include <grub/i386/tsc.h>
|
#include <grub/i386/tsc.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/command.h>
|
#include <grub/command.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
#include <grub/i386/coreboot/lbio.h>
|
#include <grub/coreboot/lbio.h>
|
||||||
#include <grub/i386/tsc.h>
|
#include <grub/i386/tsc.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
|
@ -93,7 +93,7 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
|
||||||
grub_uint32_t tempo;
|
grub_uint32_t tempo;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
|
|
||||||
file = grub_file_open (args[0]);
|
file = grub_file_open (args[0], GRUB_FILE_TYPE_AUDIO);
|
||||||
|
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
@ -132,7 +132,7 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *end;
|
const char *end;
|
||||||
unsigned tempo;
|
unsigned tempo;
|
||||||
struct note note;
|
struct note note;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* smbios.c - get smbios tables. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/acpi.h>
|
||||||
|
#include <grub/smbios.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
|
||||||
|
struct grub_smbios_eps *
|
||||||
|
grub_machine_smbios_get_eps (void)
|
||||||
|
{
|
||||||
|
grub_uint8_t *ptr;
|
||||||
|
|
||||||
|
grub_dprintf ("smbios", "Looking for SMBIOS EPS. Scanning BIOS\n");
|
||||||
|
|
||||||
|
for (ptr = (grub_uint8_t *) 0xf0000; ptr < (grub_uint8_t *) 0x100000; ptr += 16)
|
||||||
|
if (grub_memcmp (ptr, "_SM_", 4) == 0
|
||||||
|
&& grub_byte_checksum (ptr, sizeof (struct grub_smbios_eps)) == 0)
|
||||||
|
return (struct grub_smbios_eps *) ptr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_smbios_eps3 *
|
||||||
|
grub_machine_smbios_get_eps3 (void)
|
||||||
|
{
|
||||||
|
grub_uint8_t *ptr;
|
||||||
|
|
||||||
|
grub_dprintf ("smbios", "Looking for SMBIOS3 EPS. Scanning BIOS\n");
|
||||||
|
|
||||||
|
for (ptr = (grub_uint8_t *) 0xf0000; ptr < (grub_uint8_t *) 0x100000; ptr += 16)
|
||||||
|
if (grub_memcmp (ptr, "_SM3_", 5) == 0
|
||||||
|
&& grub_byte_checksum (ptr, sizeof (struct grub_smbios_eps3)) == 0)
|
||||||
|
return (struct grub_smbios_eps3 *) ptr;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,102 @@
|
||||||
|
/* rdmsr.c - Read CPU model-specific registers. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
* Based on gcc/gcc/config/i386/driver-i386.c
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/command.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/i386/cpuid.h>
|
||||||
|
#include <grub/i386/rdmsr.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE("GPLv3+");
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd_read;
|
||||||
|
|
||||||
|
static const struct grub_arg_option options[] =
|
||||||
|
{
|
||||||
|
{0, 'v', 0, N_("Save read value into variable VARNAME."),
|
||||||
|
N_("VARNAME"), ARG_TYPE_STRING},
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_msr_read (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
|
{
|
||||||
|
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
|
||||||
|
grub_uint64_t value;
|
||||||
|
const char *ptr;
|
||||||
|
char buf[sizeof("1122334455667788")];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The CPUID instruction should be used to determine whether MSRs
|
||||||
|
* are supported. (CPUID.01H:EDX[5] = 1)
|
||||||
|
*/
|
||||||
|
if (! grub_cpu_is_cpuid_supported ())
|
||||||
|
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||||
|
|
||||||
|
grub_cpuid (0, max_cpuid, manufacturer[0], manufacturer[2], manufacturer[1]);
|
||||||
|
|
||||||
|
if (max_cpuid < 1)
|
||||||
|
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||||
|
|
||||||
|
grub_cpuid (1, a, b, c, features);
|
||||||
|
|
||||||
|
if (!(features & (1 << 5)))
|
||||||
|
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||||
|
|
||||||
|
if (argc != 1)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||||
|
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
ptr = argv[0];
|
||||||
|
addr = grub_strtoul (ptr, &ptr, 0);
|
||||||
|
|
||||||
|
if (grub_errno != GRUB_ERR_NONE)
|
||||||
|
return grub_errno;
|
||||||
|
if (*ptr != '\0')
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
|
||||||
|
|
||||||
|
value = grub_msr_read (addr);
|
||||||
|
|
||||||
|
if (ctxt->state[0].set)
|
||||||
|
{
|
||||||
|
grub_snprintf (buf, sizeof(buf), "%llx", (unsigned long long) value);
|
||||||
|
grub_env_set (ctxt->state[0].arg, buf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
grub_printf ("0x%llx\n", (unsigned long long) value);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(rdmsr)
|
||||||
|
{
|
||||||
|
cmd_read = grub_register_extcmd ("rdmsr", grub_cmd_msr_read, 0, N_("ADDR"),
|
||||||
|
N_("Read a CPU model specific register."),
|
||||||
|
options);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(rdmsr)
|
||||||
|
{
|
||||||
|
grub_unregister_extcmd (cmd_read);
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
/* wrmsr.c - Write CPU model-specific registers. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
* Based on gcc/gcc/config/i386/driver-i386.c
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/command.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/i386/cpuid.h>
|
||||||
|
#include <grub/i386/wrmsr.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE("GPLv3+");
|
||||||
|
|
||||||
|
static grub_command_t cmd_write;
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_msr_write (grub_command_t cmd __attribute__ ((unused)), int argc, char **argv)
|
||||||
|
{
|
||||||
|
grub_uint32_t manufacturer[3], max_cpuid, a, b, c, features, addr;
|
||||||
|
grub_uint64_t value;
|
||||||
|
const char *ptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The CPUID instruction should be used to determine whether MSRs
|
||||||
|
* are supported. (CPUID.01H:EDX[5] = 1)
|
||||||
|
*/
|
||||||
|
if (!grub_cpu_is_cpuid_supported ())
|
||||||
|
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||||
|
|
||||||
|
grub_cpuid (0, max_cpuid, manufacturer[0], manufacturer[2], manufacturer[1]);
|
||||||
|
|
||||||
|
if (max_cpuid < 1)
|
||||||
|
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||||
|
|
||||||
|
grub_cpuid (1, a, b, c, features);
|
||||||
|
|
||||||
|
if (!(features & (1 << 5)))
|
||||||
|
return grub_error (GRUB_ERR_BUG, N_("unsupported instruction"));
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
|
||||||
|
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
ptr = argv[0];
|
||||||
|
addr = grub_strtoul (ptr, &ptr, 0);
|
||||||
|
|
||||||
|
if (grub_errno != GRUB_ERR_NONE)
|
||||||
|
return grub_errno;
|
||||||
|
if (*ptr != '\0')
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
|
||||||
|
|
||||||
|
ptr = argv[1];
|
||||||
|
value = grub_strtoull (ptr, &ptr, 0);
|
||||||
|
|
||||||
|
if (grub_errno != GRUB_ERR_NONE)
|
||||||
|
return grub_errno;
|
||||||
|
if (*ptr != '\0')
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid argument"));
|
||||||
|
|
||||||
|
grub_msr_write (addr, value);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(wrmsr)
|
||||||
|
{
|
||||||
|
cmd_write = grub_register_command ("wrmsr", grub_cmd_msr_write, N_("ADDR VALUE"),
|
||||||
|
N_("Write a value to a CPU model specific register."));
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(wrmsr)
|
||||||
|
{
|
||||||
|
grub_unregister_command (cmd_write);
|
||||||
|
}
|
|
@ -40,7 +40,7 @@ static struct grub_keyboard_layout layout_us = {
|
||||||
/* 0x10 */ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
/* 0x10 */ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
||||||
/* 0x18 */ 'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
|
/* 0x18 */ 'u', 'v', 'w', 'x', 'y', 'z', '1', '2',
|
||||||
/* 0x20 */ '3', '4', '5', '6', '7', '8', '9', '0',
|
/* 0x20 */ '3', '4', '5', '6', '7', '8', '9', '0',
|
||||||
/* 0x28 */ '\n', '\e', '\b', '\t', ' ', '-', '=', '[',
|
/* 0x28 */ '\n', GRUB_TERM_ESC, GRUB_TERM_BACKSPACE, GRUB_TERM_TAB, ' ', '-', '=', '[',
|
||||||
/* According to usage table 0x31 should be mapped to '/'
|
/* According to usage table 0x31 should be mapped to '/'
|
||||||
but testing with real keyboard shows that 0x32 is remapped to '/'.
|
but testing with real keyboard shows that 0x32 is remapped to '/'.
|
||||||
Map 0x31 to 0.
|
Map 0x31 to 0.
|
||||||
|
@ -82,8 +82,8 @@ static struct grub_keyboard_layout layout_us = {
|
||||||
/* 0x10 */ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
|
/* 0x10 */ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
|
||||||
/* 0x18 */ 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@',
|
/* 0x18 */ 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@',
|
||||||
/* 0x20 */ '#', '$', '%', '^', '&', '*', '(', ')',
|
/* 0x20 */ '#', '$', '%', '^', '&', '*', '(', ')',
|
||||||
/* 0x28 */ '\n' | GRUB_TERM_SHIFT, '\e' | GRUB_TERM_SHIFT,
|
/* 0x28 */ '\n' | GRUB_TERM_SHIFT, GRUB_TERM_ESC | GRUB_TERM_SHIFT,
|
||||||
/* 0x2a */ '\b' | GRUB_TERM_SHIFT, '\t' | GRUB_TERM_SHIFT,
|
/* 0x2a */ GRUB_TERM_BACKSPACE | GRUB_TERM_SHIFT, GRUB_TERM_TAB | GRUB_TERM_SHIFT,
|
||||||
/* 0x2c */ ' ' | GRUB_TERM_SHIFT, '_', '+', '{',
|
/* 0x2c */ ' ' | GRUB_TERM_SHIFT, '_', '+', '{',
|
||||||
/* According to usage table 0x31 should be mapped to '/'
|
/* According to usage table 0x31 should be mapped to '/'
|
||||||
but testing with real keyboard shows that 0x32 is remapped to '/'.
|
but testing with real keyboard shows that 0x32 is remapped to '/'.
|
||||||
|
@ -220,7 +220,7 @@ grub_cmd_keymap (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
else
|
else
|
||||||
filename = argv[0];
|
filename = argv[0];
|
||||||
|
|
||||||
file = grub_file_open (filename);
|
file = grub_file_open (filename, GRUB_FILE_TYPE_KEYBOARD_LAYOUT);
|
||||||
if (! file)
|
if (! file)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
|
@ -35,24 +35,6 @@ static const struct grub_arg_option options[] =
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
|
||||||
grub_getkeystatus (void)
|
|
||||||
{
|
|
||||||
int status = 0;
|
|
||||||
grub_term_input_t term;
|
|
||||||
|
|
||||||
if (grub_term_poll_usb)
|
|
||||||
grub_term_poll_usb (0);
|
|
||||||
|
|
||||||
FOR_ACTIVE_TERM_INPUTS(term)
|
|
||||||
{
|
|
||||||
if (term->getkeystatus)
|
|
||||||
status |= term->getkeystatus (term);
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_cmd_keystatus (grub_extcmd_context_t ctxt,
|
grub_cmd_keystatus (grub_extcmd_context_t ctxt,
|
||||||
int argc __attribute__ ((unused)),
|
int argc __attribute__ ((unused)),
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <grub/auth.h>
|
#include <grub/auth.h>
|
||||||
#include <grub/disk.h>
|
#include <grub/disk.h>
|
||||||
#include <grub/partition.h>
|
#include <grub/partition.h>
|
||||||
|
#include <grub/safemath.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ legacy_file (const char *filename)
|
||||||
if (!suffix)
|
if (!suffix)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
file = grub_file_open (filename);
|
file = grub_file_open (filename, GRUB_FILE_TYPE_CONFIG);
|
||||||
if (! file)
|
if (! file)
|
||||||
{
|
{
|
||||||
grub_free (suffix);
|
grub_free (suffix);
|
||||||
|
@ -104,13 +105,22 @@ legacy_file (const char *filename)
|
||||||
if (newsuffix)
|
if (newsuffix)
|
||||||
{
|
{
|
||||||
char *t;
|
char *t;
|
||||||
|
grub_size_t sz;
|
||||||
|
|
||||||
|
if (grub_add (grub_strlen (suffix), grub_strlen (newsuffix), &sz) ||
|
||||||
|
grub_add (sz, 1, &sz))
|
||||||
|
{
|
||||||
|
grub_errno = GRUB_ERR_OUT_OF_RANGE;
|
||||||
|
goto fail_0;
|
||||||
|
}
|
||||||
|
|
||||||
t = suffix;
|
t = suffix;
|
||||||
suffix = grub_realloc (suffix, grub_strlen (suffix)
|
suffix = grub_realloc (suffix, sz);
|
||||||
+ grub_strlen (newsuffix) + 1);
|
|
||||||
if (!suffix)
|
if (!suffix)
|
||||||
{
|
{
|
||||||
grub_free (t);
|
grub_free (t);
|
||||||
|
|
||||||
|
fail_0:
|
||||||
grub_free (entrysrc);
|
grub_free (entrysrc);
|
||||||
grub_free (parsed);
|
grub_free (parsed);
|
||||||
grub_free (newsuffix);
|
grub_free (newsuffix);
|
||||||
|
@ -154,13 +164,22 @@ legacy_file (const char *filename)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *t;
|
char *t;
|
||||||
|
grub_size_t sz;
|
||||||
|
|
||||||
|
if (grub_add (grub_strlen (entrysrc), grub_strlen (parsed), &sz) ||
|
||||||
|
grub_add (sz, 1, &sz))
|
||||||
|
{
|
||||||
|
grub_errno = GRUB_ERR_OUT_OF_RANGE;
|
||||||
|
goto fail_1;
|
||||||
|
}
|
||||||
|
|
||||||
t = entrysrc;
|
t = entrysrc;
|
||||||
entrysrc = grub_realloc (entrysrc, grub_strlen (entrysrc)
|
entrysrc = grub_realloc (entrysrc, sz);
|
||||||
+ grub_strlen (parsed) + 1);
|
|
||||||
if (!entrysrc)
|
if (!entrysrc)
|
||||||
{
|
{
|
||||||
grub_free (t);
|
grub_free (t);
|
||||||
|
|
||||||
|
fail_1:
|
||||||
grub_free (parsed);
|
grub_free (parsed);
|
||||||
grub_free (suffix);
|
grub_free (suffix);
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
@ -314,7 +333,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
cutargs = grub_malloc (sizeof (cutargs[0]) * (argc - 1));
|
cutargs = grub_calloc (argc - 1, sizeof (cutargs[0]));
|
||||||
if (!cutargs)
|
if (!cutargs)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
cutargc = argc - 1;
|
cutargc = argc - 1;
|
||||||
|
@ -436,7 +455,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
|
||||||
{
|
{
|
||||||
char rbuf[3] = "-r";
|
char rbuf[3] = "-r";
|
||||||
bsdargc = cutargc + 2;
|
bsdargc = cutargc + 2;
|
||||||
bsdargs = grub_malloc (sizeof (bsdargs[0]) * bsdargc);
|
bsdargs = grub_calloc (bsdargc, sizeof (bsdargs[0]));
|
||||||
if (!bsdargs)
|
if (!bsdargs)
|
||||||
{
|
{
|
||||||
err = grub_errno;
|
err = grub_errno;
|
||||||
|
@ -559,7 +578,7 @@ grub_cmd_legacy_initrdnounzip (struct grub_command *mycmd __attribute__ ((unused
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"),
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"),
|
||||||
"module");
|
"module");
|
||||||
|
|
||||||
newargs = grub_malloc ((argc + 1) * sizeof (newargs[0]));
|
newargs = grub_calloc (argc + 1, sizeof (newargs[0]));
|
||||||
if (!newargs)
|
if (!newargs)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
grub_memcpy (newargs + 1, args, argc * sizeof (newargs[0]));
|
grub_memcpy (newargs + 1, args, argc * sizeof (newargs[0]));
|
||||||
|
|
|
@ -44,7 +44,8 @@ static const struct grub_arg_option options[] =
|
||||||
PUBKEY filter (that insists upon properly signed files) as well. PUBKEY
|
PUBKEY filter (that insists upon properly signed files) as well. PUBKEY
|
||||||
filter is restored before the function returns. */
|
filter is restored before the function returns. */
|
||||||
static grub_file_t
|
static grub_file_t
|
||||||
open_envblk_file (char *filename, int untrusted)
|
open_envblk_file (char *filename,
|
||||||
|
enum grub_file_type type)
|
||||||
{
|
{
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
char *buf = 0;
|
char *buf = 0;
|
||||||
|
@ -72,13 +73,7 @@ open_envblk_file (char *filename, int untrusted)
|
||||||
grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
|
grub_strcpy (filename + len + 1, GRUB_ENVBLK_DEFCFG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The filters that are disabled will be re-enabled by the call to
|
file = grub_file_open (filename, type);
|
||||||
grub_file_open() after this particular file is opened. */
|
|
||||||
grub_file_filter_disable_compression ();
|
|
||||||
if (untrusted)
|
|
||||||
grub_file_filter_disable_pubkey ();
|
|
||||||
|
|
||||||
file = grub_file_open (filename);
|
|
||||||
|
|
||||||
grub_free (buf);
|
grub_free (buf);
|
||||||
return file;
|
return file;
|
||||||
|
@ -171,7 +166,10 @@ grub_cmd_load_env (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
whitelist.list = args;
|
whitelist.list = args;
|
||||||
|
|
||||||
/* state[0] is the -f flag; state[1] is the --skip-sig flag */
|
/* state[0] is the -f flag; state[1] is the --skip-sig flag */
|
||||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, state[1].set);
|
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
||||||
|
GRUB_FILE_TYPE_LOADENV
|
||||||
|
| (state[1].set
|
||||||
|
? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE));
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -206,7 +204,10 @@ grub_cmd_list_env (grub_extcmd_context_t ctxt,
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
grub_envblk_t envblk;
|
grub_envblk_t envblk;
|
||||||
|
|
||||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0, 0);
|
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
||||||
|
GRUB_FILE_TYPE_LOADENV
|
||||||
|
| (state[1].set
|
||||||
|
? GRUB_FILE_TYPE_SKIP_SIGNATURE : GRUB_FILE_TYPE_NONE));
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -390,7 +391,8 @@ grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no variable is specified");
|
||||||
|
|
||||||
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
file = open_envblk_file ((state[0].set) ? state[0].arg : 0,
|
||||||
1 /* allow untrusted */);
|
GRUB_FILE_TYPE_SAVEENV
|
||||||
|
| GRUB_FILE_TYPE_SKIP_SIGNATURE);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
|
|
@ -129,8 +129,8 @@ print_files_long (const char *filename, const struct grub_dirhook_info *info,
|
||||||
|
|
||||||
/* XXX: For ext2fs symlinks are detected as files while they
|
/* XXX: For ext2fs symlinks are detected as files while they
|
||||||
should be reported as directories. */
|
should be reported as directories. */
|
||||||
grub_file_filter_disable_compression ();
|
file = grub_file_open (pathname, GRUB_FILE_TYPE_GET_SIZE
|
||||||
file = grub_file_open (pathname);
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
if (! file)
|
if (! file)
|
||||||
{
|
{
|
||||||
grub_errno = 0;
|
grub_errno = 0;
|
||||||
|
@ -201,6 +201,15 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
|
||||||
if (grub_errno == GRUB_ERR_UNKNOWN_FS)
|
if (grub_errno == GRUB_ERR_UNKNOWN_FS)
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_IEEE1275
|
||||||
|
/*
|
||||||
|
* Close device to prevent a double open in grub_normal_print_device_info().
|
||||||
|
* Otherwise it may lead to hangs on some IEEE 1275 platforms.
|
||||||
|
*/
|
||||||
|
grub_device_close (dev);
|
||||||
|
dev = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
grub_normal_print_device_info (device_name);
|
grub_normal_print_device_info (device_name);
|
||||||
}
|
}
|
||||||
else if (fs)
|
else if (fs)
|
||||||
|
@ -212,9 +221,9 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (longlist)
|
if (longlist)
|
||||||
(fs->dir) (dev, path, print_files_long, &ctx);
|
(fs->fs_dir) (dev, path, print_files_long, &ctx);
|
||||||
else
|
else
|
||||||
(fs->dir) (dev, path, print_files, &ctx);
|
(fs->fs_dir) (dev, path, print_files, &ctx);
|
||||||
|
|
||||||
if (grub_errno == GRUB_ERR_BAD_FILE_TYPE
|
if (grub_errno == GRUB_ERR_BAD_FILE_TYPE
|
||||||
&& path[grub_strlen (path) - 1] != '/')
|
&& path[grub_strlen (path) - 1] != '/')
|
||||||
|
@ -225,8 +234,8 @@ grub_ls_list_files (char *dirname, int longlist, int all, int human)
|
||||||
struct grub_dirhook_info info;
|
struct grub_dirhook_info info;
|
||||||
grub_errno = 0;
|
grub_errno = 0;
|
||||||
|
|
||||||
grub_file_filter_disable_compression ();
|
file = grub_file_open (dirname, GRUB_FILE_TYPE_GET_SIZE
|
||||||
file = grub_file_open (dirname);
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
if (! file)
|
if (! file)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
|
@ -159,12 +159,12 @@ grub_mac_bless_file (grub_device_t dev, const char *path_in, int intel)
|
||||||
*tail = 0;
|
*tail = 0;
|
||||||
ctx.dirname = tail + 1;
|
ctx.dirname = tail + 1;
|
||||||
|
|
||||||
(fs->dir) (dev, *path == 0 ? "/" : path, find_inode, &ctx);
|
(fs->fs_dir) (dev, *path == 0 ? "/" : path, find_inode, &ctx);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ctx.dirname = path + 1;
|
ctx.dirname = path + 1;
|
||||||
(fs->dir) (dev, "/", find_inode, &ctx);
|
(fs->fs_dir) (dev, "/", find_inode, &ctx);
|
||||||
}
|
}
|
||||||
if (!ctx.found)
|
if (!ctx.found)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,8 +52,8 @@ static struct
|
||||||
int key;
|
int key;
|
||||||
} hotkey_aliases[] =
|
} hotkey_aliases[] =
|
||||||
{
|
{
|
||||||
{"backspace", '\b'},
|
{"backspace", GRUB_TERM_BACKSPACE},
|
||||||
{"tab", '\t'},
|
{"tab", GRUB_TERM_TAB},
|
||||||
{"delete", GRUB_TERM_KEY_DC},
|
{"delete", GRUB_TERM_KEY_DC},
|
||||||
{"insert", GRUB_TERM_KEY_INSERT},
|
{"insert", GRUB_TERM_KEY_INSERT},
|
||||||
{"f1", GRUB_TERM_KEY_F1},
|
{"f1", GRUB_TERM_KEY_F1},
|
||||||
|
@ -154,7 +154,7 @@ grub_normal_add_menu_entry (int argc, const char **args,
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
/* Save argc, args to pass as parameters to block arg later. */
|
/* Save argc, args to pass as parameters to block arg later. */
|
||||||
menu_args = grub_malloc (sizeof (char*) * (argc + 1));
|
menu_args = grub_calloc (argc + 1, sizeof (char *));
|
||||||
if (! menu_args)
|
if (! menu_args)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ grub_mini_cmd_cat (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
file = grub_file_open (argv[0]);
|
file = grub_file_open (argv[0], GRUB_FILE_TYPE_CAT);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -137,6 +137,9 @@ grub_mini_cmd_rmmod (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
if (! mod)
|
if (! mod)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no such module");
|
||||||
|
|
||||||
|
if (grub_dl_is_persistent (mod))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "cannot unload persistent module");
|
||||||
|
|
||||||
if (grub_dl_unref (mod) <= 0)
|
if (grub_dl_unref (mod) <= 0)
|
||||||
grub_dl_unload (mod);
|
grub_dl_unload (mod);
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ get_uuid (const char *name, char **uuid, int getnative)
|
||||||
/* Firmware disks. */
|
/* Firmware disks. */
|
||||||
case GRUB_DISK_DEVICE_BIOSDISK_ID:
|
case GRUB_DISK_DEVICE_BIOSDISK_ID:
|
||||||
case GRUB_DISK_DEVICE_OFDISK_ID:
|
case GRUB_DISK_DEVICE_OFDISK_ID:
|
||||||
|
case GRUB_DISK_DEVICE_OBDISK_ID:
|
||||||
case GRUB_DISK_DEVICE_EFIDISK_ID:
|
case GRUB_DISK_DEVICE_EFIDISK_ID:
|
||||||
case GRUB_DISK_DEVICE_NAND_ID:
|
case GRUB_DISK_DEVICE_NAND_ID:
|
||||||
case GRUB_DISK_DEVICE_ARCDISK_ID:
|
case GRUB_DISK_DEVICE_ARCDISK_ID:
|
||||||
|
@ -108,7 +109,7 @@ get_uuid (const char *name, char **uuid, int getnative)
|
||||||
grub_device_close (dev);
|
grub_device_close (dev);
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
if (!fs->uuid || fs->uuid (dev, uuid) || !*uuid)
|
if (!fs->fs_uuid || fs->fs_uuid (dev, uuid) || !*uuid)
|
||||||
{
|
{
|
||||||
grub_device_close (dev);
|
grub_device_close (dev);
|
||||||
|
|
||||||
|
@ -194,7 +195,7 @@ grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)),
|
||||||
else
|
else
|
||||||
path_prefix = prefix;
|
path_prefix = prefix;
|
||||||
|
|
||||||
mods = grub_malloc (argc * sizeof (mods[0]));
|
mods = grub_calloc (argc, sizeof (mods[0]));
|
||||||
if (!mods)
|
if (!mods)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -242,7 +243,8 @@ grub_cmd_nativedisk (grub_command_t cmd __attribute__ ((unused)),
|
||||||
if (! filename)
|
if (! filename)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
file = grub_file_open (filename);
|
file = grub_file_open (filename,
|
||||||
|
GRUB_FILE_TYPE_GRUB_MODULE);
|
||||||
grub_free (filename);
|
grub_free (filename);
|
||||||
if (! file)
|
if (! file)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -59,7 +59,13 @@ grub_parttool_register(const char *part_name,
|
||||||
for (nargs = 0; args[nargs].name != 0; nargs++);
|
for (nargs = 0; args[nargs].name != 0; nargs++);
|
||||||
cur->nargs = nargs;
|
cur->nargs = nargs;
|
||||||
cur->args = (struct grub_parttool_argdesc *)
|
cur->args = (struct grub_parttool_argdesc *)
|
||||||
grub_malloc ((nargs + 1) * sizeof (struct grub_parttool_argdesc));
|
grub_calloc (nargs + 1, sizeof (struct grub_parttool_argdesc));
|
||||||
|
if (!cur->args)
|
||||||
|
{
|
||||||
|
grub_free (cur);
|
||||||
|
curhandle--;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
grub_memcpy (cur->args, args,
|
grub_memcpy (cur->args, args,
|
||||||
(nargs + 1) * sizeof (struct grub_parttool_argdesc));
|
(nargs + 1) * sizeof (struct grub_parttool_argdesc));
|
||||||
|
|
||||||
|
@ -193,7 +199,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
|
||||||
{
|
{
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
|
|
||||||
file = grub_file_open (filename);
|
file = grub_file_open (filename, GRUB_FILE_TYPE_GRUB_MODULE_LIST);
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
char *buf = 0;
|
char *buf = 0;
|
||||||
|
@ -257,7 +263,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
parsed = (int *) grub_zalloc (argc * sizeof (int));
|
parsed = (int *) grub_calloc (argc, sizeof (int));
|
||||||
|
|
||||||
for (i = 1; i < argc; i++)
|
for (i = 1; i < argc; i++)
|
||||||
if (! parsed[i])
|
if (! parsed[i])
|
||||||
|
@ -290,7 +296,7 @@ grub_cmd_parttool (grub_command_t cmd __attribute__ ((unused)),
|
||||||
}
|
}
|
||||||
ptool = cur;
|
ptool = cur;
|
||||||
pargs = (struct grub_parttool_args *)
|
pargs = (struct grub_parttool_args *)
|
||||||
grub_zalloc (ptool->nargs * sizeof (struct grub_parttool_args));
|
grub_calloc (ptool->nargs, sizeof (struct grub_parttool_args));
|
||||||
for (j = i; j < argc; j++)
|
for (j = i; j < argc; j++)
|
||||||
if (! parsed[j])
|
if (! parsed[j])
|
||||||
{
|
{
|
||||||
|
|
|
@ -86,7 +86,7 @@ grub_cmd_password (grub_command_t cmd __attribute__ ((unused)),
|
||||||
int argc, char **args)
|
int argc, char **args)
|
||||||
{
|
{
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
char *ptr, *ptr2;
|
const char *ptr, *ptr2;
|
||||||
grub_uint8_t *ptro;
|
grub_uint8_t *ptro;
|
||||||
struct pbkdf2_password *pass;
|
struct pbkdf2_password *pass;
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ grub_cmd_pcidump (grub_extcmd_context_t ctxt,
|
||||||
if (ctxt->state[0].set)
|
if (ctxt->state[0].set)
|
||||||
{
|
{
|
||||||
ptr = ctxt->state[0].arg;
|
ptr = ctxt->state[0].arg;
|
||||||
ctx.pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff);
|
ctx.pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff);
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
@ -108,8 +108,7 @@ grub_cmd_pcidump (grub_extcmd_context_t ctxt,
|
||||||
if (*ptr != ':')
|
if (*ptr != ':')
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
||||||
ptr++;
|
ptr++;
|
||||||
ctx.pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff)
|
ctx.pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff) << 16;
|
||||||
<< 16;
|
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
else
|
else
|
||||||
|
@ -121,10 +120,10 @@ grub_cmd_pcidump (grub_extcmd_context_t ctxt,
|
||||||
if (ctxt->state[1].set)
|
if (ctxt->state[1].set)
|
||||||
{
|
{
|
||||||
const char *optr;
|
const char *optr;
|
||||||
|
|
||||||
ptr = ctxt->state[1].arg;
|
ptr = ctxt->state[1].arg;
|
||||||
optr = ptr;
|
optr = ptr;
|
||||||
ctx.bus = grub_strtoul (ptr, (char **) &ptr, 16);
|
ctx.bus = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
@ -138,7 +137,7 @@ grub_cmd_pcidump (grub_extcmd_context_t ctxt,
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
||||||
ptr++;
|
ptr++;
|
||||||
optr = ptr;
|
optr = ptr;
|
||||||
ctx.device = grub_strtoul (ptr, (char **) &ptr, 16);
|
ctx.device = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
@ -149,7 +148,7 @@ grub_cmd_pcidump (grub_extcmd_context_t ctxt,
|
||||||
if (*ptr == '.')
|
if (*ptr == '.')
|
||||||
{
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
ctx.function = grub_strtoul (ptr, (char **) &ptr, 16);
|
ctx.function = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
ctx.check_function = 1;
|
ctx.check_function = 1;
|
||||||
|
|
|
@ -30,16 +30,10 @@
|
||||||
#include <grub/env.h>
|
#include <grub/env.h>
|
||||||
#include <grub/kernel.h>
|
#include <grub/kernel.h>
|
||||||
#include <grub/extcmd.h>
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/verify.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
struct grub_verified
|
|
||||||
{
|
|
||||||
grub_file_t file;
|
|
||||||
void *buf;
|
|
||||||
};
|
|
||||||
typedef struct grub_verified *grub_verified_t;
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
OPTION_SKIP_SIG = 0
|
OPTION_SKIP_SIG = 0
|
||||||
|
@ -445,23 +439,27 @@ rsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct grub_pubkey_context
|
||||||
|
{
|
||||||
|
grub_file_t sig;
|
||||||
|
struct signature_v4_header v4;
|
||||||
|
grub_uint8_t v;
|
||||||
|
const gcry_md_spec_t *hash;
|
||||||
|
void *hash_context;
|
||||||
|
};
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_verify_signature_real (char *buf, grub_size_t size,
|
grub_verify_signature_init (struct grub_pubkey_context *ctxt, grub_file_t sig)
|
||||||
grub_file_t f, grub_file_t sig,
|
|
||||||
struct grub_public_key *pkey)
|
|
||||||
{
|
{
|
||||||
grub_size_t len;
|
grub_size_t len;
|
||||||
grub_uint8_t v;
|
|
||||||
grub_uint8_t h;
|
grub_uint8_t h;
|
||||||
grub_uint8_t t;
|
grub_uint8_t t;
|
||||||
grub_uint8_t pk;
|
grub_uint8_t pk;
|
||||||
const gcry_md_spec_t *hash;
|
|
||||||
struct signature_v4_header v4;
|
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
grub_size_t i;
|
|
||||||
gcry_mpi_t mpis[10];
|
|
||||||
grub_uint8_t type = 0;
|
grub_uint8_t type = 0;
|
||||||
|
|
||||||
|
grub_memset (ctxt, 0, sizeof (*ctxt));
|
||||||
|
|
||||||
err = read_packet_header (sig, &type, &len);
|
err = read_packet_header (sig, &type, &len);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -469,18 +467,18 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||||
if (type != 0x2)
|
if (type != 0x2)
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
|
|
||||||
if (grub_file_read (sig, &v, sizeof (v)) != sizeof (v))
|
if (grub_file_read (sig, &ctxt->v, sizeof (ctxt->v)) != sizeof (ctxt->v))
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
|
|
||||||
if (v != 4)
|
if (ctxt->v != 4)
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
|
|
||||||
if (grub_file_read (sig, &v4, sizeof (v4)) != sizeof (v4))
|
if (grub_file_read (sig, &ctxt->v4, sizeof (ctxt->v4)) != sizeof (ctxt->v4))
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
|
|
||||||
h = v4.hash;
|
h = ctxt->v4.hash;
|
||||||
t = v4.type;
|
t = ctxt->v4.type;
|
||||||
pk = v4.pkeyalgo;
|
pk = ctxt->v4.pkeyalgo;
|
||||||
|
|
||||||
if (t != 0)
|
if (t != 0)
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
|
@ -491,183 +489,242 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||||
if (pk >= ARRAY_SIZE (pkalgos) || pkalgos[pk].name == NULL)
|
if (pk >= ARRAY_SIZE (pkalgos) || pkalgos[pk].name == NULL)
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
|
|
||||||
hash = grub_crypto_lookup_md_by_name (hashes[h]);
|
ctxt->hash = grub_crypto_lookup_md_by_name (hashes[h]);
|
||||||
if (!hash)
|
if (!ctxt->hash)
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, "hash `%s' not loaded", hashes[h]);
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, "hash `%s' not loaded", hashes[h]);
|
||||||
|
|
||||||
grub_dprintf ("crypt", "alive\n");
|
grub_dprintf ("crypt", "alive\n");
|
||||||
|
|
||||||
{
|
ctxt->hash_context = grub_zalloc (ctxt->hash->contextsize);
|
||||||
void *context = NULL;
|
if (!ctxt->hash_context)
|
||||||
unsigned char *hval;
|
return grub_errno;
|
||||||
grub_ssize_t rem = grub_be_to_cpu16 (v4.hashed_sub);
|
|
||||||
grub_uint32_t headlen = grub_cpu_to_be32 (rem + 6);
|
|
||||||
grub_uint8_t s;
|
|
||||||
grub_uint16_t unhashed_sub;
|
|
||||||
grub_ssize_t r;
|
|
||||||
grub_uint8_t hash_start[2];
|
|
||||||
gcry_mpi_t hmpi;
|
|
||||||
grub_uint64_t keyid = 0;
|
|
||||||
struct grub_public_subkey *sk;
|
|
||||||
grub_uint8_t *readbuf = NULL;
|
|
||||||
|
|
||||||
context = grub_zalloc (hash->contextsize);
|
ctxt->hash->init (ctxt->hash_context);
|
||||||
readbuf = grub_zalloc (READBUF_SIZE);
|
ctxt->sig = sig;
|
||||||
if (!context || !readbuf)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
hash->init (context);
|
return GRUB_ERR_NONE;
|
||||||
if (buf)
|
}
|
||||||
hash->write (context, buf, size);
|
|
||||||
else
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
r = grub_file_read (f, readbuf, READBUF_SIZE);
|
|
||||||
if (r < 0)
|
|
||||||
goto fail;
|
|
||||||
if (r == 0)
|
|
||||||
break;
|
|
||||||
hash->write (context, readbuf, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
hash->write (context, &v, sizeof (v));
|
static grub_err_t
|
||||||
hash->write (context, &v4, sizeof (v4));
|
grub_pubkey_write (void *ctxt_, void *buf, grub_size_t size)
|
||||||
while (rem)
|
{
|
||||||
{
|
struct grub_pubkey_context *ctxt = ctxt_;
|
||||||
r = grub_file_read (sig, readbuf,
|
ctxt->hash->write (ctxt->hash_context, buf, size);
|
||||||
rem < READBUF_SIZE ? rem : READBUF_SIZE);
|
return GRUB_ERR_NONE;
|
||||||
if (r < 0)
|
}
|
||||||
goto fail;
|
|
||||||
if (r == 0)
|
static grub_err_t
|
||||||
break;
|
grub_verify_signature_real (struct grub_pubkey_context *ctxt,
|
||||||
hash->write (context, readbuf, r);
|
struct grub_public_key *pkey)
|
||||||
rem -= r;
|
{
|
||||||
}
|
gcry_mpi_t mpis[10];
|
||||||
hash->write (context, &v, sizeof (v));
|
grub_uint8_t pk = ctxt->v4.pkeyalgo;
|
||||||
s = 0xff;
|
grub_size_t i;
|
||||||
hash->write (context, &s, sizeof (s));
|
grub_uint8_t *readbuf = NULL;
|
||||||
hash->write (context, &headlen, sizeof (headlen));
|
unsigned char *hval;
|
||||||
r = grub_file_read (sig, &unhashed_sub, sizeof (unhashed_sub));
|
grub_ssize_t rem = grub_be_to_cpu16 (ctxt->v4.hashed_sub);
|
||||||
if (r != sizeof (unhashed_sub))
|
grub_uint32_t headlen = grub_cpu_to_be32 (rem + 6);
|
||||||
goto fail;
|
grub_uint8_t s;
|
||||||
|
grub_uint16_t unhashed_sub;
|
||||||
|
grub_ssize_t r;
|
||||||
|
grub_uint8_t hash_start[2];
|
||||||
|
gcry_mpi_t hmpi;
|
||||||
|
grub_uint64_t keyid = 0;
|
||||||
|
struct grub_public_subkey *sk;
|
||||||
|
|
||||||
|
readbuf = grub_malloc (READBUF_SIZE);
|
||||||
|
if (!readbuf)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
ctxt->hash->write (ctxt->hash_context, &ctxt->v, sizeof (ctxt->v));
|
||||||
|
ctxt->hash->write (ctxt->hash_context, &ctxt->v4, sizeof (ctxt->v4));
|
||||||
|
while (rem)
|
||||||
{
|
{
|
||||||
grub_uint8_t *ptr;
|
r = grub_file_read (ctxt->sig, readbuf,
|
||||||
grub_uint32_t l;
|
rem < READBUF_SIZE ? rem : READBUF_SIZE);
|
||||||
rem = grub_be_to_cpu16 (unhashed_sub);
|
if (r < 0)
|
||||||
if (rem > READBUF_SIZE)
|
|
||||||
goto fail;
|
goto fail;
|
||||||
r = grub_file_read (sig, readbuf, rem);
|
if (r == 0)
|
||||||
if (r != rem)
|
break;
|
||||||
|
ctxt->hash->write (ctxt->hash_context, readbuf, r);
|
||||||
|
rem -= r;
|
||||||
|
}
|
||||||
|
ctxt->hash->write (ctxt->hash_context, &ctxt->v, sizeof (ctxt->v));
|
||||||
|
s = 0xff;
|
||||||
|
ctxt->hash->write (ctxt->hash_context, &s, sizeof (s));
|
||||||
|
ctxt->hash->write (ctxt->hash_context, &headlen, sizeof (headlen));
|
||||||
|
r = grub_file_read (ctxt->sig, &unhashed_sub, sizeof (unhashed_sub));
|
||||||
|
if (r != sizeof (unhashed_sub))
|
||||||
|
goto fail;
|
||||||
|
{
|
||||||
|
grub_uint8_t *ptr;
|
||||||
|
grub_uint32_t l;
|
||||||
|
rem = grub_be_to_cpu16 (unhashed_sub);
|
||||||
|
if (rem > READBUF_SIZE)
|
||||||
|
goto fail;
|
||||||
|
r = grub_file_read (ctxt->sig, readbuf, rem);
|
||||||
|
if (r != rem)
|
||||||
|
goto fail;
|
||||||
|
for (ptr = readbuf; ptr < readbuf + rem; ptr += l)
|
||||||
|
{
|
||||||
|
if (*ptr < 192)
|
||||||
|
l = *ptr++;
|
||||||
|
else if (*ptr < 255)
|
||||||
|
{
|
||||||
|
if (ptr + 1 >= readbuf + rem)
|
||||||
|
break;
|
||||||
|
l = (((ptr[0] & ~192) << GRUB_CHAR_BIT) | ptr[1]) + 192;
|
||||||
|
ptr += 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (ptr + 5 >= readbuf + rem)
|
||||||
|
break;
|
||||||
|
l = grub_be_to_cpu32 (grub_get_unaligned32 (ptr + 1));
|
||||||
|
ptr += 5;
|
||||||
|
}
|
||||||
|
if (*ptr == 0x10 && l >= 8)
|
||||||
|
keyid = grub_get_unaligned64 (ptr + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctxt->hash->final (ctxt->hash_context);
|
||||||
|
|
||||||
|
grub_dprintf ("crypt", "alive\n");
|
||||||
|
|
||||||
|
hval = ctxt->hash->read (ctxt->hash_context);
|
||||||
|
|
||||||
|
if (grub_file_read (ctxt->sig, hash_start, sizeof (hash_start)) != sizeof (hash_start))
|
||||||
|
goto fail;
|
||||||
|
if (grub_memcmp (hval, hash_start, sizeof (hash_start)) != 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
grub_dprintf ("crypt", "@ %x\n", (int)grub_file_tell (ctxt->sig));
|
||||||
|
|
||||||
|
for (i = 0; i < pkalgos[pk].nmpisig; i++)
|
||||||
|
{
|
||||||
|
grub_uint16_t l;
|
||||||
|
grub_size_t lb;
|
||||||
|
grub_dprintf ("crypt", "alive\n");
|
||||||
|
if (grub_file_read (ctxt->sig, &l, sizeof (l)) != sizeof (l))
|
||||||
goto fail;
|
goto fail;
|
||||||
for (ptr = readbuf; ptr < readbuf + rem; ptr += l)
|
grub_dprintf ("crypt", "alive\n");
|
||||||
{
|
lb = (grub_be_to_cpu16 (l) + 7) / 8;
|
||||||
if (*ptr < 192)
|
grub_dprintf ("crypt", "l = 0x%04x\n", grub_be_to_cpu16 (l));
|
||||||
l = *ptr++;
|
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||||
else if (*ptr < 255)
|
goto fail;
|
||||||
{
|
grub_dprintf ("crypt", "alive\n");
|
||||||
if (ptr + 1 >= readbuf + rem)
|
if (grub_file_read (ctxt->sig, readbuf + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||||
break;
|
goto fail;
|
||||||
l = (((ptr[0] & ~192) << GRUB_CHAR_BIT) | ptr[1]) + 192;
|
grub_dprintf ("crypt", "alive\n");
|
||||||
ptr += 2;
|
grub_memcpy (readbuf, &l, sizeof (l));
|
||||||
}
|
grub_dprintf ("crypt", "alive\n");
|
||||||
else
|
|
||||||
{
|
if (gcry_mpi_scan (&mpis[i], GCRYMPI_FMT_PGP,
|
||||||
if (ptr + 5 >= readbuf + rem)
|
readbuf, lb + sizeof (grub_uint16_t), 0))
|
||||||
break;
|
goto fail;
|
||||||
l = grub_be_to_cpu32 (grub_get_unaligned32 (ptr + 1));
|
grub_dprintf ("crypt", "alive\n");
|
||||||
ptr += 5;
|
|
||||||
}
|
|
||||||
if (*ptr == 0x10 && l >= 8)
|
|
||||||
keyid = grub_get_unaligned64 (ptr + 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hash->final (context);
|
if (pkey)
|
||||||
|
sk = grub_crypto_pk_locate_subkey (keyid, pkey);
|
||||||
grub_dprintf ("crypt", "alive\n");
|
else
|
||||||
|
sk = grub_crypto_pk_locate_subkey_in_trustdb (keyid);
|
||||||
hval = hash->read (context);
|
if (!sk)
|
||||||
|
{
|
||||||
if (grub_file_read (sig, hash_start, sizeof (hash_start)) != sizeof (hash_start))
|
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||||
|
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"),
|
||||||
|
keyid);
|
||||||
goto fail;
|
goto fail;
|
||||||
if (grub_memcmp (hval, hash_start, sizeof (hash_start)) != 0)
|
}
|
||||||
|
|
||||||
|
if (pkalgos[pk].pad (&hmpi, hval, ctxt->hash, sk))
|
||||||
|
goto fail;
|
||||||
|
if (!*pkalgos[pk].algo)
|
||||||
|
{
|
||||||
|
grub_dl_load (pkalgos[pk].module);
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*pkalgos[pk].algo)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"),
|
||||||
|
pkalgos[pk].module);
|
||||||
goto fail;
|
goto fail;
|
||||||
|
}
|
||||||
|
if ((*pkalgos[pk].algo)->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
grub_dprintf ("crypt", "@ %x\n", (int)grub_file_tell (sig));
|
grub_free (readbuf);
|
||||||
|
|
||||||
for (i = 0; i < pkalgos[pk].nmpisig; i++)
|
return GRUB_ERR_NONE;
|
||||||
{
|
|
||||||
grub_uint16_t l;
|
|
||||||
grub_size_t lb;
|
|
||||||
grub_dprintf ("crypt", "alive\n");
|
|
||||||
if (grub_file_read (sig, &l, sizeof (l)) != sizeof (l))
|
|
||||||
goto fail;
|
|
||||||
grub_dprintf ("crypt", "alive\n");
|
|
||||||
lb = (grub_be_to_cpu16 (l) + 7) / 8;
|
|
||||||
grub_dprintf ("crypt", "l = 0x%04x\n", grub_be_to_cpu16 (l));
|
|
||||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
|
||||||
goto fail;
|
|
||||||
grub_dprintf ("crypt", "alive\n");
|
|
||||||
if (grub_file_read (sig, readbuf + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
|
||||||
goto fail;
|
|
||||||
grub_dprintf ("crypt", "alive\n");
|
|
||||||
grub_memcpy (readbuf, &l, sizeof (l));
|
|
||||||
grub_dprintf ("crypt", "alive\n");
|
|
||||||
|
|
||||||
if (gcry_mpi_scan (&mpis[i], GCRYMPI_FMT_PGP,
|
fail:
|
||||||
readbuf, lb + sizeof (grub_uint16_t), 0))
|
grub_free (readbuf);
|
||||||
goto fail;
|
if (!grub_errno)
|
||||||
grub_dprintf ("crypt", "alive\n");
|
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||||
}
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
if (pkey)
|
static void
|
||||||
sk = grub_crypto_pk_locate_subkey (keyid, pkey);
|
grub_pubkey_close_real (struct grub_pubkey_context *ctxt)
|
||||||
else
|
{
|
||||||
sk = grub_crypto_pk_locate_subkey_in_trustdb (keyid);
|
if (ctxt->sig)
|
||||||
if (!sk)
|
grub_file_close (ctxt->sig);
|
||||||
{
|
if (ctxt->hash_context)
|
||||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
grub_free (ctxt->hash_context);
|
||||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"),
|
}
|
||||||
keyid);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pkalgos[pk].pad (&hmpi, hval, hash, sk))
|
static void
|
||||||
goto fail;
|
grub_pubkey_close (void *ctxt)
|
||||||
if (!*pkalgos[pk].algo)
|
{
|
||||||
{
|
grub_pubkey_close_real (ctxt);
|
||||||
grub_dl_load (pkalgos[pk].module);
|
grub_free (ctxt);
|
||||||
grub_errno = GRUB_ERR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!*pkalgos[pk].algo)
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"),
|
|
||||||
pkalgos[pk].module);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
if ((*pkalgos[pk].algo)->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
grub_free (context);
|
|
||||||
grub_free (readbuf);
|
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
grub_free (context);
|
|
||||||
grub_free (readbuf);
|
|
||||||
if (!grub_errno)
|
|
||||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
|
||||||
return grub_errno;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_verify_signature (grub_file_t f, grub_file_t sig,
|
grub_verify_signature (grub_file_t f, const char *fsig,
|
||||||
struct grub_public_key *pkey)
|
struct grub_public_key *pkey)
|
||||||
{
|
{
|
||||||
return grub_verify_signature_real (0, 0, f, sig, pkey);
|
grub_file_t sig;
|
||||||
|
grub_err_t err;
|
||||||
|
struct grub_pubkey_context ctxt;
|
||||||
|
grub_uint8_t *readbuf = NULL;
|
||||||
|
|
||||||
|
sig = grub_file_open (fsig,
|
||||||
|
GRUB_FILE_TYPE_SIGNATURE
|
||||||
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
|
if (!sig)
|
||||||
|
return grub_errno;
|
||||||
|
|
||||||
|
err = grub_verify_signature_init (&ctxt, sig);
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
grub_file_close (sig);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
readbuf = grub_zalloc (READBUF_SIZE);
|
||||||
|
if (!readbuf)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
grub_ssize_t r;
|
||||||
|
r = grub_file_read (f, readbuf, READBUF_SIZE);
|
||||||
|
if (r < 0)
|
||||||
|
goto fail;
|
||||||
|
if (r == 0)
|
||||||
|
break;
|
||||||
|
err = grub_pubkey_write (&ctxt, readbuf, r);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_verify_signature_real (&ctxt, pkey);
|
||||||
|
fail:
|
||||||
|
grub_pubkey_close_real (&ctxt);
|
||||||
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
|
@ -680,10 +737,12 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||||
|
|
||||||
grub_file_filter_disable_compression ();
|
pkf = grub_file_open (args[0],
|
||||||
if (ctxt->state[OPTION_SKIP_SIG].set)
|
GRUB_FILE_TYPE_PUBLIC_KEY_TRUST
|
||||||
grub_file_filter_disable_pubkey ();
|
| GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
pkf = grub_file_open (args[0]);
|
| (ctxt->state[OPTION_SKIP_SIG].set
|
||||||
|
? GRUB_FILE_TYPE_SKIP_SIGNATURE
|
||||||
|
: GRUB_FILE_TYPE_NONE));
|
||||||
if (!pkf)
|
if (!pkf)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
pk = grub_load_public_key (pkf);
|
pk = grub_load_public_key (pkf);
|
||||||
|
@ -757,7 +816,7 @@ static grub_err_t
|
||||||
grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||||
int argc, char **args)
|
int argc, char **args)
|
||||||
{
|
{
|
||||||
grub_file_t f = NULL, sig = NULL;
|
grub_file_t f = NULL;
|
||||||
grub_err_t err = GRUB_ERR_NONE;
|
grub_err_t err = GRUB_ERR_NONE;
|
||||||
struct grub_public_key *pk = NULL;
|
struct grub_public_key *pk = NULL;
|
||||||
|
|
||||||
|
@ -771,10 +830,12 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||||
if (argc > 2)
|
if (argc > 2)
|
||||||
{
|
{
|
||||||
grub_file_t pkf;
|
grub_file_t pkf;
|
||||||
grub_file_filter_disable_compression ();
|
pkf = grub_file_open (args[2],
|
||||||
if (ctxt->state[OPTION_SKIP_SIG].set)
|
GRUB_FILE_TYPE_PUBLIC_KEY
|
||||||
grub_file_filter_disable_pubkey ();
|
| GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||||
pkf = grub_file_open (args[2]);
|
| (ctxt->state[OPTION_SKIP_SIG].set
|
||||||
|
? GRUB_FILE_TYPE_SKIP_SIGNATURE
|
||||||
|
: GRUB_FILE_TYPE_NONE));
|
||||||
if (!pkf)
|
if (!pkf)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
pk = grub_load_public_key (pkf);
|
pk = grub_load_public_key (pkf);
|
||||||
|
@ -786,26 +847,15 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||||
grub_file_close (pkf);
|
grub_file_close (pkf);
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_file_filter_disable_all ();
|
f = grub_file_open (args[0], GRUB_FILE_TYPE_VERIFY_SIGNATURE);
|
||||||
f = grub_file_open (args[0]);
|
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
err = grub_errno;
|
err = grub_errno;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_file_filter_disable_all ();
|
err = grub_verify_signature (f, args[1], pk);
|
||||||
sig = grub_file_open (args[1]);
|
|
||||||
if (!sig)
|
|
||||||
{
|
|
||||||
err = grub_errno;
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = grub_verify_signature (f, sig, pk);
|
|
||||||
fail:
|
fail:
|
||||||
if (sig)
|
|
||||||
grub_file_close (sig);
|
|
||||||
if (f)
|
if (f)
|
||||||
grub_file_close (f);
|
grub_file_close (f);
|
||||||
if (pk)
|
if (pk)
|
||||||
|
@ -815,135 +865,53 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||||
|
|
||||||
static int sec = 0;
|
static int sec = 0;
|
||||||
|
|
||||||
static void
|
|
||||||
verified_free (grub_verified_t verified)
|
|
||||||
{
|
|
||||||
if (verified)
|
|
||||||
{
|
|
||||||
grub_free (verified->buf);
|
|
||||||
grub_free (verified);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static grub_ssize_t
|
|
||||||
verified_read (struct grub_file *file, char *buf, grub_size_t len)
|
|
||||||
{
|
|
||||||
grub_verified_t verified = file->data;
|
|
||||||
|
|
||||||
grub_memcpy (buf, (char *) verified->buf + file->offset, len);
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
verified_close (struct grub_file *file)
|
grub_pubkey_init (grub_file_t io, enum grub_file_type type __attribute__ ((unused)),
|
||||||
{
|
void **context, enum grub_verify_flags *flags)
|
||||||
grub_verified_t verified = file->data;
|
|
||||||
|
|
||||||
grub_file_close (verified->file);
|
|
||||||
verified_free (verified);
|
|
||||||
file->data = 0;
|
|
||||||
|
|
||||||
/* device and name are freed by parent */
|
|
||||||
file->device = 0;
|
|
||||||
file->name = 0;
|
|
||||||
|
|
||||||
return grub_errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct grub_fs verified_fs =
|
|
||||||
{
|
|
||||||
.name = "verified_read",
|
|
||||||
.read = verified_read,
|
|
||||||
.close = verified_close
|
|
||||||
};
|
|
||||||
|
|
||||||
static grub_file_t
|
|
||||||
grub_pubkey_open (grub_file_t io, const char *filename)
|
|
||||||
{
|
{
|
||||||
grub_file_t sig;
|
grub_file_t sig;
|
||||||
char *fsuf, *ptr;
|
char *fsuf, *ptr;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
|
struct grub_pubkey_context *ctxt;
|
||||||
grub_file_t ret;
|
|
||||||
grub_verified_t verified;
|
|
||||||
|
|
||||||
if (!sec)
|
if (!sec)
|
||||||
return io;
|
{
|
||||||
if (io->device->disk &&
|
*flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION;
|
||||||
(io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
|
return GRUB_ERR_NONE;
|
||||||
|| io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID))
|
}
|
||||||
return io;
|
|
||||||
fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig"));
|
fsuf = grub_malloc (grub_strlen (io->name) + sizeof (".sig"));
|
||||||
if (!fsuf)
|
if (!fsuf)
|
||||||
return NULL;
|
return grub_errno;
|
||||||
ptr = grub_stpcpy (fsuf, filename);
|
ptr = grub_stpcpy (fsuf, io->name);
|
||||||
grub_memcpy (ptr, ".sig", sizeof (".sig"));
|
grub_memcpy (ptr, ".sig", sizeof (".sig"));
|
||||||
|
|
||||||
grub_memcpy (curfilt, grub_file_filters_enabled,
|
sig = grub_file_open (fsuf, GRUB_FILE_TYPE_SIGNATURE);
|
||||||
sizeof (curfilt));
|
|
||||||
grub_file_filter_disable_all ();
|
|
||||||
sig = grub_file_open (fsuf);
|
|
||||||
grub_memcpy (grub_file_filters_enabled, curfilt,
|
|
||||||
sizeof (curfilt));
|
|
||||||
grub_free (fsuf);
|
grub_free (fsuf);
|
||||||
if (!sig)
|
if (!sig)
|
||||||
return NULL;
|
return grub_errno;
|
||||||
|
|
||||||
ret = grub_malloc (sizeof (*ret));
|
ctxt = grub_malloc (sizeof (*ctxt));
|
||||||
if (!ret)
|
if (!ctxt)
|
||||||
{
|
{
|
||||||
grub_file_close (sig);
|
grub_file_close (sig);
|
||||||
return NULL;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
*ret = *io;
|
err = grub_verify_signature_init (ctxt, sig);
|
||||||
|
|
||||||
ret->fs = &verified_fs;
|
|
||||||
ret->not_easily_seekable = 0;
|
|
||||||
if (ret->size >> (sizeof (grub_size_t) * GRUB_CHAR_BIT - 1))
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
|
||||||
"big file signature isn't implemented yet");
|
|
||||||
grub_file_close (sig);
|
|
||||||
grub_free (ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
verified = grub_malloc (sizeof (*verified));
|
|
||||||
if (!verified)
|
|
||||||
{
|
|
||||||
grub_file_close (sig);
|
|
||||||
grub_free (ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
verified->buf = grub_malloc (ret->size);
|
|
||||||
if (!verified->buf)
|
|
||||||
{
|
|
||||||
grub_file_close (sig);
|
|
||||||
grub_free (verified);
|
|
||||||
grub_free (ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (grub_file_read (io, verified->buf, ret->size) != (grub_ssize_t) ret->size)
|
|
||||||
{
|
|
||||||
if (!grub_errno)
|
|
||||||
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
|
|
||||||
filename);
|
|
||||||
grub_file_close (sig);
|
|
||||||
verified_free (verified);
|
|
||||||
grub_free (ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = grub_verify_signature_real (verified->buf, ret->size, 0, sig, NULL);
|
|
||||||
grub_file_close (sig);
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
verified_free (verified);
|
grub_free (ctxt);
|
||||||
grub_free (ret);
|
grub_file_close (sig);
|
||||||
return NULL;
|
return err;
|
||||||
}
|
}
|
||||||
verified->file = io;
|
*context = ctxt;
|
||||||
ret->data = verified;
|
return GRUB_ERR_NONE;
|
||||||
return ret;
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_pubkey_fini (void *ctxt)
|
||||||
|
{
|
||||||
|
return grub_verify_signature_real (ctxt, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
@ -966,14 +934,22 @@ pseudo_read (struct grub_file *file, char *buf, grub_size_t len)
|
||||||
struct grub_fs pseudo_fs =
|
struct grub_fs pseudo_fs =
|
||||||
{
|
{
|
||||||
.name = "pseudo",
|
.name = "pseudo",
|
||||||
.read = pseudo_read
|
.fs_read = pseudo_read
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct grub_file_verifier grub_pubkey_verifier =
|
||||||
|
{
|
||||||
|
.name = "pgp",
|
||||||
|
.init = grub_pubkey_init,
|
||||||
|
.fini = grub_pubkey_fini,
|
||||||
|
.write = grub_pubkey_write,
|
||||||
|
.close = grub_pubkey_close,
|
||||||
|
};
|
||||||
|
|
||||||
static grub_extcmd_t cmd, cmd_trust;
|
static grub_extcmd_t cmd, cmd_trust;
|
||||||
static grub_command_t cmd_distrust, cmd_list;
|
static grub_command_t cmd_distrust, cmd_list;
|
||||||
|
|
||||||
GRUB_MOD_INIT(verify)
|
GRUB_MOD_INIT(pgp)
|
||||||
{
|
{
|
||||||
const char *val;
|
const char *val;
|
||||||
struct grub_module_header *header;
|
struct grub_module_header *header;
|
||||||
|
@ -983,8 +959,6 @@ GRUB_MOD_INIT(verify)
|
||||||
sec = 1;
|
sec = 1;
|
||||||
else
|
else
|
||||||
sec = 0;
|
sec = 0;
|
||||||
|
|
||||||
grub_file_filter_register (GRUB_FILE_FILTER_PUBKEY, grub_pubkey_open);
|
|
||||||
|
|
||||||
grub_register_variable_hook ("check_signatures", 0, grub_env_write_sec);
|
grub_register_variable_hook ("check_signatures", 0, grub_env_write_sec);
|
||||||
grub_env_export ("check_signatures");
|
grub_env_export ("check_signatures");
|
||||||
|
@ -1030,11 +1004,13 @@ GRUB_MOD_INIT(verify)
|
||||||
cmd_distrust = grub_register_command ("distrust", grub_cmd_distrust,
|
cmd_distrust = grub_register_command ("distrust", grub_cmd_distrust,
|
||||||
N_("PUBKEY_ID"),
|
N_("PUBKEY_ID"),
|
||||||
N_("Remove PUBKEY_ID from trusted keys."));
|
N_("Remove PUBKEY_ID from trusted keys."));
|
||||||
|
|
||||||
|
grub_verifier_register (&grub_pubkey_verifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
GRUB_MOD_FINI(verify)
|
GRUB_MOD_FINI(pgp)
|
||||||
{
|
{
|
||||||
grub_file_filter_unregister (GRUB_FILE_FILTER_PUBKEY);
|
grub_verifier_unregister (&grub_pubkey_verifier);
|
||||||
grub_unregister_extcmd (cmd);
|
grub_unregister_extcmd (cmd);
|
||||||
grub_unregister_extcmd (cmd_trust);
|
grub_unregister_extcmd (cmd_trust);
|
||||||
grub_unregister_command (cmd_list);
|
grub_unregister_command (cmd_list);
|
|
@ -24,6 +24,7 @@
|
||||||
#include <grub/device.h>
|
#include <grub/device.h>
|
||||||
#include <grub/disk.h>
|
#include <grub/disk.h>
|
||||||
#include <grub/partition.h>
|
#include <grub/partition.h>
|
||||||
|
#include <grub/gpt_partition.h>
|
||||||
#include <grub/net.h>
|
#include <grub/net.h>
|
||||||
#include <grub/fs.h>
|
#include <grub/fs.h>
|
||||||
#include <grub/file.h>
|
#include <grub/file.h>
|
||||||
|
@ -31,6 +32,7 @@
|
||||||
#include <grub/env.h>
|
#include <grub/env.h>
|
||||||
#include <grub/extcmd.h>
|
#include <grub/extcmd.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/i386/pc/boot.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
@ -45,6 +47,7 @@ static const struct grub_arg_option options[] =
|
||||||
{"fs", 'f', 0, N_("Determine filesystem type."), 0, 0},
|
{"fs", 'f', 0, N_("Determine filesystem type."), 0, 0},
|
||||||
{"fs-uuid", 'u', 0, N_("Determine filesystem UUID."), 0, 0},
|
{"fs-uuid", 'u', 0, N_("Determine filesystem UUID."), 0, 0},
|
||||||
{"label", 'l', 0, N_("Determine filesystem label."), 0, 0},
|
{"label", 'l', 0, N_("Determine filesystem label."), 0, 0},
|
||||||
|
{"part-uuid", 0, 0, N_("Determine partition UUID."), 0, 0},
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,6 +101,52 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
grub_device_close (dev);
|
grub_device_close (dev);
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
if (state[6].set)
|
||||||
|
{
|
||||||
|
/* AAAABBBB-CCCC-DDDD-EEEE-FFFFFFFFFFFF + null terminator */
|
||||||
|
char val[37] = "none";
|
||||||
|
if (dev->disk && dev->disk->partition)
|
||||||
|
{
|
||||||
|
struct grub_partition *p = dev->disk->partition;
|
||||||
|
grub_disk_t disk = grub_disk_open(dev->disk->name);
|
||||||
|
|
||||||
|
if (!disk)
|
||||||
|
return grub_errno;
|
||||||
|
if (grub_strcmp(dev->disk->partition->partmap->name, "gpt") == 0)
|
||||||
|
{
|
||||||
|
struct grub_gpt_partentry entry;
|
||||||
|
grub_gpt_part_guid_t *guid;
|
||||||
|
|
||||||
|
if (grub_disk_read(disk, p->offset, p->index, sizeof(entry), &entry))
|
||||||
|
return grub_errno;
|
||||||
|
guid = &entry.guid;
|
||||||
|
grub_snprintf (val, sizeof(val),
|
||||||
|
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||||
|
grub_le_to_cpu32 (guid->data1),
|
||||||
|
grub_le_to_cpu16 (guid->data2),
|
||||||
|
grub_le_to_cpu16 (guid->data3),
|
||||||
|
guid->data4[0], guid->data4[1], guid->data4[2],
|
||||||
|
guid->data4[3], guid->data4[4], guid->data4[5],
|
||||||
|
guid->data4[6], guid->data4[7]);
|
||||||
|
}
|
||||||
|
else if (grub_strcmp(dev->disk->partition->partmap->name, "msdos") == 0)
|
||||||
|
{
|
||||||
|
grub_uint32_t nt_disk_sig;
|
||||||
|
|
||||||
|
if (grub_disk_read(disk, 0, GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC,
|
||||||
|
sizeof(nt_disk_sig), &nt_disk_sig) == 0)
|
||||||
|
grub_snprintf (val, sizeof(val), "%08x-%02x",
|
||||||
|
grub_le_to_cpu32(nt_disk_sig), 1 + p->number);
|
||||||
|
}
|
||||||
|
grub_disk_close(disk);
|
||||||
|
}
|
||||||
|
if (state[0].set)
|
||||||
|
grub_env_set (state[0].arg, val);
|
||||||
|
else
|
||||||
|
grub_printf ("%s", val);
|
||||||
|
grub_device_close (dev);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
fs = grub_fs_probe (dev);
|
fs = grub_fs_probe (dev);
|
||||||
if (! fs)
|
if (! fs)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
@ -113,10 +162,10 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (state[4].set)
|
if (state[4].set)
|
||||||
{
|
{
|
||||||
char *uuid;
|
char *uuid;
|
||||||
if (! fs->uuid)
|
if (! fs->fs_uuid)
|
||||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
N_("%s does not support UUIDs"), fs->name);
|
N_("%s does not support UUIDs"), fs->name);
|
||||||
err = fs->uuid (dev, &uuid);
|
err = fs->fs_uuid (dev, &uuid);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
if (! uuid)
|
if (! uuid)
|
||||||
|
@ -134,11 +183,11 @@ grub_cmd_probe (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (state[5].set)
|
if (state[5].set)
|
||||||
{
|
{
|
||||||
char *label;
|
char *label;
|
||||||
if (! fs->label)
|
if (! fs->fs_label)
|
||||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
N_("filesystem `%s' does not support labels"),
|
N_("filesystem `%s' does not support labels"),
|
||||||
fs->name);
|
fs->name);
|
||||||
err = fs->label (dev, &label);
|
err = fs->fs_label (dev, &label);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
if (! label)
|
if (! label)
|
||||||
|
|
|
@ -64,7 +64,7 @@ set_matches (char **varnames, char *str, grub_size_t nmatches,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *p;
|
char *p;
|
||||||
char *q;
|
const char * q;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
unsigned long j;
|
unsigned long j;
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ grub_cmd_regexp (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
matches = grub_zalloc (sizeof (*matches) * (regex.re_nsub + 1));
|
matches = grub_calloc (regex.re_nsub + 1, sizeof (*matches));
|
||||||
if (! matches)
|
if (! matches)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
|
@ -81,8 +81,8 @@ iterate_device (const char *name, void *data)
|
||||||
if (! buf)
|
if (! buf)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
grub_file_filter_disable_compression ();
|
file = grub_file_open (buf, GRUB_FILE_TYPE_FS_SEARCH
|
||||||
file = grub_file_open (buf);
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
found = 1;
|
found = 1;
|
||||||
|
@ -103,9 +103,9 @@ iterate_device (const char *name, void *data)
|
||||||
fs = grub_fs_probe (dev);
|
fs = grub_fs_probe (dev);
|
||||||
|
|
||||||
#ifdef DO_SEARCH_FS_UUID
|
#ifdef DO_SEARCH_FS_UUID
|
||||||
#define read_fn uuid
|
#define read_fn fs_uuid
|
||||||
#else
|
#else
|
||||||
#define read_fn label
|
#define read_fn fs_label
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (fs && fs->read_fn)
|
if (fs && fs->read_fn)
|
||||||
|
|
|
@ -122,7 +122,7 @@ grub_cmd_search (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
for (i = 0; state[SEARCH_HINT_BAREMETAL].args[i]; i++)
|
for (i = 0; state[SEARCH_HINT_BAREMETAL].args[i]; i++)
|
||||||
nhints++;
|
nhints++;
|
||||||
|
|
||||||
hints = grub_malloc (sizeof (hints[0]) * nhints);
|
hints = grub_calloc (nhints, sizeof (hints[0]));
|
||||||
if (!hints)
|
if (!hints)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
j = 0;
|
j = 0;
|
||||||
|
|
|
@ -169,7 +169,7 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (ctxt->state[0].set)
|
if (ctxt->state[0].set)
|
||||||
{
|
{
|
||||||
ptr = ctxt->state[0].arg;
|
ptr = ctxt->state[0].arg;
|
||||||
pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff);
|
pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff);
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
@ -182,8 +182,7 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (*ptr != ':')
|
if (*ptr != ':')
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
||||||
ptr++;
|
ptr++;
|
||||||
pciid_check_value |= (grub_strtoul (ptr, (char **) &ptr, 16) & 0xffff)
|
pciid_check_value |= (grub_strtoul (ptr, &ptr, 16) & 0xffff) << 16;
|
||||||
<< 16;
|
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
else
|
else
|
||||||
|
@ -197,10 +196,10 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (ctxt->state[1].set)
|
if (ctxt->state[1].set)
|
||||||
{
|
{
|
||||||
const char *optr;
|
const char *optr;
|
||||||
|
|
||||||
ptr = ctxt->state[1].arg;
|
ptr = ctxt->state[1].arg;
|
||||||
optr = ptr;
|
optr = ptr;
|
||||||
bus = grub_strtoul (ptr, (char **) &ptr, 16);
|
bus = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
@ -214,7 +213,7 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("missing `%c' symbol"), ':');
|
||||||
ptr++;
|
ptr++;
|
||||||
optr = ptr;
|
optr = ptr;
|
||||||
device = grub_strtoul (ptr, (char **) &ptr, 16);
|
device = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
if (grub_errno == GRUB_ERR_BAD_NUMBER)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
@ -225,7 +224,7 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (*ptr == '.')
|
if (*ptr == '.')
|
||||||
{
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
function = grub_strtoul (ptr, (char **) &ptr, 16);
|
function = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
check_function = 1;
|
check_function = 1;
|
||||||
|
@ -253,7 +252,7 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (i == ARRAY_SIZE (pci_registers))
|
if (i == ARRAY_SIZE (pci_registers))
|
||||||
{
|
{
|
||||||
regsize = 0;
|
regsize = 0;
|
||||||
regaddr = grub_strtoul (ptr, (char **) &ptr, 16);
|
regaddr = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown register");
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown register");
|
||||||
}
|
}
|
||||||
|
@ -270,7 +269,7 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (*ptr == '+')
|
if (*ptr == '+')
|
||||||
{
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
regaddr += grub_strtoul (ptr, (char **) &ptr, 16);
|
regaddr += grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
}
|
}
|
||||||
|
@ -302,14 +301,14 @@ grub_cmd_setpci (grub_extcmd_context_t ctxt, int argc, char **argv)
|
||||||
if (*ptr == '=')
|
if (*ptr == '=')
|
||||||
{
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
regwrite = grub_strtoul (ptr, (char **) &ptr, 16);
|
regwrite = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
write_mask = 0xffffffff;
|
write_mask = 0xffffffff;
|
||||||
if (*ptr == ':')
|
if (*ptr == ':')
|
||||||
{
|
{
|
||||||
ptr++;
|
ptr++;
|
||||||
write_mask = grub_strtoul (ptr, (char **) &ptr, 16);
|
write_mask = grub_strtoul (ptr, &ptr, 16);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
write_mask = 0xffffffff;
|
write_mask = 0xffffffff;
|
||||||
|
|
|
@ -55,7 +55,7 @@ grub_interruptible_millisleep (grub_uint32_t ms)
|
||||||
start = grub_get_time_ms ();
|
start = grub_get_time_ms ();
|
||||||
|
|
||||||
while (grub_get_time_ms () - start < ms)
|
while (grub_get_time_ms () - start < ms)
|
||||||
if (grub_getkey_noblock () == GRUB_TERM_ESC)
|
if (grub_key_is_interrupt (grub_getkey_noblock ()))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -0,0 +1,398 @@
|
||||||
|
/* smbios.c - retrieve smbios information. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/env.h>
|
||||||
|
#include <grub/extcmd.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/smbios.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
/* Abstract useful values found in either the SMBIOS3 or SMBIOS EPS. */
|
||||||
|
static struct {
|
||||||
|
grub_addr_t start;
|
||||||
|
grub_addr_t end;
|
||||||
|
grub_uint16_t structures;
|
||||||
|
} table_desc;
|
||||||
|
|
||||||
|
static grub_extcmd_t cmd;
|
||||||
|
|
||||||
|
/* Locate the SMBIOS entry point structure depending on the hardware. */
|
||||||
|
struct grub_smbios_eps *
|
||||||
|
grub_smbios_get_eps (void)
|
||||||
|
{
|
||||||
|
static struct grub_smbios_eps *eps = NULL;
|
||||||
|
|
||||||
|
if (eps != NULL)
|
||||||
|
return eps;
|
||||||
|
|
||||||
|
eps = grub_machine_smbios_get_eps ();
|
||||||
|
|
||||||
|
return eps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Locate the SMBIOS3 entry point structure depending on the hardware. */
|
||||||
|
static struct grub_smbios_eps3 *
|
||||||
|
grub_smbios_get_eps3 (void)
|
||||||
|
{
|
||||||
|
static struct grub_smbios_eps3 *eps = NULL;
|
||||||
|
|
||||||
|
if (eps != NULL)
|
||||||
|
return eps;
|
||||||
|
|
||||||
|
eps = grub_machine_smbios_get_eps3 ();
|
||||||
|
|
||||||
|
return eps;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
linux_string (const char *value)
|
||||||
|
{
|
||||||
|
char *out = grub_malloc( grub_strlen (value) + 1);
|
||||||
|
const char *src = value;
|
||||||
|
char *dst = out;
|
||||||
|
|
||||||
|
for (; *src; src++)
|
||||||
|
if (*src > ' ' && *src < 127 && *src != ':')
|
||||||
|
*dst++ = *src;
|
||||||
|
|
||||||
|
*dst = 0;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These functions convert values from the various SMBIOS structure field types
|
||||||
|
* into a string formatted to be returned to the user. They expect that the
|
||||||
|
* structure and offset were already validated. When the requested data is
|
||||||
|
* successfully retrieved and formatted, the pointer to the string is returned;
|
||||||
|
* otherwise, NULL is returned on failure. Don't free the result.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
grub_smbios_format_byte (const grub_uint8_t *structure, grub_uint8_t offset)
|
||||||
|
{
|
||||||
|
static char buffer[sizeof ("255")];
|
||||||
|
|
||||||
|
grub_snprintf (buffer, sizeof (buffer), "%u", structure[offset]);
|
||||||
|
|
||||||
|
return (const char *)buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
grub_smbios_format_word (const grub_uint8_t *structure, grub_uint8_t offset)
|
||||||
|
{
|
||||||
|
static char buffer[sizeof ("65535")];
|
||||||
|
|
||||||
|
grub_uint16_t value = grub_get_unaligned16 (structure + offset);
|
||||||
|
grub_snprintf (buffer, sizeof (buffer), "%u", value);
|
||||||
|
|
||||||
|
return (const char *)buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
grub_smbios_format_dword (const grub_uint8_t *structure, grub_uint8_t offset)
|
||||||
|
{
|
||||||
|
static char buffer[sizeof ("4294967295")];
|
||||||
|
|
||||||
|
grub_uint32_t value = grub_get_unaligned32 (structure + offset);
|
||||||
|
grub_snprintf (buffer, sizeof (buffer), "%" PRIuGRUB_UINT32_T, value);
|
||||||
|
|
||||||
|
return (const char *)buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
grub_smbios_format_qword (const grub_uint8_t *structure, grub_uint8_t offset)
|
||||||
|
{
|
||||||
|
static char buffer[sizeof ("18446744073709551615")];
|
||||||
|
|
||||||
|
grub_uint64_t value = grub_get_unaligned64 (structure + offset);
|
||||||
|
grub_snprintf (buffer, sizeof (buffer), "%" PRIuGRUB_UINT64_T, value);
|
||||||
|
|
||||||
|
return (const char *)buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
grub_smbios_get_string (const grub_uint8_t *structure, grub_uint8_t offset)
|
||||||
|
{
|
||||||
|
const grub_uint8_t *ptr = structure + structure[1];
|
||||||
|
const grub_uint8_t *table_end = (const grub_uint8_t *)table_desc.end;
|
||||||
|
const grub_uint8_t referenced_string_number = structure[offset];
|
||||||
|
grub_uint8_t i;
|
||||||
|
|
||||||
|
/* A string referenced with zero is interpreted as unset. */
|
||||||
|
if (referenced_string_number == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Search the string set. */
|
||||||
|
for (i = 1; *ptr != 0 && ptr < table_end; i++)
|
||||||
|
if (i == referenced_string_number)
|
||||||
|
{
|
||||||
|
const char *str = (const char *)ptr;
|
||||||
|
while (*ptr++ != 0)
|
||||||
|
if (ptr >= table_end)
|
||||||
|
return NULL; /* The string isn't terminated. */
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
while (*ptr++ != 0 && ptr < table_end);
|
||||||
|
|
||||||
|
/* The string number is greater than the number of strings in the set. */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
grub_smbios_format_uuid (const grub_uint8_t *structure, grub_uint8_t offset)
|
||||||
|
{
|
||||||
|
static char buffer[sizeof ("ffffffff-ffff-ffff-ffff-ffffffffffff")];
|
||||||
|
const grub_uint8_t *f = structure + offset; /* little-endian fields */
|
||||||
|
const grub_uint8_t *g = f + 8; /* byte-by-byte fields */
|
||||||
|
|
||||||
|
grub_snprintf (buffer, sizeof (buffer),
|
||||||
|
"%02x%02x%02x%02x-%02x%02x-%02x%02x-"
|
||||||
|
"%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||||
|
f[3], f[2], f[1], f[0], f[5], f[4], f[7], f[6],
|
||||||
|
g[0], g[1], g[2], g[3], g[4], g[5], g[6], g[7]);
|
||||||
|
|
||||||
|
return (const char *)buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* List the field formatting functions and the number of bytes they need. */
|
||||||
|
static const struct {
|
||||||
|
const char *(*format) (const grub_uint8_t *structure, grub_uint8_t offset);
|
||||||
|
grub_uint8_t field_length;
|
||||||
|
} field_extractors[] = {
|
||||||
|
{grub_smbios_format_byte, 1},
|
||||||
|
{grub_smbios_format_word, 2},
|
||||||
|
{grub_smbios_format_dword, 4},
|
||||||
|
{grub_smbios_format_qword, 8},
|
||||||
|
{grub_smbios_get_string, 1},
|
||||||
|
{grub_smbios_format_uuid, 16}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* List command options, with structure field getters ordered as above. */
|
||||||
|
#define FIRST_GETTER_OPT (3)
|
||||||
|
#define SETTER_OPT (FIRST_GETTER_OPT + ARRAY_SIZE(field_extractors))
|
||||||
|
#define LINUX_OPT (FIRST_GETTER_OPT + ARRAY_SIZE(field_extractors) + 1)
|
||||||
|
|
||||||
|
static const struct grub_arg_option options[] = {
|
||||||
|
{"type", 't', 0, N_("Match structures with the given type."),
|
||||||
|
N_("type"), ARG_TYPE_INT},
|
||||||
|
{"handle", 'h', 0, N_("Match structures with the given handle."),
|
||||||
|
N_("handle"), ARG_TYPE_INT},
|
||||||
|
{"match", 'm', 0, N_("Select a structure when several match."),
|
||||||
|
N_("match"), ARG_TYPE_INT},
|
||||||
|
{"get-byte", 'b', 0, N_("Get the byte's value at the given offset."),
|
||||||
|
N_("offset"), ARG_TYPE_INT},
|
||||||
|
{"get-word", 'w', 0, N_("Get two bytes' value at the given offset."),
|
||||||
|
N_("offset"), ARG_TYPE_INT},
|
||||||
|
{"get-dword", 'd', 0, N_("Get four bytes' value at the given offset."),
|
||||||
|
N_("offset"), ARG_TYPE_INT},
|
||||||
|
{"get-qword", 'q', 0, N_("Get eight bytes' value at the given offset."),
|
||||||
|
N_("offset"), ARG_TYPE_INT},
|
||||||
|
{"get-string", 's', 0, N_("Get the string specified at the given offset."),
|
||||||
|
N_("offset"), ARG_TYPE_INT},
|
||||||
|
{"get-uuid", 'u', 0, N_("Get the UUID's value at the given offset."),
|
||||||
|
N_("offset"), ARG_TYPE_INT},
|
||||||
|
{"set", '\0', 0, N_("Store the value in the given variable name."),
|
||||||
|
N_("variable"), ARG_TYPE_STRING},
|
||||||
|
{"linux", '\0', 0, N_("Filter the result like linux does."),
|
||||||
|
N_("variable"), ARG_TYPE_NONE},
|
||||||
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return a matching SMBIOS structure.
|
||||||
|
*
|
||||||
|
* This method can use up to three criteria for selecting a structure:
|
||||||
|
* - The "type" field (use -1 to ignore)
|
||||||
|
* - The "handle" field (use -1 to ignore)
|
||||||
|
* - Which to return if several match (use 0 to ignore)
|
||||||
|
*
|
||||||
|
* The return value is a pointer to the first matching structure. If no
|
||||||
|
* structures match the given parameters, NULL is returned.
|
||||||
|
*/
|
||||||
|
static const grub_uint8_t *
|
||||||
|
grub_smbios_match_structure (const grub_int16_t type,
|
||||||
|
const grub_int32_t handle,
|
||||||
|
const grub_uint16_t match)
|
||||||
|
{
|
||||||
|
const grub_uint8_t *ptr = (const grub_uint8_t *)table_desc.start;
|
||||||
|
const grub_uint8_t *table_end = (const grub_uint8_t *)table_desc.end;
|
||||||
|
grub_uint16_t structures = table_desc.structures;
|
||||||
|
grub_uint16_t structure_count = 0;
|
||||||
|
grub_uint16_t matches = 0;
|
||||||
|
|
||||||
|
while (ptr < table_end
|
||||||
|
&& ptr[1] >= 4 /* Valid structures include the 4-byte header. */
|
||||||
|
&& (structure_count++ < structures || structures == 0))
|
||||||
|
{
|
||||||
|
grub_uint16_t structure_handle = grub_get_unaligned16 (ptr + 2);
|
||||||
|
grub_uint8_t structure_type = ptr[0];
|
||||||
|
|
||||||
|
if ((handle < 0 || handle == structure_handle)
|
||||||
|
&& (type < 0 || type == structure_type)
|
||||||
|
&& (match == 0 || match == ++matches))
|
||||||
|
return ptr;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ptr += ptr[1];
|
||||||
|
while ((*ptr++ != 0 || *ptr++ != 0) && ptr < table_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (structure_type == GRUB_SMBIOS_TYPE_END_OF_TABLE)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_smbios (grub_extcmd_context_t ctxt,
|
||||||
|
int argc __attribute__ ((unused)),
|
||||||
|
char **argv __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
struct grub_arg_list *state = ctxt->state;
|
||||||
|
|
||||||
|
grub_int16_t type = -1;
|
||||||
|
grub_int32_t handle = -1;
|
||||||
|
grub_uint16_t match = 0;
|
||||||
|
grub_uint8_t offset = 0;
|
||||||
|
|
||||||
|
const grub_uint8_t *structure;
|
||||||
|
const char *value;
|
||||||
|
char *modified_value = NULL;
|
||||||
|
grub_int32_t option;
|
||||||
|
grub_int8_t field_type = -1;
|
||||||
|
grub_uint8_t i;
|
||||||
|
|
||||||
|
if (table_desc.start == 0)
|
||||||
|
return grub_error (GRUB_ERR_IO,
|
||||||
|
N_("the SMBIOS entry point structure was not found"));
|
||||||
|
|
||||||
|
/* Read the given filtering options. */
|
||||||
|
if (state[0].set)
|
||||||
|
{
|
||||||
|
option = grub_strtol (state[0].arg, NULL, 0);
|
||||||
|
if (option < 0 || option > 255)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("the type must be between 0 and 255"));
|
||||||
|
type = (grub_int16_t)option;
|
||||||
|
}
|
||||||
|
if (state[1].set)
|
||||||
|
{
|
||||||
|
option = grub_strtol (state[1].arg, NULL, 0);
|
||||||
|
if (option < 0 || option > 65535)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("the handle must be between 0 and 65535"));
|
||||||
|
handle = (grub_int32_t)option;
|
||||||
|
}
|
||||||
|
if (state[2].set)
|
||||||
|
{
|
||||||
|
option = grub_strtol (state[2].arg, NULL, 0);
|
||||||
|
if (option <= 0 || option > 65535)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("the match must be a positive integer"));
|
||||||
|
match = (grub_uint16_t)option;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine the data type of the structure field to retrieve. */
|
||||||
|
for (i = 0; i < ARRAY_SIZE(field_extractors); i++)
|
||||||
|
if (state[FIRST_GETTER_OPT + i].set)
|
||||||
|
{
|
||||||
|
if (field_type >= 0)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("only one --get option is usable at a time"));
|
||||||
|
field_type = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Require a choice of a structure field to return. */
|
||||||
|
if (field_type < 0)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
N_("one of the --get options is required"));
|
||||||
|
|
||||||
|
/* Locate a matching SMBIOS structure. */
|
||||||
|
structure = grub_smbios_match_structure (type, handle, match);
|
||||||
|
if (structure == NULL)
|
||||||
|
return grub_error (GRUB_ERR_IO,
|
||||||
|
N_("no structure matched the given options"));
|
||||||
|
|
||||||
|
/* Ensure the requested byte offset is inside the structure. */
|
||||||
|
option = grub_strtol (state[FIRST_GETTER_OPT + field_type].arg, NULL, 0);
|
||||||
|
if (option < 0 || option >= structure[1])
|
||||||
|
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||||
|
N_("the given offset is outside the structure"));
|
||||||
|
|
||||||
|
/* Ensure the requested data type at the offset is inside the structure. */
|
||||||
|
offset = (grub_uint8_t)option;
|
||||||
|
if (offset + field_extractors[field_type].field_length > structure[1])
|
||||||
|
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||||
|
N_("the field ends outside the structure"));
|
||||||
|
|
||||||
|
/* Format the requested structure field into a readable string. */
|
||||||
|
value = field_extractors[field_type].format (structure, offset);
|
||||||
|
if (value == NULL)
|
||||||
|
return grub_error (GRUB_ERR_IO,
|
||||||
|
N_("failed to retrieve the structure field"));
|
||||||
|
|
||||||
|
if (state[LINUX_OPT].set)
|
||||||
|
value = modified_value = linux_string (value);
|
||||||
|
|
||||||
|
/* Store or print the formatted value. */
|
||||||
|
if (state[SETTER_OPT].set)
|
||||||
|
grub_env_set (state[SETTER_OPT].arg, value);
|
||||||
|
else
|
||||||
|
grub_printf ("%s\n", value);
|
||||||
|
|
||||||
|
grub_free(modified_value);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(smbios)
|
||||||
|
{
|
||||||
|
struct grub_smbios_eps3 *eps3;
|
||||||
|
struct grub_smbios_eps *eps;
|
||||||
|
|
||||||
|
if ((eps3 = grub_smbios_get_eps3 ()))
|
||||||
|
{
|
||||||
|
table_desc.start = (grub_addr_t)eps3->table_address;
|
||||||
|
table_desc.end = table_desc.start + eps3->maximum_table_length;
|
||||||
|
table_desc.structures = 0; /* SMBIOS3 drops the structure count. */
|
||||||
|
}
|
||||||
|
else if ((eps = grub_smbios_get_eps ()))
|
||||||
|
{
|
||||||
|
table_desc.start = (grub_addr_t)eps->intermediate.table_address;
|
||||||
|
table_desc.end = table_desc.start + eps->intermediate.table_length;
|
||||||
|
table_desc.structures = eps->intermediate.structures;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = grub_register_extcmd ("smbios", grub_cmd_smbios, 0,
|
||||||
|
N_("[-t type] [-h handle] [-m match] "
|
||||||
|
"(-b|-w|-d|-q|-s|-u) offset "
|
||||||
|
"[--set variable]"),
|
||||||
|
N_("Retrieve SMBIOS information."), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(smbios)
|
||||||
|
{
|
||||||
|
grub_unregister_extcmd (cmd);
|
||||||
|
}
|
|
@ -31,7 +31,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
/* A simple implementation for signed numbers. */
|
/* A simple implementation for signed numbers. */
|
||||||
static int
|
static int
|
||||||
grub_strtosl (char *arg, char **end, int base)
|
grub_strtosl (char *arg, const char ** const end, int base)
|
||||||
{
|
{
|
||||||
if (arg[0] == '-')
|
if (arg[0] == '-')
|
||||||
return -grub_strtoul (arg + 1, end, base);
|
return -grub_strtoul (arg + 1, end, base);
|
||||||
|
@ -133,15 +133,15 @@ get_fileinfo (char *path, struct test_parse_ctx *ctx)
|
||||||
|
|
||||||
/* Fetch writing time. */
|
/* Fetch writing time. */
|
||||||
ctx->file_info.mtimeset = 0;
|
ctx->file_info.mtimeset = 0;
|
||||||
if (fs->mtime)
|
if (fs->fs_mtime)
|
||||||
{
|
{
|
||||||
if (! fs->mtime (dev, &ctx->file_info.mtime))
|
if (! fs->fs_mtime (dev, &ctx->file_info.mtime))
|
||||||
ctx->file_info.mtimeset = 1;
|
ctx->file_info.mtimeset = 1;
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
(fs->dir) (dev, path, find_file, ctx);
|
(fs->fs_dir) (dev, path, find_file, ctx);
|
||||||
|
|
||||||
grub_device_close (dev);
|
grub_device_close (dev);
|
||||||
grub_free (path);
|
grub_free (path);
|
||||||
|
@ -355,8 +355,8 @@ test_parse (char **args, int *argn, int argc)
|
||||||
if (grub_strcmp (args[*argn], "-s") == 0)
|
if (grub_strcmp (args[*argn], "-s") == 0)
|
||||||
{
|
{
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
grub_file_filter_disable_compression ();
|
file = grub_file_open (args[*argn + 1], GRUB_FILE_TYPE_GET_SIZE
|
||||||
file = grub_file_open (args[*argn + 1]);
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
update_val (file && (grub_file_size (file) != 0), &ctx);
|
update_val (file && (grub_file_size (file) != 0), &ctx);
|
||||||
if (file)
|
if (file)
|
||||||
grub_file_close (file);
|
grub_file_close (file);
|
||||||
|
|
|
@ -57,7 +57,7 @@ grub_cmd_testload (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
file = grub_file_open (argv[0]);
|
file = grub_file_open (argv[0], GRUB_FILE_TYPE_TESTLOAD);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
file = grub_file_open (args[0]);
|
file = grub_file_open (args[0], GRUB_FILE_TYPE_TESTLOAD);
|
||||||
if (file == NULL)
|
if (file == NULL)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2018 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Core TPM support code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/tpm.h>
|
||||||
|
#include <grub/term.h>
|
||||||
|
#include <grub/verify.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_tpm_verify_init (grub_file_t io,
|
||||||
|
enum grub_file_type type __attribute__ ((unused)),
|
||||||
|
void **context, enum grub_verify_flags *flags)
|
||||||
|
{
|
||||||
|
*context = io->name;
|
||||||
|
*flags |= GRUB_VERIFY_FLAGS_SINGLE_CHUNK;
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_tpm_verify_write (void *context, void *buf, grub_size_t size)
|
||||||
|
{
|
||||||
|
return grub_tpm_measure (buf, size, GRUB_BINARY_PCR, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_tpm_verify_string (char *str, enum grub_verify_string_type type)
|
||||||
|
{
|
||||||
|
const char *prefix = NULL;
|
||||||
|
char *description;
|
||||||
|
grub_err_t status;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case GRUB_VERIFY_KERNEL_CMDLINE:
|
||||||
|
prefix = "kernel_cmdline: ";
|
||||||
|
break;
|
||||||
|
case GRUB_VERIFY_MODULE_CMDLINE:
|
||||||
|
prefix = "module_cmdline: ";
|
||||||
|
break;
|
||||||
|
case GRUB_VERIFY_COMMAND:
|
||||||
|
prefix = "grub_cmd: ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
description = grub_malloc (grub_strlen (str) + grub_strlen (prefix) + 1);
|
||||||
|
if (!description)
|
||||||
|
return grub_errno;
|
||||||
|
grub_memcpy (description, prefix, grub_strlen (prefix));
|
||||||
|
grub_memcpy (description + grub_strlen (prefix), str,
|
||||||
|
grub_strlen (str) + 1);
|
||||||
|
status =
|
||||||
|
grub_tpm_measure ((unsigned char *) str, grub_strlen (str),
|
||||||
|
GRUB_STRING_PCR, description);
|
||||||
|
grub_free (description);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_file_verifier grub_tpm_verifier = {
|
||||||
|
.name = "tpm",
|
||||||
|
.init = grub_tpm_verify_init,
|
||||||
|
.write = grub_tpm_verify_write,
|
||||||
|
.verify_string = grub_tpm_verify_string,
|
||||||
|
};
|
||||||
|
|
||||||
|
GRUB_MOD_INIT (tpm)
|
||||||
|
{
|
||||||
|
grub_verifier_register (&grub_tpm_verifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI (tpm)
|
||||||
|
{
|
||||||
|
grub_verifier_unregister (&grub_tpm_verifier);
|
||||||
|
}
|
|
@ -63,6 +63,11 @@ static const char *usb_devspeed[] =
|
||||||
"High"
|
"High"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __GNUC__ >= 9
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Waddress-of-packed-member"
|
||||||
|
#endif
|
||||||
|
|
||||||
static grub_usb_err_t
|
static grub_usb_err_t
|
||||||
grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
|
grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
|
||||||
char **string)
|
char **string)
|
||||||
|
@ -108,6 +113,10 @@ grub_usb_get_string (grub_usb_device_t dev, grub_uint8_t index, int langid,
|
||||||
return GRUB_USB_ERR_NONE;
|
return GRUB_USB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if __GNUC__ >= 9
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
usb_print_str (const char *description, grub_usb_device_t dev, int idx)
|
usb_print_str (const char *description, grub_usb_device_t dev, int idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,232 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2017 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Verifiers helper.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/file.h>
|
||||||
|
#include <grub/verify.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
struct grub_file_verifier *grub_file_verifiers;
|
||||||
|
|
||||||
|
struct grub_verified
|
||||||
|
{
|
||||||
|
grub_file_t file;
|
||||||
|
void *buf;
|
||||||
|
};
|
||||||
|
typedef struct grub_verified *grub_verified_t;
|
||||||
|
|
||||||
|
static void
|
||||||
|
verified_free (grub_verified_t verified)
|
||||||
|
{
|
||||||
|
if (verified)
|
||||||
|
{
|
||||||
|
grub_free (verified->buf);
|
||||||
|
grub_free (verified);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_ssize_t
|
||||||
|
verified_read (struct grub_file *file, char *buf, grub_size_t len)
|
||||||
|
{
|
||||||
|
grub_verified_t verified = file->data;
|
||||||
|
|
||||||
|
grub_memcpy (buf, (char *) verified->buf + file->offset, len);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
verified_close (struct grub_file *file)
|
||||||
|
{
|
||||||
|
grub_verified_t verified = file->data;
|
||||||
|
|
||||||
|
grub_file_close (verified->file);
|
||||||
|
verified_free (verified);
|
||||||
|
file->data = 0;
|
||||||
|
|
||||||
|
/* Device and name are freed by parent. */
|
||||||
|
file->device = 0;
|
||||||
|
file->name = 0;
|
||||||
|
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct grub_fs verified_fs =
|
||||||
|
{
|
||||||
|
.name = "verified_read",
|
||||||
|
.fs_read = verified_read,
|
||||||
|
.fs_close = verified_close
|
||||||
|
};
|
||||||
|
|
||||||
|
static grub_file_t
|
||||||
|
grub_verifiers_open (grub_file_t io, enum grub_file_type type)
|
||||||
|
{
|
||||||
|
grub_verified_t verified = NULL;
|
||||||
|
struct grub_file_verifier *ver;
|
||||||
|
void *context;
|
||||||
|
grub_file_t ret = 0;
|
||||||
|
grub_err_t err;
|
||||||
|
int defer = 0;
|
||||||
|
|
||||||
|
grub_dprintf ("verify", "file: %s type: %d\n", io->name, type);
|
||||||
|
|
||||||
|
if ((type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_SIGNATURE
|
||||||
|
|| (type & GRUB_FILE_TYPE_MASK) == GRUB_FILE_TYPE_VERIFY_SIGNATURE
|
||||||
|
|| (type & GRUB_FILE_TYPE_SKIP_SIGNATURE))
|
||||||
|
return io;
|
||||||
|
|
||||||
|
if (io->device->disk &&
|
||||||
|
(io->device->disk->dev->id == GRUB_DISK_DEVICE_MEMDISK_ID
|
||||||
|
|| io->device->disk->dev->id == GRUB_DISK_DEVICE_PROCFS_ID))
|
||||||
|
return io;
|
||||||
|
|
||||||
|
FOR_LIST_ELEMENTS(ver, grub_file_verifiers)
|
||||||
|
{
|
||||||
|
enum grub_verify_flags flags = 0;
|
||||||
|
err = ver->init (io, type, &context, &flags);
|
||||||
|
if (err)
|
||||||
|
goto fail_noclose;
|
||||||
|
if (flags & GRUB_VERIFY_FLAGS_DEFER_AUTH)
|
||||||
|
{
|
||||||
|
defer = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!(flags & GRUB_VERIFY_FLAGS_SKIP_VERIFICATION))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ver)
|
||||||
|
{
|
||||||
|
if (defer)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_ACCESS_DENIED,
|
||||||
|
N_("verification requested but nobody cares: %s"), io->name);
|
||||||
|
goto fail_noclose;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No verifiers wanted to verify. Just return underlying file. */
|
||||||
|
return io;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = grub_malloc (sizeof (*ret));
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
*ret = *io;
|
||||||
|
|
||||||
|
ret->fs = &verified_fs;
|
||||||
|
ret->not_easily_seekable = 0;
|
||||||
|
if (ret->size >> (sizeof (grub_size_t) * GRUB_CHAR_BIT - 1))
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||||
|
N_("big file signature isn't implemented yet"));
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
verified = grub_malloc (sizeof (*verified));
|
||||||
|
if (!verified)
|
||||||
|
{
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
verified->buf = grub_malloc (ret->size);
|
||||||
|
if (!verified->buf)
|
||||||
|
{
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
if (grub_file_read (io, verified->buf, ret->size) != (grub_ssize_t) ret->size)
|
||||||
|
{
|
||||||
|
if (!grub_errno)
|
||||||
|
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("premature end of file %s"),
|
||||||
|
io->name);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ver->write (context, verified->buf, ret->size);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
err = ver->fini ? ver->fini (context) : GRUB_ERR_NONE;
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (ver->close)
|
||||||
|
ver->close (context);
|
||||||
|
|
||||||
|
FOR_LIST_ELEMENTS_NEXT(ver, grub_file_verifiers)
|
||||||
|
{
|
||||||
|
enum grub_verify_flags flags = 0;
|
||||||
|
err = ver->init (io, type, &context, &flags);
|
||||||
|
if (err)
|
||||||
|
goto fail_noclose;
|
||||||
|
if (flags & GRUB_VERIFY_FLAGS_SKIP_VERIFICATION ||
|
||||||
|
/* Verification done earlier. So, we are happy here. */
|
||||||
|
flags & GRUB_VERIFY_FLAGS_DEFER_AUTH)
|
||||||
|
continue;
|
||||||
|
err = ver->write (context, verified->buf, ret->size);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
err = ver->fini ? ver->fini (context) : GRUB_ERR_NONE;
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (ver->close)
|
||||||
|
ver->close (context);
|
||||||
|
}
|
||||||
|
|
||||||
|
verified->file = io;
|
||||||
|
ret->data = verified;
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (ver->close)
|
||||||
|
ver->close (context);
|
||||||
|
fail_noclose:
|
||||||
|
verified_free (verified);
|
||||||
|
grub_free (ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_verify_string (char *str, enum grub_verify_string_type type)
|
||||||
|
{
|
||||||
|
struct grub_file_verifier *ver;
|
||||||
|
|
||||||
|
grub_dprintf ("verify", "string: %s, type: %d\n", str, type);
|
||||||
|
|
||||||
|
FOR_LIST_ELEMENTS(ver, grub_file_verifiers)
|
||||||
|
{
|
||||||
|
grub_err_t err;
|
||||||
|
err = ver->verify_string ? ver->verify_string (str, type) : GRUB_ERR_NONE;
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(verifiers)
|
||||||
|
{
|
||||||
|
grub_file_filter_register (GRUB_FILE_FILTER_VERIFY, grub_verifiers_open);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(verifiers)
|
||||||
|
{
|
||||||
|
grub_file_filter_unregister (GRUB_FILE_FILTER_VERIFY);
|
||||||
|
}
|
|
@ -136,7 +136,7 @@ grub_cmd_videoinfo (grub_command_t cmd __attribute__ ((unused)),
|
||||||
ctx.height = ctx.width = ctx.depth = 0;
|
ctx.height = ctx.width = ctx.depth = 0;
|
||||||
if (argc)
|
if (argc)
|
||||||
{
|
{
|
||||||
char *ptr;
|
const char *ptr;
|
||||||
ptr = args[0];
|
ptr = args[0];
|
||||||
ctx.width = grub_strtoul (ptr, &ptr, 0);
|
ctx.width = grub_strtoul (ptr, &ptr, 0);
|
||||||
if (grub_errno)
|
if (grub_errno)
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <grub/file.h>
|
#include <grub/file.h>
|
||||||
#include <grub/device.h>
|
#include <grub/device.h>
|
||||||
#include <grub/script_sh.h>
|
#include <grub/script_sh.h>
|
||||||
|
#include <grub/safemath.h>
|
||||||
|
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|
||||||
|
@ -48,6 +49,7 @@ merge (char **dest, char **ps)
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
char **p;
|
char **p;
|
||||||
|
grub_size_t sz;
|
||||||
|
|
||||||
if (! dest)
|
if (! dest)
|
||||||
return ps;
|
return ps;
|
||||||
|
@ -60,7 +62,12 @@ merge (char **dest, char **ps)
|
||||||
for (j = 0; ps[j]; j++)
|
for (j = 0; ps[j]; j++)
|
||||||
;
|
;
|
||||||
|
|
||||||
p = grub_realloc (dest, sizeof (char*) * (i + j + 1));
|
if (grub_add (i, j, &sz) ||
|
||||||
|
grub_add (sz, 1, &sz) ||
|
||||||
|
grub_mul (sz, sizeof (char *), &sz))
|
||||||
|
return dest;
|
||||||
|
|
||||||
|
p = grub_realloc (dest, sz);
|
||||||
if (! p)
|
if (! p)
|
||||||
{
|
{
|
||||||
grub_free (dest);
|
grub_free (dest);
|
||||||
|
@ -115,8 +122,15 @@ make_regex (const char *start, const char *end, regex_t *regexp)
|
||||||
char ch;
|
char ch;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
unsigned len = end - start;
|
unsigned len = end - start;
|
||||||
char *buffer = grub_malloc (len * 2 + 2 + 1); /* worst case size. */
|
char *buffer;
|
||||||
|
grub_size_t sz;
|
||||||
|
|
||||||
|
/* Worst case size is (len * 2 + 2 + 1). */
|
||||||
|
if (grub_mul (len, 2, &sz) ||
|
||||||
|
grub_add (sz, 3, &sz))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
buffer = grub_malloc (sz);
|
||||||
if (! buffer)
|
if (! buffer)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
@ -226,6 +240,7 @@ match_devices_iter (const char *name, void *data)
|
||||||
struct match_devices_ctx *ctx = data;
|
struct match_devices_ctx *ctx = data;
|
||||||
char **t;
|
char **t;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
grub_size_t sz;
|
||||||
|
|
||||||
/* skip partitions if asked to. */
|
/* skip partitions if asked to. */
|
||||||
if (ctx->noparts && grub_strchr (name, ','))
|
if (ctx->noparts && grub_strchr (name, ','))
|
||||||
|
@ -239,11 +254,16 @@ match_devices_iter (const char *name, void *data)
|
||||||
if (regexec (ctx->regexp, buffer, 0, 0, 0))
|
if (regexec (ctx->regexp, buffer, 0, 0, 0))
|
||||||
{
|
{
|
||||||
grub_dprintf ("expand", "not matched\n");
|
grub_dprintf ("expand", "not matched\n");
|
||||||
|
fail:
|
||||||
grub_free (buffer);
|
grub_free (buffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
t = grub_realloc (ctx->devs, sizeof (char*) * (ctx->ndev + 2));
|
if (grub_add (ctx->ndev, 2, &sz) ||
|
||||||
|
grub_mul (sz, sizeof (char *), &sz))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
t = grub_realloc (ctx->devs, sz);
|
||||||
if (! t)
|
if (! t)
|
||||||
{
|
{
|
||||||
grub_free (buffer);
|
grub_free (buffer);
|
||||||
|
@ -300,6 +320,7 @@ match_files_iter (const char *name,
|
||||||
struct match_files_ctx *ctx = data;
|
struct match_files_ctx *ctx = data;
|
||||||
char **t;
|
char **t;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
|
grub_size_t sz;
|
||||||
|
|
||||||
/* skip . and .. names */
|
/* skip . and .. names */
|
||||||
if (grub_strcmp(".", name) == 0 || grub_strcmp("..", name) == 0)
|
if (grub_strcmp(".", name) == 0 || grub_strcmp("..", name) == 0)
|
||||||
|
@ -315,9 +336,14 @@ match_files_iter (const char *name,
|
||||||
if (! buffer)
|
if (! buffer)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
t = grub_realloc (ctx->files, sizeof (char*) * (ctx->nfile + 2));
|
if (grub_add (ctx->nfile, 2, &sz) ||
|
||||||
if (! t)
|
grub_mul (sz, sizeof (char *), &sz))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
t = grub_realloc (ctx->files, sz);
|
||||||
|
if (!t)
|
||||||
{
|
{
|
||||||
|
fail:
|
||||||
grub_free (buffer);
|
grub_free (buffer);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -370,7 +396,7 @@ match_files (const char *prefix, const char *suffix, const char *end,
|
||||||
else
|
else
|
||||||
path = ctx.dir;
|
path = ctx.dir;
|
||||||
|
|
||||||
if (fs->dir (dev, path, match_files_iter, &ctx))
|
if (fs->fs_dir (dev, path, match_files_iter, &ctx))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
grub_free (ctx.dir);
|
grub_free (ctx.dir);
|
||||||
|
@ -452,7 +478,7 @@ check_file (const char *dir, const char *basename)
|
||||||
else
|
else
|
||||||
path = dir;
|
path = dir;
|
||||||
|
|
||||||
fs->dir (dev, path[0] ? path : "/", check_file_iter, &ctx);
|
fs->fs_dir (dev, path[0] ? path : "/", check_file_iter, &ctx);
|
||||||
if (grub_errno == 0 && basename[0] == 0)
|
if (grub_errno == 0 && basename[0] == 0)
|
||||||
ctx.found = 1;
|
ctx.found = 1;
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <grub/crypto.h>
|
#include <grub/crypto.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
#include <grub/mm.h>
|
#include <grub/mm.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv2+");
|
||||||
|
|
||||||
gcry_err_code_t AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src,
|
gcry_err_code_t AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src,
|
||||||
grub_uint8_t * dst, grub_size_t blocksize,
|
grub_uint8_t * dst, grub_size_t blocksize,
|
||||||
grub_size_t blocknumbers);
|
grub_size_t blocknumbers);
|
||||||
|
|
|
@ -82,6 +82,20 @@ enum grub_ahci_hba_port_command
|
||||||
GRUB_AHCI_HBA_PORT_CMD_FR = 0x4000,
|
GRUB_AHCI_HBA_PORT_CMD_FR = 0x4000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum grub_ahci_hba_port_int_status
|
||||||
|
{
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_IFS = (1UL << 27),
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_HBDS = (1UL << 28),
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_HBFS = (1UL << 29),
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_TFES = (1UL << 30),
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GRUB_AHCI_HBA_PORT_IS_FATAL_MASK ( \
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_IFS | \
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_HBDS | \
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_HBFS | \
|
||||||
|
GRUB_AHCI_HBA_PORT_IS_TFES)
|
||||||
|
|
||||||
struct grub_ahci_hba
|
struct grub_ahci_hba
|
||||||
{
|
{
|
||||||
grub_uint32_t cap;
|
grub_uint32_t cap;
|
||||||
|
@ -562,7 +576,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||||
grub_ahci_readwrite_real (dev, &parms2, 1, 1);*/
|
grub_ahci_readwrite_real (dev, &parms2, 1, 1);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
endtime = grub_get_time_ms () + 10000;
|
endtime = grub_get_time_ms () + 32000;
|
||||||
|
|
||||||
while (grub_get_time_ms () < endtime)
|
while (grub_get_time_ms () < endtime)
|
||||||
{
|
{
|
||||||
|
@ -1026,7 +1040,8 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
|
||||||
|
|
||||||
endtime = grub_get_time_ms () + (spinup ? 20000 : 20000);
|
endtime = grub_get_time_ms () + (spinup ? 20000 : 20000);
|
||||||
while ((dev->hba->ports[dev->port].command_issue & 1))
|
while ((dev->hba->ports[dev->port].command_issue & 1))
|
||||||
if (grub_get_time_ms () > endtime)
|
if (grub_get_time_ms () > endtime ||
|
||||||
|
(dev->hba->ports[dev->port].intstatus & GRUB_AHCI_HBA_PORT_IS_FATAL_MASK))
|
||||||
{
|
{
|
||||||
grub_dprintf ("ahci", "AHCI status <%x %x %x %x>\n",
|
grub_dprintf ("ahci", "AHCI status <%x %x %x %x>\n",
|
||||||
dev->hba->ports[dev->port].command_issue,
|
dev->hba->ports[dev->port].command_issue,
|
||||||
|
@ -1034,7 +1049,10 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
|
||||||
dev->hba->ports[dev->port].intstatus,
|
dev->hba->ports[dev->port].intstatus,
|
||||||
dev->hba->ports[dev->port].task_file_data);
|
dev->hba->ports[dev->port].task_file_data);
|
||||||
dev->hba->ports[dev->port].command_issue = 0;
|
dev->hba->ports[dev->port].command_issue = 0;
|
||||||
err = grub_error (GRUB_ERR_IO, "AHCI transfer timed out");
|
if (dev->hba->ports[dev->port].intstatus & GRUB_AHCI_HBA_PORT_IS_FATAL_MASK)
|
||||||
|
err = grub_error (GRUB_ERR_IO, "AHCI transfer error");
|
||||||
|
else
|
||||||
|
err = grub_error (GRUB_ERR_IO, "AHCI transfer timed out");
|
||||||
if (!reset)
|
if (!reset)
|
||||||
grub_ahci_reset_port (dev, 1);
|
grub_ahci_reset_port (dev, 1);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -296,11 +296,11 @@ static struct grub_disk_dev grub_arcdisk_dev =
|
||||||
{
|
{
|
||||||
.name = "arcdisk",
|
.name = "arcdisk",
|
||||||
.id = GRUB_DISK_DEVICE_ARCDISK_ID,
|
.id = GRUB_DISK_DEVICE_ARCDISK_ID,
|
||||||
.iterate = grub_arcdisk_iterate,
|
.disk_iterate = grub_arcdisk_iterate,
|
||||||
.open = grub_arcdisk_open,
|
.disk_open = grub_arcdisk_open,
|
||||||
.close = grub_arcdisk_close,
|
.disk_close = grub_arcdisk_close,
|
||||||
.read = grub_arcdisk_read,
|
.disk_read = grub_arcdisk_read,
|
||||||
.write = grub_arcdisk_write,
|
.disk_write = grub_arcdisk_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -510,11 +510,11 @@ static struct grub_disk_dev grub_atadisk_dev =
|
||||||
{
|
{
|
||||||
.name = "ATA",
|
.name = "ATA",
|
||||||
.id = GRUB_DISK_DEVICE_ATA_ID,
|
.id = GRUB_DISK_DEVICE_ATA_ID,
|
||||||
.iterate = grub_ata_iterate,
|
.disk_iterate = grub_ata_iterate,
|
||||||
.open = grub_ata_open,
|
.disk_open = grub_ata_open,
|
||||||
.close = grub_ata_close,
|
.disk_close = grub_ata_close,
|
||||||
.read = grub_ata_read,
|
.disk_read = grub_ata_read,
|
||||||
.write = grub_ata_write,
|
.disk_write = grub_ata_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2003,2007,2010,2011 Free Software Foundation, Inc.
|
* Copyright (C) 2003,2007,2010,2011,2019 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software: you can redistribute it and/or modify
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -404,6 +404,167 @@ grub_cryptodisk_decrypt (struct grub_cryptodisk *dev,
|
||||||
return grub_cryptodisk_endecrypt (dev, data, len, sector, 0);
|
return grub_cryptodisk_endecrypt (dev, data, len, sector, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_cryptodisk_setcipher (grub_cryptodisk_t crypt, const char *ciphername, const char *ciphermode)
|
||||||
|
{
|
||||||
|
const char *cipheriv = NULL;
|
||||||
|
grub_crypto_cipher_handle_t cipher = NULL, secondary_cipher = NULL;
|
||||||
|
grub_crypto_cipher_handle_t essiv_cipher = NULL;
|
||||||
|
const gcry_md_spec_t *essiv_hash = NULL;
|
||||||
|
const struct gcry_cipher_spec *ciph;
|
||||||
|
grub_cryptodisk_mode_t mode;
|
||||||
|
grub_cryptodisk_mode_iv_t mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN64;
|
||||||
|
int benbi_log = 0;
|
||||||
|
grub_err_t ret = GRUB_ERR_NONE;
|
||||||
|
|
||||||
|
ciph = grub_crypto_lookup_cipher_by_name (ciphername);
|
||||||
|
if (!ciph)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Cipher %s isn't available",
|
||||||
|
ciphername);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure the cipher used for the bulk data. */
|
||||||
|
cipher = grub_crypto_cipher_open (ciph);
|
||||||
|
if (!cipher)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Cipher %s could not be initialized",
|
||||||
|
ciphername);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure the cipher mode. */
|
||||||
|
if (grub_strcmp (ciphermode, "ecb") == 0)
|
||||||
|
{
|
||||||
|
mode = GRUB_CRYPTODISK_MODE_ECB;
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
|
||||||
|
cipheriv = NULL;
|
||||||
|
}
|
||||||
|
else if (grub_strcmp (ciphermode, "plain") == 0)
|
||||||
|
{
|
||||||
|
mode = GRUB_CRYPTODISK_MODE_CBC;
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
|
||||||
|
cipheriv = NULL;
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (ciphermode, "cbc-", sizeof ("cbc-") - 1) == 0)
|
||||||
|
{
|
||||||
|
mode = GRUB_CRYPTODISK_MODE_CBC;
|
||||||
|
cipheriv = ciphermode + sizeof ("cbc-") - 1;
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (ciphermode, "pcbc-", sizeof ("pcbc-") - 1) == 0)
|
||||||
|
{
|
||||||
|
mode = GRUB_CRYPTODISK_MODE_PCBC;
|
||||||
|
cipheriv = ciphermode + sizeof ("pcbc-") - 1;
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (ciphermode, "xts-", sizeof ("xts-") - 1) == 0)
|
||||||
|
{
|
||||||
|
mode = GRUB_CRYPTODISK_MODE_XTS;
|
||||||
|
cipheriv = ciphermode + sizeof ("xts-") - 1;
|
||||||
|
secondary_cipher = grub_crypto_cipher_open (ciph);
|
||||||
|
if (!secondary_cipher)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||||
|
"Secondary cipher %s isn't available", ciphername);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d",
|
||||||
|
cipher->cipher->blocksize);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (secondary_cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d",
|
||||||
|
secondary_cipher->cipher->blocksize);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (ciphermode, "lrw-", sizeof ("lrw-") - 1) == 0)
|
||||||
|
{
|
||||||
|
mode = GRUB_CRYPTODISK_MODE_LRW;
|
||||||
|
cipheriv = ciphermode + sizeof ("lrw-") - 1;
|
||||||
|
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported LRW block size: %d",
|
||||||
|
cipher->cipher->blocksize);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown cipher mode: %s",
|
||||||
|
ciphermode);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cipheriv == NULL)
|
||||||
|
;
|
||||||
|
else if (grub_memcmp (cipheriv, "plain", sizeof ("plain") - 1) == 0)
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
|
||||||
|
else if (grub_memcmp (cipheriv, "plain64", sizeof ("plain64") - 1) == 0)
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN64;
|
||||||
|
else if (grub_memcmp (cipheriv, "benbi", sizeof ("benbi") - 1) == 0)
|
||||||
|
{
|
||||||
|
if (cipher->cipher->blocksize & (cipher->cipher->blocksize - 1)
|
||||||
|
|| cipher->cipher->blocksize == 0)
|
||||||
|
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported benbi blocksize: %d",
|
||||||
|
cipher->cipher->blocksize);
|
||||||
|
/* FIXME should we return an error here? */
|
||||||
|
for (benbi_log = 0;
|
||||||
|
(cipher->cipher->blocksize << benbi_log) < GRUB_DISK_SECTOR_SIZE;
|
||||||
|
benbi_log++);
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_BENBI;
|
||||||
|
}
|
||||||
|
else if (grub_memcmp (cipheriv, "null", sizeof ("null") - 1) == 0)
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_NULL;
|
||||||
|
else if (grub_memcmp (cipheriv, "essiv:", sizeof ("essiv:") - 1) == 0)
|
||||||
|
{
|
||||||
|
const char *hash_str = cipheriv + 6;
|
||||||
|
|
||||||
|
mode_iv = GRUB_CRYPTODISK_MODE_IV_ESSIV;
|
||||||
|
|
||||||
|
/* Configure the hash and cipher used for ESSIV. */
|
||||||
|
essiv_hash = grub_crypto_lookup_md_by_name (hash_str);
|
||||||
|
if (!essiv_hash)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||||
|
"Couldn't load %s hash", hash_str);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
essiv_cipher = grub_crypto_cipher_open (ciph);
|
||||||
|
if (!essiv_cipher)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
||||||
|
"Couldn't load %s cipher", ciphername);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown IV mode: %s",
|
||||||
|
cipheriv);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
crypt->cipher = cipher;
|
||||||
|
crypt->benbi_log = benbi_log;
|
||||||
|
crypt->mode = mode;
|
||||||
|
crypt->mode_iv = mode_iv;
|
||||||
|
crypt->secondary_cipher = secondary_cipher;
|
||||||
|
crypt->essiv_cipher = essiv_cipher;
|
||||||
|
crypt->essiv_hash = essiv_hash;
|
||||||
|
|
||||||
|
err:
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
grub_crypto_cipher_close (cipher);
|
||||||
|
grub_crypto_cipher_close (secondary_cipher);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
gcry_err_code_t
|
gcry_err_code_t
|
||||||
grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t keysize)
|
grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t keysize)
|
||||||
{
|
{
|
||||||
|
@ -596,9 +757,8 @@ grub_cryptodisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
size, sector, dev->offset);
|
size, sector, dev->offset);
|
||||||
|
|
||||||
err = grub_disk_read (dev->source_disk,
|
err = grub_disk_read (dev->source_disk,
|
||||||
(sector << (disk->log_sector_size
|
grub_disk_from_native_sector (disk, sector + dev->offset),
|
||||||
- GRUB_DISK_SECTOR_BITS)) + dev->offset, 0,
|
0, size << disk->log_sector_size, buf);
|
||||||
size << disk->log_sector_size, buf);
|
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err);
|
grub_dprintf ("cryptodisk", "grub_disk_read failed with error %d\n", err);
|
||||||
|
@ -655,12 +815,10 @@ grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since ->write was called so disk.mod is loaded but be paranoid */
|
/* Since ->write was called so disk.mod is loaded but be paranoid */
|
||||||
|
sector = sector + dev->offset;
|
||||||
if (grub_disk_write_weak)
|
if (grub_disk_write_weak)
|
||||||
err = grub_disk_write_weak (dev->source_disk,
|
err = grub_disk_write_weak (dev->source_disk,
|
||||||
(sector << (disk->log_sector_size
|
grub_disk_from_native_sector (disk, sector),
|
||||||
- GRUB_DISK_SECTOR_BITS))
|
|
||||||
+ dev->offset,
|
|
||||||
0, size << disk->log_sector_size, tmp);
|
0, size << disk->log_sector_size, tmp);
|
||||||
else
|
else
|
||||||
err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
|
err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
|
||||||
|
@ -1015,13 +1173,13 @@ grub_cmd_cryptomount (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
static struct grub_disk_dev grub_cryptodisk_dev = {
|
static struct grub_disk_dev grub_cryptodisk_dev = {
|
||||||
.name = "cryptodisk",
|
.name = "cryptodisk",
|
||||||
.id = GRUB_DISK_DEVICE_CRYPTODISK_ID,
|
.id = GRUB_DISK_DEVICE_CRYPTODISK_ID,
|
||||||
.iterate = grub_cryptodisk_iterate,
|
.disk_iterate = grub_cryptodisk_iterate,
|
||||||
.open = grub_cryptodisk_open,
|
.disk_open = grub_cryptodisk_open,
|
||||||
.close = grub_cryptodisk_close,
|
.disk_close = grub_cryptodisk_close,
|
||||||
.read = grub_cryptodisk_read,
|
.disk_read = grub_cryptodisk_read,
|
||||||
.write = grub_cryptodisk_write,
|
.disk_write = grub_cryptodisk_write,
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
.memberlist = grub_cryptodisk_memberlist,
|
.disk_memberlist = grub_cryptodisk_memberlist,
|
||||||
#endif
|
#endif
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
@ -1150,5 +1308,6 @@ GRUB_MOD_FINI (cryptodisk)
|
||||||
{
|
{
|
||||||
grub_disk_dev_unregister (&grub_cryptodisk_dev);
|
grub_disk_dev_unregister (&grub_cryptodisk_dev);
|
||||||
cryptodisk_cleanup ();
|
cryptodisk_cleanup ();
|
||||||
|
grub_unregister_extcmd (cmd);
|
||||||
grub_procfs_unregister (&luks_script);
|
grub_procfs_unregister (&luks_script);
|
||||||
}
|
}
|
||||||
|
|
|
@ -228,9 +228,9 @@ scan_devices (const char *arname)
|
||||||
for (pull = 0; pull < GRUB_DISK_PULL_MAX; pull++)
|
for (pull = 0; pull < GRUB_DISK_PULL_MAX; pull++)
|
||||||
for (p = grub_disk_dev_list; p; p = p->next)
|
for (p = grub_disk_dev_list; p; p = p->next)
|
||||||
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
|
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
|
||||||
&& p->iterate)
|
&& p->disk_iterate)
|
||||||
{
|
{
|
||||||
if ((p->iterate) (scan_disk_hook, NULL, pull))
|
if ((p->disk_iterate) (scan_disk_hook, NULL, pull))
|
||||||
return;
|
return;
|
||||||
if (arname && is_lv_readable (find_lv (arname), 1))
|
if (arname && is_lv_readable (find_lv (arname), 1))
|
||||||
return;
|
return;
|
||||||
|
@ -311,9 +311,9 @@ grub_diskfilter_memberlist (grub_disk_t disk)
|
||||||
for (pull = 0; pv && pull < GRUB_DISK_PULL_MAX; pull++)
|
for (pull = 0; pv && pull < GRUB_DISK_PULL_MAX; pull++)
|
||||||
for (p = grub_disk_dev_list; pv && p; p = p->next)
|
for (p = grub_disk_dev_list; pv && p; p = p->next)
|
||||||
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
|
if (p->id != GRUB_DISK_DEVICE_DISKFILTER_ID
|
||||||
&& p->iterate)
|
&& p->disk_iterate)
|
||||||
{
|
{
|
||||||
(p->iterate) (scan_disk_hook, NULL, pull);
|
(p->disk_iterate) (scan_disk_hook, NULL, pull);
|
||||||
while (pv && pv->disk)
|
while (pv && pv->disk)
|
||||||
pv = pv->next;
|
pv = pv->next;
|
||||||
}
|
}
|
||||||
|
@ -969,7 +969,8 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
|
||||||
for (p = vgp->lvs; p; p = p->next)
|
for (p = vgp->lvs; p; p = p->next)
|
||||||
{
|
{
|
||||||
int cur_num;
|
int cur_num;
|
||||||
char *num, *end;
|
char *num;
|
||||||
|
const char *end;
|
||||||
if (!p->fullname)
|
if (!p->fullname)
|
||||||
continue;
|
continue;
|
||||||
if (grub_strncmp (p->fullname, lv->fullname, len) != 0)
|
if (grub_strncmp (p->fullname, lv->fullname, len) != 0)
|
||||||
|
@ -1134,7 +1135,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
|
||||||
array->lvs->segments->node_count = nmemb;
|
array->lvs->segments->node_count = nmemb;
|
||||||
array->lvs->segments->raid_member_size = disk_size;
|
array->lvs->segments->raid_member_size = disk_size;
|
||||||
array->lvs->segments->nodes
|
array->lvs->segments->nodes
|
||||||
= grub_zalloc (nmemb * sizeof (array->lvs->segments->nodes[0]));
|
= grub_calloc (nmemb, sizeof (array->lvs->segments->nodes[0]));
|
||||||
array->lvs->segments->stripe_size = stripe_size;
|
array->lvs->segments->stripe_size = stripe_size;
|
||||||
for (i = 0; i < nmemb; i++)
|
for (i = 0; i < nmemb; i++)
|
||||||
{
|
{
|
||||||
|
@ -1226,7 +1227,7 @@ insert_array (grub_disk_t disk, const struct grub_diskfilter_pv_id *id,
|
||||||
grub_partition_t p;
|
grub_partition_t p;
|
||||||
for (p = disk->partition; p; p = p->parent)
|
for (p = disk->partition; p; p = p->parent)
|
||||||
s++;
|
s++;
|
||||||
pv->partmaps = xmalloc (s * sizeof (pv->partmaps[0]));
|
pv->partmaps = xcalloc (s, sizeof (pv->partmaps[0]));
|
||||||
s = 0;
|
s = 0;
|
||||||
for (p = disk->partition; p; p = p->parent)
|
for (p = disk->partition; p; p = p->parent)
|
||||||
pv->partmaps[s++] = xstrdup (p->partmap->name);
|
pv->partmaps[s++] = xstrdup (p->partmap->name);
|
||||||
|
@ -1325,14 +1326,14 @@ static struct grub_disk_dev grub_diskfilter_dev =
|
||||||
{
|
{
|
||||||
.name = "diskfilter",
|
.name = "diskfilter",
|
||||||
.id = GRUB_DISK_DEVICE_DISKFILTER_ID,
|
.id = GRUB_DISK_DEVICE_DISKFILTER_ID,
|
||||||
.iterate = grub_diskfilter_iterate,
|
.disk_iterate = grub_diskfilter_iterate,
|
||||||
.open = grub_diskfilter_open,
|
.disk_open = grub_diskfilter_open,
|
||||||
.close = grub_diskfilter_close,
|
.disk_close = grub_diskfilter_close,
|
||||||
.read = grub_diskfilter_read,
|
.disk_read = grub_diskfilter_read,
|
||||||
.write = grub_diskfilter_write,
|
.disk_write = grub_diskfilter_write,
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
.memberlist = grub_diskfilter_memberlist,
|
.disk_memberlist = grub_diskfilter_memberlist,
|
||||||
.raidname = grub_diskfilter_getname,
|
.disk_raidname = grub_diskfilter_getname,
|
||||||
#endif
|
#endif
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
|
@ -129,6 +129,9 @@ find_parent_device (struct grub_efidisk_data *devices,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ldp = grub_efi_find_last_device_path (dp);
|
ldp = grub_efi_find_last_device_path (dp);
|
||||||
|
if (! ldp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||||
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||||
ldp->length = sizeof (*ldp);
|
ldp->length = sizeof (*ldp);
|
||||||
|
@ -159,6 +162,9 @@ is_child (struct grub_efidisk_data *child,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ldp = grub_efi_find_last_device_path (dp);
|
ldp = grub_efi_find_last_device_path (dp);
|
||||||
|
if (! ldp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||||
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||||
ldp->length = sizeof (*ldp);
|
ldp->length = sizeof (*ldp);
|
||||||
|
@ -627,11 +633,11 @@ static struct grub_disk_dev grub_efidisk_dev =
|
||||||
{
|
{
|
||||||
.name = "efidisk",
|
.name = "efidisk",
|
||||||
.id = GRUB_DISK_DEVICE_EFIDISK_ID,
|
.id = GRUB_DISK_DEVICE_EFIDISK_ID,
|
||||||
.iterate = grub_efidisk_iterate,
|
.disk_iterate = grub_efidisk_iterate,
|
||||||
.open = grub_efidisk_open,
|
.disk_open = grub_efidisk_open,
|
||||||
.close = grub_efidisk_close,
|
.disk_close = grub_efidisk_close,
|
||||||
.read = grub_efidisk_read,
|
.disk_read = grub_efidisk_read,
|
||||||
.write = grub_efidisk_write,
|
.disk_write = grub_efidisk_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -830,6 +836,9 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
|
||||||
{
|
{
|
||||||
grub_efi_device_path_t *dup_ldp;
|
grub_efi_device_path_t *dup_ldp;
|
||||||
dup_ldp = grub_efi_find_last_device_path (dup_dp);
|
dup_ldp = grub_efi_find_last_device_path (dup_dp);
|
||||||
|
if (! dup_ldp)
|
||||||
|
break;
|
||||||
|
|
||||||
if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
|
if (!(GRUB_EFI_DEVICE_PATH_TYPE (dup_ldp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
|
||||||
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE
|
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_CDROM_DEVICE_PATH_SUBTYPE
|
||||||
|| GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)))
|
|| GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)))
|
||||||
|
|
|
@ -84,11 +84,11 @@ static struct grub_disk_dev grub_host_dev =
|
||||||
/* The only important line in this file :-) */
|
/* The only important line in this file :-) */
|
||||||
.name = "host",
|
.name = "host",
|
||||||
.id = GRUB_DISK_DEVICE_HOST_ID,
|
.id = GRUB_DISK_DEVICE_HOST_ID,
|
||||||
.iterate = grub_host_iterate,
|
.disk_iterate = grub_host_iterate,
|
||||||
.open = grub_host_open,
|
.disk_open = grub_host_open,
|
||||||
.close = grub_host_close,
|
.disk_close = grub_host_close,
|
||||||
.read = grub_host_read,
|
.disk_read = grub_host_read,
|
||||||
.write = grub_host_write,
|
.disk_write = grub_host_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -637,11 +637,11 @@ static struct grub_disk_dev grub_biosdisk_dev =
|
||||||
{
|
{
|
||||||
.name = "biosdisk",
|
.name = "biosdisk",
|
||||||
.id = GRUB_DISK_DEVICE_BIOSDISK_ID,
|
.id = GRUB_DISK_DEVICE_BIOSDISK_ID,
|
||||||
.iterate = grub_biosdisk_iterate,
|
.disk_iterate = grub_biosdisk_iterate,
|
||||||
.open = grub_biosdisk_open,
|
.disk_open = grub_biosdisk_open,
|
||||||
.close = grub_biosdisk_close,
|
.disk_close = grub_biosdisk_close,
|
||||||
.read = grub_biosdisk_read,
|
.disk_read = grub_biosdisk_read,
|
||||||
.write = grub_biosdisk_write,
|
.disk_write = grub_biosdisk_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -223,11 +223,11 @@ static struct grub_disk_dev grub_nand_dev =
|
||||||
{
|
{
|
||||||
.name = "nand",
|
.name = "nand",
|
||||||
.id = GRUB_DISK_DEVICE_NAND_ID,
|
.id = GRUB_DISK_DEVICE_NAND_ID,
|
||||||
.iterate = grub_nand_iterate,
|
.disk_iterate = grub_nand_iterate,
|
||||||
.open = grub_nand_open,
|
.disk_open = grub_nand_open,
|
||||||
.close = grub_nand_close,
|
.disk_close = grub_nand_close,
|
||||||
.read = grub_nand_read,
|
.disk_read = grub_nand_read,
|
||||||
.write = grub_nand_write,
|
.disk_write = grub_nand_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -297,7 +297,7 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
|
||||||
/* Power machines documentation specify 672 as maximum SAS disks in
|
/* Power machines documentation specify 672 as maximum SAS disks in
|
||||||
one system. Using a slightly larger value to be safe. */
|
one system. Using a slightly larger value to be safe. */
|
||||||
table_size = 768;
|
table_size = 768;
|
||||||
table = grub_malloc (table_size * sizeof (grub_uint64_t));
|
table = grub_calloc (table_size, sizeof (grub_uint64_t));
|
||||||
|
|
||||||
if (!table)
|
if (!table)
|
||||||
{
|
{
|
||||||
|
@ -615,11 +615,11 @@ static struct grub_disk_dev grub_ofdisk_dev =
|
||||||
{
|
{
|
||||||
.name = "ofdisk",
|
.name = "ofdisk",
|
||||||
.id = GRUB_DISK_DEVICE_OFDISK_ID,
|
.id = GRUB_DISK_DEVICE_OFDISK_ID,
|
||||||
.iterate = grub_ofdisk_iterate,
|
.disk_iterate = grub_ofdisk_iterate,
|
||||||
.open = grub_ofdisk_open,
|
.disk_open = grub_ofdisk_open,
|
||||||
.close = grub_ofdisk_close,
|
.disk_close = grub_ofdisk_close,
|
||||||
.read = grub_ofdisk_read,
|
.disk_read = grub_ofdisk_read,
|
||||||
.write = grub_ofdisk_write,
|
.disk_write = grub_ofdisk_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <grub/msdos_partition.h>
|
#include <grub/msdos_partition.h>
|
||||||
#include <grub/gpt_partition.h>
|
#include <grub/gpt_partition.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
#include <grub/safemath.h>
|
||||||
|
|
||||||
#ifdef GRUB_UTIL
|
#ifdef GRUB_UTIL
|
||||||
#include <grub/emu/misc.h>
|
#include <grub/emu/misc.h>
|
||||||
|
@ -135,7 +136,7 @@ msdos_has_ldm_partition (grub_disk_t dsk)
|
||||||
return has_ldm;
|
return has_ldm;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
|
static const grub_gpt_part_guid_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
|
||||||
|
|
||||||
/* Helper for gpt_ldm_sector. */
|
/* Helper for gpt_ldm_sector. */
|
||||||
static int
|
static int
|
||||||
|
@ -289,6 +290,7 @@ make_vg (grub_disk_t disk,
|
||||||
struct grub_ldm_vblk vblk[GRUB_DISK_SECTOR_SIZE
|
struct grub_ldm_vblk vblk[GRUB_DISK_SECTOR_SIZE
|
||||||
/ sizeof (struct grub_ldm_vblk)];
|
/ sizeof (struct grub_ldm_vblk)];
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
grub_size_t sz;
|
||||||
err = grub_disk_read (disk, cursec, 0,
|
err = grub_disk_read (disk, cursec, 0,
|
||||||
sizeof(vblk), &vblk);
|
sizeof(vblk), &vblk);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -323,8 +325,8 @@ make_vg (grub_disk_t disk,
|
||||||
lv->segments->type = GRUB_DISKFILTER_MIRROR;
|
lv->segments->type = GRUB_DISKFILTER_MIRROR;
|
||||||
lv->segments->node_count = 0;
|
lv->segments->node_count = 0;
|
||||||
lv->segments->node_alloc = 8;
|
lv->segments->node_alloc = 8;
|
||||||
lv->segments->nodes = grub_zalloc (sizeof (*lv->segments->nodes)
|
lv->segments->nodes = grub_calloc (lv->segments->node_alloc,
|
||||||
* lv->segments->node_alloc);
|
sizeof (*lv->segments->nodes));
|
||||||
if (!lv->segments->nodes)
|
if (!lv->segments->nodes)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
ptr = vblk[i].dynamic;
|
ptr = vblk[i].dynamic;
|
||||||
|
@ -350,7 +352,13 @@ make_vg (grub_disk_t disk,
|
||||||
grub_free (lv);
|
grub_free (lv);
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
lv->name = grub_malloc (*ptr + 1);
|
if (grub_add (*ptr, 1, &sz))
|
||||||
|
{
|
||||||
|
grub_free (lv->internal_id);
|
||||||
|
grub_free (lv);
|
||||||
|
goto fail2;
|
||||||
|
}
|
||||||
|
lv->name = grub_malloc (sz);
|
||||||
if (!lv->name)
|
if (!lv->name)
|
||||||
{
|
{
|
||||||
grub_free (lv->internal_id);
|
grub_free (lv->internal_id);
|
||||||
|
@ -543,8 +551,8 @@ make_vg (grub_disk_t disk,
|
||||||
{
|
{
|
||||||
comp->segment_alloc = 8;
|
comp->segment_alloc = 8;
|
||||||
comp->segment_count = 0;
|
comp->segment_count = 0;
|
||||||
comp->segments = grub_malloc (sizeof (*comp->segments)
|
comp->segments = grub_calloc (comp->segment_alloc,
|
||||||
* comp->segment_alloc);
|
sizeof (*comp->segments));
|
||||||
if (!comp->segments)
|
if (!comp->segments)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
|
@ -590,8 +598,8 @@ make_vg (grub_disk_t disk,
|
||||||
}
|
}
|
||||||
comp->segments->node_count = read_int (ptr + 1, *ptr);
|
comp->segments->node_count = read_int (ptr + 1, *ptr);
|
||||||
comp->segments->node_alloc = comp->segments->node_count;
|
comp->segments->node_alloc = comp->segments->node_count;
|
||||||
comp->segments->nodes = grub_zalloc (sizeof (*comp->segments->nodes)
|
comp->segments->nodes = grub_calloc (comp->segments->node_alloc,
|
||||||
* comp->segments->node_alloc);
|
sizeof (*comp->segments->nodes));
|
||||||
if (!lv->segments->nodes)
|
if (!lv->segments->nodes)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
}
|
}
|
||||||
|
@ -599,10 +607,13 @@ make_vg (grub_disk_t disk,
|
||||||
if (lv->segments->node_alloc == lv->segments->node_count)
|
if (lv->segments->node_alloc == lv->segments->node_count)
|
||||||
{
|
{
|
||||||
void *t;
|
void *t;
|
||||||
lv->segments->node_alloc *= 2;
|
grub_size_t sz;
|
||||||
t = grub_realloc (lv->segments->nodes,
|
|
||||||
sizeof (*lv->segments->nodes)
|
if (grub_mul (lv->segments->node_alloc, 2, &lv->segments->node_alloc) ||
|
||||||
* lv->segments->node_alloc);
|
grub_mul (lv->segments->node_alloc, sizeof (*lv->segments->nodes), &sz))
|
||||||
|
goto fail2;
|
||||||
|
|
||||||
|
t = grub_realloc (lv->segments->nodes, sz);
|
||||||
if (!t)
|
if (!t)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
lv->segments->nodes = t;
|
lv->segments->nodes = t;
|
||||||
|
@ -723,10 +734,13 @@ make_vg (grub_disk_t disk,
|
||||||
if (comp->segment_alloc == comp->segment_count)
|
if (comp->segment_alloc == comp->segment_count)
|
||||||
{
|
{
|
||||||
void *t;
|
void *t;
|
||||||
comp->segment_alloc *= 2;
|
grub_size_t sz;
|
||||||
t = grub_realloc (comp->segments,
|
|
||||||
comp->segment_alloc
|
if (grub_mul (comp->segment_alloc, 2, &comp->segment_alloc) ||
|
||||||
* sizeof (*comp->segments));
|
grub_mul (comp->segment_alloc, sizeof (*comp->segments), &sz))
|
||||||
|
goto fail2;
|
||||||
|
|
||||||
|
t = grub_realloc (comp->segments, sz);
|
||||||
if (!t)
|
if (!t)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
comp->segments = t;
|
comp->segments = t;
|
||||||
|
@ -1017,7 +1031,7 @@ grub_util_ldm_embed (struct grub_disk *disk, unsigned int *nsectors,
|
||||||
*nsectors = lv->size;
|
*nsectors = lv->size;
|
||||||
if (*nsectors > max_nsectors)
|
if (*nsectors > max_nsectors)
|
||||||
*nsectors = max_nsectors;
|
*nsectors = max_nsectors;
|
||||||
*sectors = grub_malloc (*nsectors * sizeof (**sectors));
|
*sectors = grub_calloc (*nsectors, sizeof (**sectors));
|
||||||
if (!*sectors)
|
if (!*sectors)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
for (i = 0; i < *nsectors; i++)
|
for (i = 0; i < *nsectors; i++)
|
||||||
|
|
|
@ -92,7 +92,8 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||||
|
|
||||||
file = grub_file_open (args[1]);
|
file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK
|
||||||
|
| GRUB_FILE_TYPE_NO_DECOMPRESS);
|
||||||
if (! file)
|
if (! file)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
@ -221,10 +222,10 @@ static struct grub_disk_dev grub_loopback_dev =
|
||||||
{
|
{
|
||||||
.name = "loopback",
|
.name = "loopback",
|
||||||
.id = GRUB_DISK_DEVICE_LOOPBACK_ID,
|
.id = GRUB_DISK_DEVICE_LOOPBACK_ID,
|
||||||
.iterate = grub_loopback_iterate,
|
.disk_iterate = grub_loopback_iterate,
|
||||||
.open = grub_loopback_open,
|
.disk_open = grub_loopback_open,
|
||||||
.read = grub_loopback_read,
|
.disk_read = grub_loopback_read,
|
||||||
.write = grub_loopback_write,
|
.disk_write = grub_loopback_write,
|
||||||
.next = 0
|
.next = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2003,2007,2010,2011 Free Software Foundation, Inc.
|
* Copyright (C) 2003,2007,2010,2011,2019 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software: you can redistribute it and/or modify
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -75,15 +75,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||||
char uuid[sizeof (header.uuid) + 1];
|
char uuid[sizeof (header.uuid) + 1];
|
||||||
char ciphername[sizeof (header.cipherName) + 1];
|
char ciphername[sizeof (header.cipherName) + 1];
|
||||||
char ciphermode[sizeof (header.cipherMode) + 1];
|
char ciphermode[sizeof (header.cipherMode) + 1];
|
||||||
char *cipheriv = NULL;
|
|
||||||
char hashspec[sizeof (header.hashSpec) + 1];
|
char hashspec[sizeof (header.hashSpec) + 1];
|
||||||
grub_crypto_cipher_handle_t cipher = NULL, secondary_cipher = NULL;
|
|
||||||
grub_crypto_cipher_handle_t essiv_cipher = NULL;
|
|
||||||
const gcry_md_spec_t *hash = NULL, *essiv_hash = NULL;
|
|
||||||
const struct gcry_cipher_spec *ciph;
|
|
||||||
grub_cryptodisk_mode_t mode;
|
|
||||||
grub_cryptodisk_mode_iv_t mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN64;
|
|
||||||
int benbi_log = 0;
|
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
|
|
||||||
if (check_boot)
|
if (check_boot)
|
||||||
|
@ -103,6 +95,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||||
|| grub_be_to_cpu16 (header.version) != 1)
|
|| grub_be_to_cpu16 (header.version) != 1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
grub_memset (uuid, 0, sizeof (uuid));
|
||||||
optr = uuid;
|
optr = uuid;
|
||||||
for (iptr = header.uuid; iptr < &header.uuid[ARRAY_SIZE (header.uuid)];
|
for (iptr = header.uuid; iptr < &header.uuid[ARRAY_SIZE (header.uuid)];
|
||||||
iptr++)
|
iptr++)
|
||||||
|
@ -126,183 +119,33 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||||
grub_memcpy (hashspec, header.hashSpec, sizeof (header.hashSpec));
|
grub_memcpy (hashspec, header.hashSpec, sizeof (header.hashSpec));
|
||||||
hashspec[sizeof (header.hashSpec)] = 0;
|
hashspec[sizeof (header.hashSpec)] = 0;
|
||||||
|
|
||||||
ciph = grub_crypto_lookup_cipher_by_name (ciphername);
|
newdev = grub_zalloc (sizeof (struct grub_cryptodisk));
|
||||||
if (!ciph)
|
if (!newdev)
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_FILE_NOT_FOUND, "Cipher %s isn't available",
|
|
||||||
ciphername);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
newdev->offset = grub_be_to_cpu32 (header.payloadOffset);
|
||||||
|
newdev->source_disk = NULL;
|
||||||
/* Configure the cipher used for the bulk data. */
|
newdev->log_sector_size = 9;
|
||||||
cipher = grub_crypto_cipher_open (ciph);
|
newdev->total_length = grub_disk_get_size (disk) - newdev->offset;
|
||||||
if (!cipher)
|
grub_memcpy (newdev->uuid, uuid, sizeof (uuid));
|
||||||
return NULL;
|
newdev->modname = "luks";
|
||||||
|
|
||||||
if (grub_be_to_cpu32 (header.keyBytes) > 1024)
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d",
|
|
||||||
grub_be_to_cpu32 (header.keyBytes));
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure the cipher mode. */
|
|
||||||
if (grub_strcmp (ciphermode, "ecb") == 0)
|
|
||||||
{
|
|
||||||
mode = GRUB_CRYPTODISK_MODE_ECB;
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
|
|
||||||
cipheriv = NULL;
|
|
||||||
}
|
|
||||||
else if (grub_strcmp (ciphermode, "plain") == 0)
|
|
||||||
{
|
|
||||||
mode = GRUB_CRYPTODISK_MODE_CBC;
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
|
|
||||||
cipheriv = NULL;
|
|
||||||
}
|
|
||||||
else if (grub_memcmp (ciphermode, "cbc-", sizeof ("cbc-") - 1) == 0)
|
|
||||||
{
|
|
||||||
mode = GRUB_CRYPTODISK_MODE_CBC;
|
|
||||||
cipheriv = ciphermode + sizeof ("cbc-") - 1;
|
|
||||||
}
|
|
||||||
else if (grub_memcmp (ciphermode, "pcbc-", sizeof ("pcbc-") - 1) == 0)
|
|
||||||
{
|
|
||||||
mode = GRUB_CRYPTODISK_MODE_PCBC;
|
|
||||||
cipheriv = ciphermode + sizeof ("pcbc-") - 1;
|
|
||||||
}
|
|
||||||
else if (grub_memcmp (ciphermode, "xts-", sizeof ("xts-") - 1) == 0)
|
|
||||||
{
|
|
||||||
mode = GRUB_CRYPTODISK_MODE_XTS;
|
|
||||||
cipheriv = ciphermode + sizeof ("xts-") - 1;
|
|
||||||
secondary_cipher = grub_crypto_cipher_open (ciph);
|
|
||||||
if (!secondary_cipher)
|
|
||||||
{
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d",
|
|
||||||
cipher->cipher->blocksize);
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (secondary_cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
|
||||||
{
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported XTS block size: %d",
|
|
||||||
secondary_cipher->cipher->blocksize);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (grub_memcmp (ciphermode, "lrw-", sizeof ("lrw-") - 1) == 0)
|
|
||||||
{
|
|
||||||
mode = GRUB_CRYPTODISK_MODE_LRW;
|
|
||||||
cipheriv = ciphermode + sizeof ("lrw-") - 1;
|
|
||||||
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
|
||||||
{
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported LRW block size: %d",
|
|
||||||
cipher->cipher->blocksize);
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown cipher mode: %s",
|
|
||||||
ciphermode);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cipheriv == NULL);
|
|
||||||
else if (grub_memcmp (cipheriv, "plain", sizeof ("plain") - 1) == 0)
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN;
|
|
||||||
else if (grub_memcmp (cipheriv, "plain64", sizeof ("plain64") - 1) == 0)
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_PLAIN64;
|
|
||||||
else if (grub_memcmp (cipheriv, "benbi", sizeof ("benbi") - 1) == 0)
|
|
||||||
{
|
|
||||||
if (cipher->cipher->blocksize & (cipher->cipher->blocksize - 1)
|
|
||||||
|| cipher->cipher->blocksize == 0)
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported benbi blocksize: %d",
|
|
||||||
cipher->cipher->blocksize);
|
|
||||||
/* FIXME should we return an error here? */
|
|
||||||
for (benbi_log = 0;
|
|
||||||
(cipher->cipher->blocksize << benbi_log) < GRUB_DISK_SECTOR_SIZE;
|
|
||||||
benbi_log++);
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_BENBI;
|
|
||||||
}
|
|
||||||
else if (grub_memcmp (cipheriv, "null", sizeof ("null") - 1) == 0)
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_NULL;
|
|
||||||
else if (grub_memcmp (cipheriv, "essiv:", sizeof ("essiv:") - 1) == 0)
|
|
||||||
{
|
|
||||||
char *hash_str = cipheriv + 6;
|
|
||||||
|
|
||||||
mode_iv = GRUB_CRYPTODISK_MODE_IV_ESSIV;
|
|
||||||
|
|
||||||
/* Configure the hash and cipher used for ESSIV. */
|
|
||||||
essiv_hash = grub_crypto_lookup_md_by_name (hash_str);
|
|
||||||
if (!essiv_hash)
|
|
||||||
{
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
grub_error (GRUB_ERR_FILE_NOT_FOUND,
|
|
||||||
"Couldn't load %s hash", hash_str);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
essiv_cipher = grub_crypto_cipher_open (ciph);
|
|
||||||
if (!essiv_cipher)
|
|
||||||
{
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
grub_crypto_cipher_close (cipher);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unknown IV mode: %s",
|
|
||||||
cipheriv);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Configure the hash used for the AF splitter and HMAC. */
|
/* Configure the hash used for the AF splitter and HMAC. */
|
||||||
hash = grub_crypto_lookup_md_by_name (hashspec);
|
newdev->hash = grub_crypto_lookup_md_by_name (hashspec);
|
||||||
if (!hash)
|
if (!newdev->hash)
|
||||||
{
|
{
|
||||||
grub_crypto_cipher_close (cipher);
|
grub_free (newdev);
|
||||||
grub_crypto_cipher_close (essiv_cipher);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
|
grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
|
||||||
hashspec);
|
hashspec);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
newdev = grub_zalloc (sizeof (struct grub_cryptodisk));
|
err = grub_cryptodisk_setcipher (newdev, ciphername, ciphermode);
|
||||||
if (!newdev)
|
if (err)
|
||||||
{
|
{
|
||||||
grub_crypto_cipher_close (cipher);
|
grub_free (newdev);
|
||||||
grub_crypto_cipher_close (essiv_cipher);
|
|
||||||
grub_crypto_cipher_close (secondary_cipher);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
newdev->cipher = cipher;
|
|
||||||
newdev->offset = grub_be_to_cpu32 (header.payloadOffset);
|
|
||||||
newdev->source_disk = NULL;
|
|
||||||
newdev->benbi_log = benbi_log;
|
|
||||||
newdev->mode = mode;
|
|
||||||
newdev->mode_iv = mode_iv;
|
|
||||||
newdev->secondary_cipher = secondary_cipher;
|
|
||||||
newdev->essiv_cipher = essiv_cipher;
|
|
||||||
newdev->essiv_hash = essiv_hash;
|
|
||||||
newdev->hash = hash;
|
|
||||||
newdev->log_sector_size = 9;
|
|
||||||
newdev->total_length = grub_disk_get_size (disk) - newdev->offset;
|
|
||||||
grub_memcpy (newdev->uuid, uuid, sizeof (newdev->uuid));
|
|
||||||
newdev->modname = "luks";
|
|
||||||
COMPILE_TIME_ASSERT (sizeof (newdev->uuid) >= sizeof (uuid));
|
COMPILE_TIME_ASSERT (sizeof (newdev->uuid) >= sizeof (uuid));
|
||||||
return newdev;
|
return newdev;
|
||||||
}
|
}
|
||||||
|
@ -336,7 +179,7 @@ luks_recover_key (grub_disk_t source,
|
||||||
&& grub_be_to_cpu32 (header.keyblock[i].stripes) > max_stripes)
|
&& grub_be_to_cpu32 (header.keyblock[i].stripes) > max_stripes)
|
||||||
max_stripes = grub_be_to_cpu32 (header.keyblock[i].stripes);
|
max_stripes = grub_be_to_cpu32 (header.keyblock[i].stripes);
|
||||||
|
|
||||||
split_key = grub_malloc (keysize * max_stripes);
|
split_key = grub_calloc (keysize, max_stripes);
|
||||||
if (!split_key)
|
if (!split_key)
|
||||||
return grub_errno;
|
return grub_errno;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,687 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2019 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/cryptodisk.h>
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/disk.h>
|
||||||
|
#include <grub/crypto.h>
|
||||||
|
#include <grub/partition.h>
|
||||||
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
|
#include <base64.h>
|
||||||
|
#include <json.h>
|
||||||
|
|
||||||
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
#define LUKS_MAGIC_1ST "LUKS\xBA\xBE"
|
||||||
|
#define LUKS_MAGIC_2ND "SKUL\xBA\xBE"
|
||||||
|
|
||||||
|
#define MAX_PASSPHRASE 256
|
||||||
|
|
||||||
|
enum grub_luks2_kdf_type
|
||||||
|
{
|
||||||
|
LUKS2_KDF_TYPE_ARGON2I,
|
||||||
|
LUKS2_KDF_TYPE_PBKDF2
|
||||||
|
};
|
||||||
|
typedef enum grub_luks2_kdf_type grub_luks2_kdf_type_t;
|
||||||
|
|
||||||
|
/* On disk LUKS header */
|
||||||
|
struct grub_luks2_header
|
||||||
|
{
|
||||||
|
char magic[6];
|
||||||
|
grub_uint16_t version;
|
||||||
|
grub_uint64_t hdr_size;
|
||||||
|
grub_uint64_t seqid;
|
||||||
|
char label[48];
|
||||||
|
char csum_alg[32];
|
||||||
|
grub_uint8_t salt[64];
|
||||||
|
char uuid[40];
|
||||||
|
char subsystem[48];
|
||||||
|
grub_uint64_t hdr_offset;
|
||||||
|
char _padding[184];
|
||||||
|
grub_uint8_t csum[64];
|
||||||
|
char _padding4096[7*512];
|
||||||
|
} GRUB_PACKED;
|
||||||
|
typedef struct grub_luks2_header grub_luks2_header_t;
|
||||||
|
|
||||||
|
struct grub_luks2_keyslot
|
||||||
|
{
|
||||||
|
grub_int64_t key_size;
|
||||||
|
grub_int64_t priority;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const char *encryption;
|
||||||
|
grub_uint64_t offset;
|
||||||
|
grub_uint64_t size;
|
||||||
|
grub_int64_t key_size;
|
||||||
|
} area;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const char *hash;
|
||||||
|
grub_int64_t stripes;
|
||||||
|
} af;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
grub_luks2_kdf_type_t type;
|
||||||
|
const char *salt;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
grub_int64_t time;
|
||||||
|
grub_int64_t memory;
|
||||||
|
grub_int64_t cpus;
|
||||||
|
} argon2i;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const char *hash;
|
||||||
|
grub_int64_t iterations;
|
||||||
|
} pbkdf2;
|
||||||
|
} u;
|
||||||
|
} kdf;
|
||||||
|
};
|
||||||
|
typedef struct grub_luks2_keyslot grub_luks2_keyslot_t;
|
||||||
|
|
||||||
|
struct grub_luks2_segment
|
||||||
|
{
|
||||||
|
grub_uint64_t offset;
|
||||||
|
const char *size;
|
||||||
|
const char *encryption;
|
||||||
|
grub_int64_t sector_size;
|
||||||
|
};
|
||||||
|
typedef struct grub_luks2_segment grub_luks2_segment_t;
|
||||||
|
|
||||||
|
struct grub_luks2_digest
|
||||||
|
{
|
||||||
|
/* Both keyslots and segments are interpreted as bitfields here */
|
||||||
|
grub_uint64_t keyslots;
|
||||||
|
grub_uint64_t segments;
|
||||||
|
const char *salt;
|
||||||
|
const char *digest;
|
||||||
|
const char *hash;
|
||||||
|
grub_int64_t iterations;
|
||||||
|
};
|
||||||
|
typedef struct grub_luks2_digest grub_luks2_digest_t;
|
||||||
|
|
||||||
|
gcry_err_code_t AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src,
|
||||||
|
grub_uint8_t * dst, grub_size_t blocksize,
|
||||||
|
grub_size_t blocknumbers);
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_parse_keyslot (grub_luks2_keyslot_t *out, const grub_json_t *keyslot)
|
||||||
|
{
|
||||||
|
grub_json_t area, af, kdf;
|
||||||
|
const char *type;
|
||||||
|
|
||||||
|
if (grub_json_getstring (&type, keyslot, "type"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing or invalid keyslot");
|
||||||
|
else if (grub_strcmp (type, "luks2"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported keyslot type %s", type);
|
||||||
|
else if (grub_json_getint64 (&out->key_size, keyslot, "key_size"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing keyslot information");
|
||||||
|
if (grub_json_getint64 (&out->priority, keyslot, "priority"))
|
||||||
|
out->priority = 1;
|
||||||
|
|
||||||
|
if (grub_json_getvalue (&area, keyslot, "area") ||
|
||||||
|
grub_json_getstring (&type, &area, "type"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing or invalid key area");
|
||||||
|
else if (grub_strcmp (type, "raw"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported key area type: %s", type);
|
||||||
|
else if (grub_json_getuint64 (&out->area.offset, &area, "offset") ||
|
||||||
|
grub_json_getuint64 (&out->area.size, &area, "size") ||
|
||||||
|
grub_json_getstring (&out->area.encryption, &area, "encryption") ||
|
||||||
|
grub_json_getint64 (&out->area.key_size, &area, "key_size"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing key area information");
|
||||||
|
|
||||||
|
if (grub_json_getvalue (&kdf, keyslot, "kdf") ||
|
||||||
|
grub_json_getstring (&type, &kdf, "type") ||
|
||||||
|
grub_json_getstring (&out->kdf.salt, &kdf, "salt"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing or invalid KDF");
|
||||||
|
else if (!grub_strcmp (type, "argon2i") || !grub_strcmp (type, "argon2id"))
|
||||||
|
{
|
||||||
|
out->kdf.type = LUKS2_KDF_TYPE_ARGON2I;
|
||||||
|
if (grub_json_getint64 (&out->kdf.u.argon2i.time, &kdf, "time") ||
|
||||||
|
grub_json_getint64 (&out->kdf.u.argon2i.memory, &kdf, "memory") ||
|
||||||
|
grub_json_getint64 (&out->kdf.u.argon2i.cpus, &kdf, "cpus"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing Argon2i parameters");
|
||||||
|
}
|
||||||
|
else if (!grub_strcmp (type, "pbkdf2"))
|
||||||
|
{
|
||||||
|
out->kdf.type = LUKS2_KDF_TYPE_PBKDF2;
|
||||||
|
if (grub_json_getstring (&out->kdf.u.pbkdf2.hash, &kdf, "hash") ||
|
||||||
|
grub_json_getint64 (&out->kdf.u.pbkdf2.iterations, &kdf, "iterations"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing PBKDF2 parameters");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported KDF type %s", type);
|
||||||
|
|
||||||
|
if (grub_json_getvalue (&af, keyslot, "af") ||
|
||||||
|
grub_json_getstring (&type, &af, "type"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing or invalid area");
|
||||||
|
if (grub_strcmp (type, "luks1"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported AF type %s", type);
|
||||||
|
if (grub_json_getint64 (&out->af.stripes, &af, "stripes") ||
|
||||||
|
grub_json_getstring (&out->af.hash, &af, "hash"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing AF parameters");
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_parse_segment (grub_luks2_segment_t *out, const grub_json_t *segment)
|
||||||
|
{
|
||||||
|
const char *type;
|
||||||
|
|
||||||
|
if (grub_json_getstring (&type, segment, "type"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid segment type");
|
||||||
|
else if (grub_strcmp (type, "crypt"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported segment type %s", type);
|
||||||
|
|
||||||
|
if (grub_json_getuint64 (&out->offset, segment, "offset") ||
|
||||||
|
grub_json_getstring (&out->size, segment, "size") ||
|
||||||
|
grub_json_getstring (&out->encryption, segment, "encryption") ||
|
||||||
|
grub_json_getint64 (&out->sector_size, segment, "sector_size"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing segment parameters", type);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_parse_digest (grub_luks2_digest_t *out, const grub_json_t *digest)
|
||||||
|
{
|
||||||
|
grub_json_t segments, keyslots, o;
|
||||||
|
grub_size_t i, size;
|
||||||
|
grub_uint64_t bit;
|
||||||
|
const char *type;
|
||||||
|
|
||||||
|
if (grub_json_getstring (&type, digest, "type"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest type");
|
||||||
|
else if (grub_strcmp (type, "pbkdf2"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported digest type %s", type);
|
||||||
|
|
||||||
|
if (grub_json_getvalue (&segments, digest, "segments") ||
|
||||||
|
grub_json_getvalue (&keyslots, digest, "keyslots") ||
|
||||||
|
grub_json_getstring (&out->salt, digest, "salt") ||
|
||||||
|
grub_json_getstring (&out->digest, digest, "digest") ||
|
||||||
|
grub_json_getstring (&out->hash, digest, "hash") ||
|
||||||
|
grub_json_getint64 (&out->iterations, digest, "iterations"))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Missing digest parameters");
|
||||||
|
|
||||||
|
if (grub_json_getsize (&size, &segments))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"Digest references no segments", type);
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (grub_json_getchild (&o, &segments, i) ||
|
||||||
|
grub_json_getuint64 (&bit, &o, NULL))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid segment");
|
||||||
|
out->segments |= (1 << bit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_json_getsize (&size, &keyslots))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||||
|
"Digest references no keyslots", type);
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (grub_json_getchild (&o, &keyslots, i) ||
|
||||||
|
grub_json_getuint64 (&bit, &o, NULL))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid keyslot");
|
||||||
|
out->keyslots |= (1 << bit);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_get_keyslot (grub_luks2_keyslot_t *k, grub_luks2_digest_t *d, grub_luks2_segment_t *s,
|
||||||
|
const grub_json_t *root, grub_size_t i)
|
||||||
|
{
|
||||||
|
grub_json_t keyslots, keyslot, digests, digest, segments, segment;
|
||||||
|
grub_size_t j, size;
|
||||||
|
grub_uint64_t idx;
|
||||||
|
|
||||||
|
/* Get nth keyslot */
|
||||||
|
if (grub_json_getvalue (&keyslots, root, "keyslots") ||
|
||||||
|
grub_json_getchild (&keyslot, &keyslots, i) ||
|
||||||
|
grub_json_getuint64 (&idx, &keyslot, NULL) ||
|
||||||
|
grub_json_getchild (&keyslot, &keyslot, 0) ||
|
||||||
|
luks2_parse_keyslot (k, &keyslot))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Could not parse keyslot %"PRIuGRUB_SIZE, i);
|
||||||
|
|
||||||
|
/* Get digest that matches the keyslot. */
|
||||||
|
if (grub_json_getvalue (&digests, root, "digests") ||
|
||||||
|
grub_json_getsize (&size, &digests))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Could not get digests");
|
||||||
|
for (j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
if (grub_json_getchild (&digest, &digests, i) ||
|
||||||
|
grub_json_getchild (&digest, &digest, 0) ||
|
||||||
|
luks2_parse_digest (d, &digest))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Could not parse digest %"PRIuGRUB_SIZE, i);
|
||||||
|
|
||||||
|
if ((d->keyslots & (1 << idx)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (j == size)
|
||||||
|
return grub_error (GRUB_ERR_FILE_NOT_FOUND, "No digest for keyslot %"PRIuGRUB_SIZE);
|
||||||
|
|
||||||
|
/* Get segment that matches the digest. */
|
||||||
|
if (grub_json_getvalue (&segments, root, "segments") ||
|
||||||
|
grub_json_getsize (&size, &segments))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Could not get segments");
|
||||||
|
for (j = 0; j < size; j++)
|
||||||
|
{
|
||||||
|
if (grub_json_getchild (&segment, &segments, i) ||
|
||||||
|
grub_json_getuint64 (&idx, &segment, NULL) ||
|
||||||
|
grub_json_getchild (&segment, &segment, 0) ||
|
||||||
|
luks2_parse_segment (s, &segment))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Could not parse segment %"PRIuGRUB_SIZE, i);
|
||||||
|
|
||||||
|
if ((d->segments & (1 << idx)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (j == size)
|
||||||
|
return grub_error (GRUB_ERR_FILE_NOT_FOUND, "No segment for digest %"PRIuGRUB_SIZE);
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine whether to use primary or secondary header */
|
||||||
|
static grub_err_t
|
||||||
|
luks2_read_header (grub_disk_t disk, grub_luks2_header_t *outhdr)
|
||||||
|
{
|
||||||
|
grub_luks2_header_t primary, secondary, *header = &primary;
|
||||||
|
grub_err_t ret;
|
||||||
|
|
||||||
|
/* Read the primary LUKS header. */
|
||||||
|
ret = grub_disk_read (disk, 0, 0, sizeof (primary), &primary);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Look for LUKS magic sequence. */
|
||||||
|
if (grub_memcmp (primary.magic, LUKS_MAGIC_1ST, sizeof (primary.magic)) ||
|
||||||
|
grub_be_to_cpu16 (primary.version) != 2)
|
||||||
|
return GRUB_ERR_BAD_SIGNATURE;
|
||||||
|
|
||||||
|
/* Read the secondary header. */
|
||||||
|
ret = grub_disk_read (disk, 0, grub_be_to_cpu64 (primary.hdr_size), sizeof (secondary), &secondary);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Look for LUKS magic sequence. */
|
||||||
|
if (grub_memcmp (secondary.magic, LUKS_MAGIC_2ND, sizeof (secondary.magic)) ||
|
||||||
|
grub_be_to_cpu16 (secondary.version) != 2)
|
||||||
|
return GRUB_ERR_BAD_SIGNATURE;
|
||||||
|
|
||||||
|
if (grub_be_to_cpu64 (primary.seqid) < grub_be_to_cpu64 (secondary.seqid))
|
||||||
|
header = &secondary;
|
||||||
|
grub_memcpy (outhdr, header, sizeof (*header));
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_cryptodisk_t
|
||||||
|
luks2_scan (grub_disk_t disk, const char *check_uuid, int check_boot)
|
||||||
|
{
|
||||||
|
grub_cryptodisk_t cryptodisk;
|
||||||
|
grub_luks2_header_t header;
|
||||||
|
char uuid[sizeof (header.uuid) + 1];
|
||||||
|
grub_size_t i, j;
|
||||||
|
|
||||||
|
if (check_boot)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (luks2_read_header (disk, &header))
|
||||||
|
{
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0, j = 0; i < sizeof (header.uuid); i++)
|
||||||
|
if (header.uuid[i] != '-')
|
||||||
|
uuid[j++] = header.uuid[i];
|
||||||
|
uuid[j] = '\0';
|
||||||
|
|
||||||
|
if (check_uuid && grub_strcasecmp (check_uuid, uuid) != 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
cryptodisk = grub_zalloc (sizeof (*cryptodisk));
|
||||||
|
if (!cryptodisk)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
COMPILE_TIME_ASSERT (sizeof (cryptodisk->uuid) >= sizeof (uuid));
|
||||||
|
grub_memcpy (cryptodisk->uuid, uuid, sizeof (uuid));
|
||||||
|
|
||||||
|
cryptodisk->modname = "luks2";
|
||||||
|
return cryptodisk;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_verify_key (grub_luks2_digest_t *d, grub_uint8_t *candidate_key,
|
||||||
|
grub_size_t candidate_key_len)
|
||||||
|
{
|
||||||
|
grub_uint8_t candidate_digest[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||||
|
grub_uint8_t digest[GRUB_CRYPTODISK_MAX_KEYLEN], salt[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||||
|
grub_size_t saltlen = sizeof (salt), digestlen = sizeof (digest);
|
||||||
|
const gcry_md_spec_t *hash;
|
||||||
|
gcry_err_code_t gcry_ret;
|
||||||
|
|
||||||
|
/* Decode both digest and salt */
|
||||||
|
if (!base64_decode (d->digest, grub_strlen (d->digest), (char *)digest, &digestlen))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest");
|
||||||
|
if (!base64_decode (d->salt, grub_strlen (d->salt), (char *)salt, &saltlen))
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest salt");
|
||||||
|
|
||||||
|
/* Configure the hash used for the digest. */
|
||||||
|
hash = grub_crypto_lookup_md_by_name (d->hash);
|
||||||
|
if (!hash)
|
||||||
|
return grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash", d->hash);
|
||||||
|
|
||||||
|
/* Calculate the candidate key's digest */
|
||||||
|
gcry_ret = grub_crypto_pbkdf2 (hash,
|
||||||
|
candidate_key, candidate_key_len,
|
||||||
|
salt, saltlen,
|
||||||
|
d->iterations,
|
||||||
|
candidate_digest, digestlen);
|
||||||
|
if (gcry_ret)
|
||||||
|
return grub_crypto_gcry_error (gcry_ret);
|
||||||
|
|
||||||
|
if (grub_memcmp (candidate_digest, digest, digestlen) != 0)
|
||||||
|
return grub_error (GRUB_ERR_ACCESS_DENIED, "Mismatching digests");
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_decrypt_key (grub_uint8_t *out_key,
|
||||||
|
grub_disk_t disk, grub_cryptodisk_t crypt,
|
||||||
|
grub_luks2_keyslot_t *k,
|
||||||
|
const grub_uint8_t *passphrase, grub_size_t passphraselen)
|
||||||
|
{
|
||||||
|
grub_uint8_t area_key[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||||
|
grub_uint8_t salt[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||||
|
grub_uint8_t *split_key = NULL;
|
||||||
|
grub_size_t saltlen = sizeof (salt);
|
||||||
|
char cipher[32], *p;;
|
||||||
|
const gcry_md_spec_t *hash;
|
||||||
|
gcry_err_code_t gcry_ret;
|
||||||
|
grub_err_t ret;
|
||||||
|
|
||||||
|
if (!base64_decode (k->kdf.salt, grub_strlen (k->kdf.salt),
|
||||||
|
(char *)salt, &saltlen))
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid keyslot salt");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate the binary area key of the user supplied passphrase. */
|
||||||
|
switch (k->kdf.type)
|
||||||
|
{
|
||||||
|
case LUKS2_KDF_TYPE_ARGON2I:
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Argon2 not supported");
|
||||||
|
goto err;
|
||||||
|
case LUKS2_KDF_TYPE_PBKDF2:
|
||||||
|
hash = grub_crypto_lookup_md_by_name (k->kdf.u.pbkdf2.hash);
|
||||||
|
if (!hash)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
|
||||||
|
k->kdf.u.pbkdf2.hash);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
gcry_ret = grub_crypto_pbkdf2 (hash, (grub_uint8_t *) passphrase,
|
||||||
|
passphraselen,
|
||||||
|
salt, saltlen,
|
||||||
|
k->kdf.u.pbkdf2.iterations,
|
||||||
|
area_key, k->area.key_size);
|
||||||
|
if (gcry_ret)
|
||||||
|
{
|
||||||
|
ret = grub_crypto_gcry_error (gcry_ret);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set up disk encryption parameters for the key area */
|
||||||
|
grub_strncpy (cipher, k->area.encryption, sizeof (cipher));
|
||||||
|
p = grub_memchr (cipher, '-', grub_strlen (cipher));
|
||||||
|
if (!p)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid encryption");
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
ret = grub_cryptodisk_setcipher (crypt, cipher, p + 1);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
gcry_ret = grub_cryptodisk_setkey (crypt, area_key, k->area.key_size);
|
||||||
|
if (gcry_ret)
|
||||||
|
{
|
||||||
|
ret = grub_crypto_gcry_error (gcry_ret);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read and decrypt the binary key area with the area key. */
|
||||||
|
split_key = grub_malloc (k->area.size);
|
||||||
|
if (!split_key)
|
||||||
|
{
|
||||||
|
ret = grub_errno;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
ret = grub_disk_read (disk, 0, k->area.offset, k->area.size, split_key);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_IO, "Read error: %s\n", grub_errmsg);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
gcry_ret = grub_cryptodisk_decrypt (crypt, split_key, k->area.size, 0);
|
||||||
|
if (gcry_ret)
|
||||||
|
{
|
||||||
|
ret = grub_crypto_gcry_error (gcry_ret);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure the hash used for anti-forensic merging. */
|
||||||
|
hash = grub_crypto_lookup_md_by_name (k->af.hash);
|
||||||
|
if (!hash)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
|
||||||
|
k->af.hash);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Merge the decrypted key material to get the candidate master key. */
|
||||||
|
gcry_ret = AF_merge (hash, split_key, out_key, k->key_size, k->af.stripes);
|
||||||
|
if (gcry_ret)
|
||||||
|
{
|
||||||
|
ret = grub_crypto_gcry_error (gcry_ret);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_dprintf ("luks2", "Candidate key recovered\n");
|
||||||
|
|
||||||
|
err:
|
||||||
|
grub_free (split_key);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
luks2_recover_key (grub_disk_t disk,
|
||||||
|
grub_cryptodisk_t crypt)
|
||||||
|
{
|
||||||
|
grub_uint8_t candidate_key[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||||
|
char passphrase[MAX_PASSPHRASE], cipher[32];
|
||||||
|
char *json_header = NULL, *part = NULL, *ptr;
|
||||||
|
grub_size_t candidate_key_len = 0, i, size;
|
||||||
|
grub_luks2_header_t header;
|
||||||
|
grub_luks2_keyslot_t keyslot;
|
||||||
|
grub_luks2_digest_t digest;
|
||||||
|
grub_luks2_segment_t segment;
|
||||||
|
gcry_err_code_t gcry_ret;
|
||||||
|
grub_json_t *json = NULL, keyslots;
|
||||||
|
grub_err_t ret;
|
||||||
|
|
||||||
|
ret = luks2_read_header (disk, &header);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
json_header = grub_zalloc (grub_be_to_cpu64 (header.hdr_size) - sizeof (header));
|
||||||
|
if (!json_header)
|
||||||
|
return GRUB_ERR_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
/* Read the JSON area. */
|
||||||
|
ret = grub_disk_read (disk, 0, grub_be_to_cpu64 (header.hdr_offset) + sizeof (header),
|
||||||
|
grub_be_to_cpu64 (header.hdr_size) - sizeof (header), json_header);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
ptr = grub_memchr (json_header, 0, grub_be_to_cpu64 (header.hdr_size) - sizeof (header));
|
||||||
|
if (!ptr)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
ret = grub_json_parse (&json, json_header, grub_be_to_cpu64 (header.hdr_size));
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid LUKS2 JSON header");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the passphrase from the user. */
|
||||||
|
if (disk->partition)
|
||||||
|
part = grub_partition_get_name (disk->partition);
|
||||||
|
grub_printf_ (N_("Enter passphrase for %s%s%s (%s): "), disk->name,
|
||||||
|
disk->partition ? "," : "", part ? : "",
|
||||||
|
crypt->uuid);
|
||||||
|
if (!grub_password_get (passphrase, MAX_PASSPHRASE))
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grub_json_getvalue (&keyslots, json, "keyslots") ||
|
||||||
|
grub_json_getsize (&size, &keyslots))
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Could not get keyslots");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try all keyslot */
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
ret = luks2_get_keyslot (&keyslot, &digest, &segment, json, i);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
if (keyslot.priority == 0)
|
||||||
|
{
|
||||||
|
grub_dprintf ("luks2", "Ignoring keyslot %"PRIuGRUB_SIZE" due to priority\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_dprintf ("luks2", "Trying keyslot %"PRIuGRUB_SIZE"\n", i);
|
||||||
|
|
||||||
|
/* Set up disk according to keyslot's segment. */
|
||||||
|
crypt->offset = grub_divmod64 (segment.offset, segment.sector_size, NULL);
|
||||||
|
crypt->log_sector_size = sizeof (unsigned int) * 8
|
||||||
|
- __builtin_clz ((unsigned int) segment.sector_size) - 1;
|
||||||
|
if (grub_strcmp (segment.size, "dynamic") == 0)
|
||||||
|
crypt->total_length = grub_disk_get_size (disk) - crypt->offset;
|
||||||
|
else
|
||||||
|
crypt->total_length = grub_strtoull (segment.size, NULL, 10);
|
||||||
|
|
||||||
|
ret = luks2_decrypt_key (candidate_key, disk, crypt, &keyslot,
|
||||||
|
(const grub_uint8_t *) passphrase, grub_strlen (passphrase));
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
grub_dprintf ("luks2", "Decryption with keyslot %"PRIuGRUB_SIZE" failed: %s\n",
|
||||||
|
i, grub_errmsg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = luks2_verify_key (&digest, candidate_key, keyslot.key_size);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
grub_dprintf ("luks2", "Could not open keyslot %"PRIuGRUB_SIZE": %s\n",
|
||||||
|
i, grub_errmsg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TRANSLATORS: It's a cryptographic key slot: one element of an array
|
||||||
|
* where each element is either empty or holds a key.
|
||||||
|
*/
|
||||||
|
grub_printf_ (N_("Slot %"PRIuGRUB_SIZE" opened\n"), i);
|
||||||
|
|
||||||
|
candidate_key_len = keyslot.key_size;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (candidate_key_len == 0)
|
||||||
|
{
|
||||||
|
ret = grub_error (GRUB_ERR_ACCESS_DENIED, "Invalid passphrase");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set up disk cipher. */
|
||||||
|
grub_strncpy (cipher, segment.encryption, sizeof (cipher));
|
||||||
|
ptr = grub_memchr (cipher, '-', grub_strlen (cipher));
|
||||||
|
if (!ptr)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid encryption");
|
||||||
|
*ptr = '\0';
|
||||||
|
|
||||||
|
ret = grub_cryptodisk_setcipher (crypt, cipher, ptr + 1);
|
||||||
|
if (ret)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
/* Set the master key. */
|
||||||
|
gcry_ret = grub_cryptodisk_setkey (crypt, candidate_key, candidate_key_len);
|
||||||
|
if (gcry_ret)
|
||||||
|
{
|
||||||
|
ret = grub_crypto_gcry_error (gcry_ret);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err:
|
||||||
|
grub_free (part);
|
||||||
|
grub_free (json_header);
|
||||||
|
grub_json_free (json);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct grub_cryptodisk_dev luks2_crypto = {
|
||||||
|
.scan = luks2_scan,
|
||||||
|
.recover_key = luks2_recover_key
|
||||||
|
};
|
||||||
|
|
||||||
|
GRUB_MOD_INIT (luks2)
|
||||||
|
{
|
||||||
|
grub_cryptodisk_dev_register (&luks2_crypto);
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI (luks2)
|
||||||
|
{
|
||||||
|
grub_cryptodisk_dev_unregister (&luks2_crypto);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue