mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-28 10:10:29 +00:00
Compare commits
859
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b14d85db89 | ||
|
|
21143c3fde | ||
|
|
872dec5684 | ||
|
|
3bac4caa2b | ||
|
|
6866f2ba37 | ||
|
|
44b38e4988 | ||
|
|
68581b009f | ||
|
|
69aee43fa6 | ||
|
|
ac8bac2496 | ||
|
|
4e0a25a4c0 | ||
|
|
b666e01b9c | ||
|
|
2e62352bc2 | ||
|
|
e360b5d176 | ||
|
|
c453760c71 | ||
|
|
e95685dab1 | ||
|
|
4816dcac19 | ||
|
|
750f4bacd3 | ||
|
|
1b6aaddc45 | ||
|
|
475bffeae6 | ||
|
|
9deb46e363 | ||
|
|
065ed900d4 | ||
|
|
111ab3b9cc | ||
|
|
4200ad44fe | ||
|
|
f1959b1695 | ||
|
|
935863518f | ||
|
|
98f74998d5 | ||
|
|
5ed3a5d049 | ||
|
|
47cd2645dd | ||
|
|
245e21b2b5 | ||
|
|
9201cd79a3 | ||
|
|
f27ccb584c | ||
|
|
1dfe3f973e | ||
|
|
44461d5af2 | ||
|
|
30e177a05b | ||
|
|
af435524cd | ||
|
|
66ce4d1aef | ||
|
|
59d4036594 | ||
|
|
ba3031f996 | ||
|
|
bac5d1a64a | ||
|
|
17328db3b3 | ||
|
|
58f66137a3 | ||
|
|
cdae5bf208 | ||
|
|
06eadf5ebf | ||
|
|
ebb3d958aa | ||
|
|
272e0466da | ||
|
|
4b94e3227b | ||
|
|
3173c7501c | ||
|
|
03d79a878b | ||
|
|
dbbac5a04c | ||
|
|
343dad410e | ||
|
|
f07784e890 | ||
|
|
bbbcb791ed | ||
|
|
740c08ed2f | ||
|
|
ea44693fc8 | ||
|
|
0415dbe28f | ||
|
|
478b567520 | ||
|
|
7c4b6b7bb4 | ||
|
|
e2dd6daa8c | ||
|
|
2ccaa3b9fd | ||
|
|
004a2b1efd | ||
|
|
72ec399ad8 | ||
|
|
9a67e1ac8e | ||
|
|
77063f4cb6 | ||
|
|
5d90f6e533 | ||
|
|
954fe77163 | ||
|
|
6d05b6383c | ||
|
|
0f1f95c7b7 | ||
|
|
41c6f91fce | ||
|
|
7c378c3964 | ||
|
|
2988a849fc | ||
|
|
5e42618e00 | ||
|
|
0aece00c54 | ||
|
|
631a820038 | ||
|
|
60049a0e72 | ||
|
|
a276b84046 | ||
|
|
54bd9a0610 | ||
|
|
2a5a532c00 | ||
|
|
4d94b2db58 | ||
|
|
1de3a48098 | ||
|
|
c291f47b2c | ||
|
|
3c05833249 | ||
|
|
d1224d209b | ||
|
|
0af3ae2d8b | ||
|
|
79c80b06b8 | ||
|
|
33f6ce671f | ||
|
|
0901e7855f | ||
|
|
4250f552a6 | ||
|
|
1f6af2a9f8 | ||
|
|
fa33530870 | ||
|
|
15bd333e10 | ||
|
|
3f3ec8ef44 | ||
|
|
87de66d9d8 | ||
|
|
2c2c5c720d | ||
|
|
480c89858e | ||
|
|
4b8b9135f1 | ||
|
|
5a6db38d62 | ||
|
|
3a310e842f | ||
|
|
c4badfe836 | ||
|
|
a72fc329eb | ||
|
|
2009da62f2 | ||
|
|
6f6d4aa02c | ||
|
|
8063ce197f | ||
|
|
9706066791 | ||
|
|
4afd0107ef | ||
|
|
24024dac7f | ||
|
|
9b35fe819f | ||
|
|
46b74dd3cb | ||
|
|
68f17b2b30 | ||
|
|
e4a1fe3919 | ||
|
|
86402b4e0f | ||
|
|
bec35dad2a | ||
|
|
dfc5ccfa97 | ||
|
|
4a70fed815 | ||
|
|
f94b2b4eeb | ||
|
|
d0949e3747 | ||
|
|
9585647a25 | ||
|
|
e4dbf247b6 | ||
|
|
006c78f378 | ||
|
|
511ece7ceb | ||
|
|
9abbaae7cd | ||
|
|
d6b94c5eb2 | ||
|
|
07ea8daa86 | ||
|
|
3142b2feac | ||
|
|
4686e163f2 | ||
|
|
ba424f37a9 | ||
|
|
3beabdc8e4 | ||
|
|
ba584da163 | ||
|
|
7f64fb590c | ||
|
|
35f2d96c0d | ||
|
|
9afe2053c9 | ||
|
|
5ae584c0b0 | ||
|
|
1440b7ebae | ||
|
|
61c8482b20 | ||
|
|
95cd131ea0 | ||
|
|
d08059309f | ||
|
|
eec4237a32 | ||
|
|
443b322262 | ||
|
|
36387ece6b | ||
|
|
6f65e36cc4 | ||
|
|
d99d2f8416 | ||
|
|
049f63824c | ||
|
|
015045471e | ||
|
|
b204b718cc | ||
|
|
41155a5722 | ||
|
|
e0a850947f | ||
|
|
0b47c57ad6 | ||
|
|
6ba983559d | ||
|
|
6c519b5c6c | ||
|
|
f371dd5da8 | ||
|
|
1ecf96fcc4 | ||
|
|
5ef569df5b | ||
|
|
9b9c4686f0 | ||
|
|
3abb956371 | ||
|
|
dcecae1a49 | ||
|
|
ae80f31270 | ||
|
|
7e7293d745 | ||
|
|
5acc8020b4 | ||
|
|
ff66b8e7d8 | ||
|
|
09a836e59c | ||
|
|
0776112c53 | ||
|
|
ccd21a65ed | ||
|
|
4d21c10199 | ||
|
|
e7cfa8d5e1 | ||
|
|
94cee4a4c2 | ||
|
|
c9e839e2ca | ||
|
|
668add258f | ||
|
|
0e309454f6 | ||
|
|
093dec7370 | ||
|
|
989af02582 | ||
|
|
8442d3e956 | ||
|
|
645ff636fe | ||
|
|
30a338460a | ||
|
|
51f941a0d8 | ||
|
|
5bda44d7f9 | ||
|
|
a6e7719bbe | ||
|
|
e8f07821cc | ||
|
|
dc3286ade4 | ||
|
|
46f8d358ef | ||
|
|
09c479006c | ||
|
|
4d6c69536e | ||
|
|
faf4a65e1e | ||
|
|
e5fa26e573 | ||
|
|
569766e49b | ||
|
|
4127206896 | ||
|
|
f7c7c4d4ad | ||
|
|
57bc5d431b | ||
|
|
6a7957f9f5 | ||
|
|
e88f0420b9 | ||
|
|
da98622662 | ||
|
|
fba31b5f69 | ||
|
|
72f099578e | ||
|
|
808e97c4e7 | ||
|
|
e388db904c | ||
|
|
cef394032d | ||
|
|
a4d610026f | ||
|
|
0c930a841e | ||
|
|
3d369a01ac | ||
|
|
5b83ef97e5 | ||
|
|
16f7455b04 | ||
|
|
74fa9ac1a6 | ||
|
|
62956fe7b9 | ||
|
|
260632161f | ||
|
|
4cd0b55fd0 | ||
|
|
95b56e3a97 | ||
|
|
bbc52c228f | ||
|
|
943981ff65 | ||
|
|
adabfb5418 | ||
|
|
77ec462a56 | ||
|
|
3bf2db8959 | ||
|
|
30a9ab952f | ||
|
|
c415eaa98f | ||
|
|
313fb3cef8 | ||
|
|
37f617c025 | ||
|
|
3deedfc033 | ||
|
|
5ad9f728eb | ||
|
|
eeb8499721 | ||
|
|
0d8b81f89a | ||
|
|
bf082198e2 | ||
|
|
0b602bf9ad | ||
|
|
96650a82ec | ||
|
|
ca3e20886e | ||
|
|
27db1a9b64 | ||
|
|
8a913e664e | ||
|
|
ae558c2ccf | ||
|
|
bbac6789aa | ||
|
|
ab216512d7 | ||
|
|
0d4aa91d0d | ||
|
|
a997af68e3 | ||
|
|
36bcaf2903 | ||
|
|
74763e9615 | ||
|
|
80b29fc9b4 | ||
|
|
6e327fcd4c | ||
|
|
62ce03cf40 | ||
|
|
f4d70fd02b | ||
|
|
93bf55e616 | ||
|
|
579ee114b1 | ||
|
|
ee5283d66b | ||
|
|
5dbde526a8 | ||
|
|
d88ae4f0a4 | ||
|
|
17b4355943 | ||
|
|
76a2a43011 | ||
|
|
0d26164edd | ||
|
|
2622b1e8a8 | ||
|
|
05126706b0 | ||
|
|
2f9c48041a | ||
|
|
0438ebf1c3 | ||
|
|
065adc346c | ||
|
|
496a6b3024 | ||
|
|
971038be55 | ||
|
|
bfdfeb2508 | ||
|
|
c00c34efe1 | ||
|
|
d642d76197 | ||
|
|
871aa709af | ||
|
|
3bc1b2daab | ||
|
|
2fa5a58ca3 | ||
|
|
ee281fd0c6 | ||
|
|
2e238b3708 | ||
|
|
2984035e1a | ||
|
|
b9f03772b5 | ||
|
|
e3ef0d30cf | ||
|
|
72c9a50773 | ||
|
|
8445567046 | ||
|
|
64dd5fdc00 | ||
|
|
a29f317af1 | ||
|
|
063f2a04d1 | ||
|
|
113f786989 | ||
|
|
eba2afeda1 | ||
|
|
1962ed95cc | ||
|
|
c2be6f7ef8 | ||
|
|
7a7f52388b | ||
|
|
9246d5c8a4 | ||
|
|
b3aea1bc26 | ||
|
|
e8c360ca4a | ||
|
|
bc8dd11952 | ||
|
|
57a691b7e7 | ||
|
|
74fa9417e5 | ||
|
|
636977b089 | ||
|
|
ee4450eb6f | ||
|
|
a43b3e5d8e | ||
|
|
81294aff98 | ||
|
|
a99c0a328f | ||
|
|
8f5add13ff | ||
|
|
8ff35d0a1b | ||
|
|
ba14476051 | ||
|
|
daaa89dbe5 | ||
|
|
25a7863d77 | ||
|
|
184c61ddce | ||
|
|
fd4650a556 | ||
|
|
3e88fbfa6e | ||
|
|
1123bed944 | ||
|
|
ebda165f3a | ||
|
|
fe7c20bf9e | ||
|
|
f4dab3d1ac | ||
|
|
24d5934daa | ||
|
|
d6c2782a90 | ||
|
|
50d2e9596f | ||
|
|
18e76955be | ||
|
|
d218ec9738 | ||
|
|
b8765fa082 | ||
|
|
1f032575bb | ||
|
|
1482975549 | ||
|
|
d45067a290 | ||
|
|
3086175489 | ||
|
|
e14d409b6f | ||
|
|
ec824e0f2a | ||
|
|
296f76068d | ||
|
|
2c384f1e6e | ||
|
|
d16ff5897f | ||
|
|
71669c3b76 | ||
|
|
60d1dd3d72 | ||
|
|
a82010503e | ||
|
|
6cc8959712 | ||
|
|
dd05b91f6b | ||
|
|
2a123f4c58 | ||
|
|
840a2c0592 | ||
|
|
35248820ea | ||
|
|
d770e63557 | ||
|
|
396311f0f6 | ||
|
|
316c8d9a18 | ||
|
|
8fcce8d50f | ||
|
|
6f1f6a0c82 | ||
|
|
66a07ce2f8 | ||
|
|
cc6fb517de | ||
|
|
f009f07c95 | ||
|
|
9fdec226ff | ||
|
|
d87cb3ae3c | ||
|
|
3e38c31a4b | ||
|
|
f4171ebd34 | ||
|
|
252a289cb3 | ||
|
|
fadddc260a | ||
|
|
23d2abc33c | ||
|
|
4f979ccbf1 | ||
|
|
37378f748a | ||
|
|
6a09d83e12 | ||
|
|
e477187bf4 | ||
|
|
80b865bdc8 | ||
|
|
04b0285701 | ||
|
|
39711101fd | ||
|
|
d99af4f0e8 | ||
|
|
7104368446 | ||
|
|
111bf5db8b | ||
|
|
24ca71c93b | ||
|
|
48ba5c0c86 | ||
|
|
8ae6704517 | ||
|
|
ed55931073 | ||
|
|
8fa2627942 | ||
|
|
6f5f3337d8 | ||
|
|
e7c418c58f | ||
|
|
7e47e27bd8 | ||
|
|
ae8159b9ca | ||
|
|
74e7ad6604 | ||
|
|
814442ba69 | ||
|
|
5f5bb10748 | ||
|
|
a24725cc6e | ||
|
|
38933cee85 | ||
|
|
6d3cfe5063 | ||
|
|
4bad23a15f | ||
|
|
6a5fe1328b | ||
|
|
bc8fcf4bd3 | ||
|
|
60b967be7e | ||
|
|
6dc3337774 | ||
|
|
f2c6ff15e5 | ||
|
|
6b8a162516 | ||
|
|
954c723acc | ||
|
|
607a39f9f0 | ||
|
|
df6fedcab1 | ||
|
|
f684d7e1a9 | ||
|
|
0df77d793c | ||
|
|
dafff9ce44 | ||
|
|
6644d9733d | ||
|
|
44bbfa33b8 | ||
|
|
3e3dff249f | ||
|
|
316dda716c | ||
|
|
219401b8b9 | ||
|
|
30d0053799 | ||
|
|
979742bc7e | ||
|
|
16c8f78513 | ||
|
|
3f1423e789 | ||
|
|
0341da6019 | ||
|
|
9f2f979bcf | ||
|
|
dd73313cba | ||
|
|
eaf01c25fe | ||
|
|
7a148da6dd | ||
|
|
21eee750b7 | ||
|
|
7b54b62682 | ||
|
|
9a945e2a24 | ||
|
|
4f4ea1b449 | ||
|
|
fe4ae21331 | ||
|
|
78b2b0a1a0 | ||
|
|
d14772c455 | ||
|
|
388f3cd0d1 | ||
|
|
11e4167a35 | ||
|
|
fa7eb63dec | ||
|
|
50b3a68db9 | ||
|
|
fbbfb6ab11 | ||
|
|
a19293cb75 | ||
|
|
d5c14e1e26 | ||
|
|
b75db69ac1 | ||
|
|
c311ced5d7 | ||
|
|
c8fd2ddf6d | ||
|
|
c50e5f4543 | ||
|
|
bb05e313eb | ||
|
|
f23bc65103 | ||
|
|
4c4ea9c7b5 | ||
|
|
92e9352ded | ||
|
|
f585c90505 | ||
|
|
5ff249072d | ||
|
|
0277eab701 | ||
|
|
4861b6c851 | ||
|
|
3100cdc7f9 | ||
|
|
ad73cc3312 | ||
|
|
4182262560 | ||
|
|
896f483d49 | ||
|
|
8c534b85f1 | ||
|
|
a846dd4b3a | ||
|
|
aa437b5890 | ||
|
|
b0f311f412 | ||
|
|
59b38922a1 | ||
|
|
0480665b9d | ||
|
|
bbeee1c4a3 | ||
|
|
e5ed2f6947 | ||
|
|
4a73746a04 | ||
|
|
382b500ebe | ||
|
|
3a82f8bb48 | ||
|
|
e3046431da | ||
|
|
bdb6090d83 | ||
|
|
b73b70ebca | ||
|
|
8a3f0a24b5 | ||
|
|
6f07c4e407 | ||
|
|
60d5e9cbd9 | ||
|
|
cd15c394cc | ||
|
|
bb6e299ccb | ||
|
|
85eb579ad9 | ||
|
|
47f88cc94e | ||
|
|
40b5739ff9 | ||
|
|
234d93464a | ||
|
|
0c0eab527f | ||
|
|
44d4884779 | ||
|
|
10955cda06 | ||
|
|
f315b508ae | ||
|
|
9e4e6ddfbf | ||
|
|
5037aa9a7b | ||
|
|
8a952d20d1 | ||
|
|
b29b77fee2 | ||
|
|
be0d45555e | ||
|
|
d74b9a1d1a | ||
|
|
35de6d4bac | ||
|
|
ce55ed0389 | ||
|
|
f70ab525f9 | ||
|
|
9b70860ecc | ||
|
|
095588ef34 | ||
|
|
2dbda2215c | ||
|
|
53cc63bf85 | ||
|
|
471b2683e7 | ||
|
|
8ddf84bfb8 | ||
|
|
fd0df6d098 | ||
|
|
69ca97c820 | ||
|
|
eec893ae49 | ||
|
|
621e167fd6 | ||
|
|
d54f647a4a | ||
|
|
c8a0f1b229 | ||
|
|
726409a513 | ||
|
|
422e6e886c | ||
|
|
af1faca3f8 | ||
|
|
469021b4b3 | ||
|
|
83c256ba42 | ||
|
|
b67422d33d | ||
|
|
827d87e9d6 | ||
|
|
8f236c1419 | ||
|
|
2d76b4d81e | ||
|
|
4f9541226c | ||
|
|
b1f742c103 | ||
|
|
16ef26fd3a | ||
|
|
cf8c80ff77 | ||
|
|
5c7206e45e | ||
|
|
fc3f2b72cd | ||
|
|
34b2003def | ||
|
|
7e90f5ad25 | ||
|
|
ab4f15013a | ||
|
|
1e4b358720 | ||
|
|
9208367d3f | ||
|
|
67b9b7afd7 | ||
|
|
c2b70d0981 | ||
|
|
bee1b5ce3f | ||
|
|
07e3b04742 | ||
|
|
ebd289335a | ||
|
|
d2f7902af0 | ||
|
|
1005bed722 | ||
|
|
d6c92cdc34 | ||
|
|
61e1b9a49d | ||
|
|
c98dd165b0 | ||
|
|
ff1c277ef8 | ||
|
|
c8f7614b98 | ||
|
|
246a434f61 | ||
|
|
5c066a81c2 | ||
|
|
78f961efe9 | ||
|
|
09bc0a577d | ||
|
|
b700a427d2 | ||
|
|
4480b95dcd | ||
|
|
e77c81f6f8 | ||
|
|
971dbee521 | ||
|
|
6f2e82be3a | ||
|
|
9eec9699b9 | ||
|
|
5ae5c54c7e | ||
|
|
7b04fe6c9e | ||
|
|
e67566ce0a | ||
|
|
f93ddcfd1c | ||
|
|
1bba40f578 | ||
|
|
f65e14dc3a | ||
|
|
14a94bba6f | ||
|
|
8109c5d4e2 | ||
|
|
a92b5cb8d8 | ||
|
|
4a23e2fe29 | ||
|
|
a3ba74104e | ||
|
|
e1c22419ac | ||
|
|
189090cee9 | ||
|
|
1a5b7b404f | ||
|
|
9cf12b20af | ||
|
|
63a45330cb | ||
|
|
4a0aaad022 | ||
|
|
095bb1bfa5 | ||
|
|
3937bd962b | ||
|
|
ddb3efc906 | ||
|
|
4e42521d8c | ||
|
|
054efe541f | ||
|
|
a0e1befb57 | ||
|
|
c36c73f681 | ||
|
|
6f4a19f59f | ||
|
|
0d8f04cd83 | ||
|
|
4906052019 | ||
|
|
c6a823e267 | ||
|
|
b7f9aedfac | ||
|
|
7dd0a30361 | ||
|
|
ca120e31f2 | ||
|
|
48eb35cd78 | ||
|
|
7f20dbbcd2 | ||
|
|
55e706c918 | ||
|
|
4e7d433dfb | ||
|
|
7d44ff7de6 | ||
|
|
a8c3e5e3c7 | ||
|
|
4402db3ecc | ||
|
|
7960d3e182 | ||
|
|
8a07b55a04 | ||
|
|
d53f4900d7 | ||
|
|
d3def58c52 | ||
|
|
96fa2d9d02 | ||
|
|
2d6a38fbf7 | ||
|
|
bb2b275b7d | ||
|
|
45bf8b3a75 | ||
|
|
60870be86c | ||
|
|
39ff43c579 | ||
|
|
1bbb796799 | ||
|
|
74e632fea8 | ||
|
|
efb8de492a | ||
|
|
a1f00cc557 | ||
|
|
421db3da06 | ||
|
|
b7526e7806 | ||
|
|
b40ce65180 | ||
|
|
1e8e2e78a5 | ||
|
|
4d5b72cdb4 | ||
|
|
35c2851cc1 | ||
|
|
ea7c1a7d90 | ||
|
|
96adefdb12 | ||
|
|
5e3cb8a747 | ||
|
|
3bf4088b8b | ||
|
|
256ee7ac6a | ||
|
|
f8b4c3b6b3 | ||
|
|
4bf703206d | ||
|
|
a284320e1e | ||
|
|
2df8f43d3e | ||
|
|
6f1bc8bc0f | ||
|
|
04f39f6df8 | ||
|
|
35d4761ce2 | ||
|
|
33d02a42d6 | ||
|
|
7bbb60cfbd | ||
|
|
da93d6753b | ||
|
|
59c943ecf6 | ||
|
|
4336b5d85e | ||
|
|
44ce3a93b6 | ||
|
|
7d400406a7 | ||
|
|
77dae919b6 | ||
|
|
0ab8e025c1 | ||
|
|
b80c2d6d4b | ||
|
|
6aa6077bcc | ||
|
|
66c00cb159 | ||
|
|
3a129dba59 | ||
|
|
8df6eff6da | ||
|
|
889ebe922b | ||
|
|
d4d55b29e0 | ||
|
|
55e2c84fe3 | ||
|
|
15a463d742 | ||
|
|
cd46aa6cef | ||
|
|
9ef81064a3 | ||
|
|
11a7793221 | ||
|
|
080603f0b0 | ||
|
|
4f84ae0ec8 | ||
|
|
ab4366fd49 | ||
|
|
e6a6182d95 | ||
|
|
1a454efe89 | ||
|
|
deaa7052c5 | ||
|
|
7b5d51d837 | ||
|
|
593865b907 | ||
|
|
31c0cd4362 | ||
|
|
c2fdb33116 | ||
|
|
9e18dfe277 | ||
|
|
59ba9d147f | ||
|
|
23012db921 | ||
|
|
6fcec43954 | ||
|
|
a9f25a0819 | ||
|
|
c7995256e4 | ||
|
|
e1aa5b6620 | ||
|
|
da5ed5cf6b | ||
|
|
5757a93e01 | ||
|
|
deca601915 | ||
|
|
a5986276ec | ||
|
|
da45f43ce3 | ||
|
|
0de172a0c0 | ||
|
|
20aea9492f | ||
|
|
1326b9ae2a | ||
|
|
1fe26ab4a0 | ||
|
|
83e9c273e5 | ||
|
|
ec525c18e1 | ||
|
|
93fcc7ad73 | ||
|
|
1d912bd3c9 | ||
|
|
57ffe93485 | ||
|
|
5da5517288 | ||
|
|
2312f06c30 | ||
|
|
2416415c53 | ||
|
|
e6050a683c | ||
|
|
da7703286a | ||
|
|
f02e6b5675 | ||
|
|
035a26c16a | ||
|
|
bc8a6137b2 | ||
|
|
6fe506b04b | ||
|
|
81a2e438dc | ||
|
|
9b45c0733e | ||
|
|
11b2a9b70b | ||
|
|
d743d22de6 | ||
|
|
11da14b548 | ||
|
|
2bdd07195c | ||
|
|
5e77d9cfc1 | ||
|
|
7d5116251d | ||
|
|
81023dbdbd | ||
|
|
b2e9294fb9 | ||
|
|
16a22c3851 | ||
|
|
c9cd02c965 | ||
|
|
8149861554 | ||
|
|
ea57de18f8 | ||
|
|
d0d1e3dacb | ||
|
|
3809f0163b | ||
|
|
46d8a2033b | ||
|
|
c773faf05e | ||
|
|
513eeb61dd | ||
|
|
bc379c1aa1 | ||
|
|
286551b4eb | ||
|
|
16057d6bbb | ||
|
|
f649a6a8fd | ||
|
|
ef28ee8bc1 | ||
|
|
300f48c532 | ||
|
|
2d357558fb | ||
|
|
0c62a5b28e | ||
|
|
b0720b4988 | ||
|
|
d5bab2c0e1 | ||
|
|
3ea0ccb319 | ||
|
|
08772054e9 | ||
|
|
1dcb27157d | ||
|
|
61c22fdf36 | ||
|
|
431e57a797 | ||
|
|
b521bb816d | ||
|
|
7d06b24eac | ||
|
|
3bbeade41d | ||
|
|
ba82db7a0d | ||
|
|
801564c804 | ||
|
|
ac8cac1dac | ||
|
|
4b85f1228a | ||
|
|
c35fcdc0b7 | ||
|
|
15decd26cc | ||
|
|
9c6482b8d6 | ||
|
|
41f26e0ebc | ||
|
|
2def66169e | ||
|
|
9e34a34e44 | ||
|
|
5ccaf90415 | ||
|
|
44a387e0ea | ||
|
|
a388e25576 | ||
|
|
a1ef7718c9 | ||
|
|
65ddb30016 | ||
|
|
31747dd521 | ||
|
|
6a74c4dfff | ||
|
|
394c3e0ac2 | ||
|
|
60d31116c2 | ||
|
|
8445b0115f | ||
|
|
8506a64149 | ||
|
|
66acd9d64c | ||
|
|
348d05359c | ||
|
|
0d2d30bb39 | ||
|
|
631187be8c | ||
|
|
e756ec8284 | ||
|
|
87d62d7d29 | ||
|
|
5460cfeba8 | ||
|
|
8997730612 | ||
|
|
3617c59bab | ||
|
|
881c6a1049 | ||
|
|
2024ade285 | ||
|
|
674ad4f6bc | ||
|
|
5b99970eb7 | ||
|
|
80cfd940cc | ||
|
|
3c2304d55f | ||
|
|
5645cc7995 | ||
|
|
33690255c5 | ||
|
|
c61471fc8b | ||
|
|
54da019fdb | ||
|
|
28668d808e | ||
|
|
9612ebc00e | ||
|
|
1a46a3a4b3 | ||
|
|
2df1255117 | ||
|
|
3c98038174 | ||
|
|
800f63d38f | ||
|
|
5620eb5332 | ||
|
|
9f8acdaa5d | ||
|
|
2dc1eb6cbf | ||
|
|
b9563c9451 | ||
|
|
d6d8e9a93e | ||
|
|
d06de6c871 | ||
|
|
6af7d49b92 | ||
|
|
bcfa6d72e3 | ||
|
|
dd7f792c85 | ||
|
|
d061fda7e9 | ||
|
|
4db2250000 | ||
|
|
c6b755df45 | ||
|
|
e2a6810069 | ||
|
|
c4f11a2a99 | ||
|
|
e0a7bffa1e | ||
|
|
38b864eaa1 | ||
|
|
12359faff0 | ||
|
|
9fdc64a927 | ||
|
|
665c575b2a | ||
|
|
47dcf7b176 | ||
|
|
d59849b2e7 | ||
|
|
7a3f4a18d1 | ||
|
|
7f084087b2 | ||
|
|
d5524ca87b | ||
|
|
390cd7ca90 | ||
|
|
60375a88fe | ||
|
|
dd07e0c4cf | ||
|
|
9d3ae8ecbb | ||
|
|
d1307d873a | ||
|
|
c12936c5d1 | ||
|
|
cdc17f60dc | ||
|
|
b35ec29927 | ||
|
|
05f3a0d754 | ||
|
|
c966a489cf | ||
|
|
bb0c57ecd2 | ||
|
|
24f4e57c46 | ||
|
|
ac319fbc90 | ||
|
|
4bfe934cd1 | ||
|
|
40a5bfde36 | ||
|
|
a67c755ef1 | ||
|
|
87a04a2df6 | ||
|
|
c03995d297 | ||
|
|
ec0ebb3fc2 | ||
|
|
6ab537e324 | ||
|
|
e6c368d468 | ||
|
|
4f1cfd22d3 | ||
|
|
6d5a4ceefe | ||
|
|
f06c2172c0 | ||
|
|
7cb24eb5ff | ||
|
|
f30c692c1f | ||
|
|
8b66bb5d8d | ||
|
|
5d17fd0fec | ||
|
|
ac35a0f792 | ||
|
|
3ee0869734 | ||
|
|
70bb6c855e | ||
|
|
c7f34744c6 | ||
|
|
3f63b4d89f | ||
|
|
dac6ce73be | ||
|
|
5701750c2c | ||
|
|
9e236169e9 | ||
|
|
339eacce1b | ||
|
|
810f991b9e | ||
|
|
386571a24b | ||
|
|
3fe63754d2 | ||
|
|
76681e714e | ||
|
|
46522fb7bd | ||
|
|
e7d09ac4f7 | ||
|
|
67508925d0 | ||
|
|
0c62124eb5 | ||
|
|
9b5d4eed31 | ||
|
|
79054c1d1e | ||
|
|
44d47bbe6f | ||
|
|
323de05ba2 | ||
|
|
5a01722ebc | ||
|
|
1106c3f072 | ||
|
|
bed78ef4e6 | ||
|
|
0ee5cdfe9f | ||
|
|
a1dcc2cb98 | ||
|
|
ee7fb780c8 | ||
|
|
5ade4a4248 | ||
|
|
6cd660435e | ||
|
|
090d7c81cf | ||
|
|
48145ea358 | ||
|
|
dd614590c9 | ||
|
|
a86865891a | ||
|
|
fb9f12a02d | ||
|
|
e25f8e1f37 | ||
|
|
4685200fa9 | ||
|
|
1397f0b520 | ||
|
|
8b3e6eb6b6 | ||
|
|
a0c9d5c6d9 | ||
|
|
5cf9459c08 | ||
|
|
e7b66a28de | ||
|
|
203f53fbbe | ||
|
|
02663ee9d9 | ||
|
|
f169f65e75 | ||
|
|
2855a0fcce | ||
|
|
bf0f3a8c3e | ||
|
|
cb72aa1809 | ||
|
|
896f913571 | ||
|
|
89295a0628 | ||
|
|
eb03ede014 | ||
|
|
8fbe5c7df7 | ||
|
|
e54b8f536b | ||
|
|
fa9b3dcae2 | ||
|
|
9a021c5580 | ||
|
|
80e8b13ac4 | ||
|
|
b61599aca4 | ||
|
|
a602dc5425 | ||
|
|
93c120754a | ||
|
|
1ca4b75ec2 | ||
|
|
329550c4a9 | ||
|
|
00bfa988fc | ||
|
|
81afc5cce6 | ||
|
|
cb3c4a4722 | ||
|
|
954f7bf5ec | ||
|
|
526d3d25e2 | ||
|
|
74124c344c | ||
|
|
5177391ebe | ||
|
|
64db14b0cb | ||
|
|
effe203677 | ||
|
|
82591fa6e7 | ||
|
|
11d81fc6d1 | ||
|
|
30fd7198fe | ||
|
|
8d179dae4e | ||
|
|
e11cb7268e | ||
|
|
3bc9c8cfc8 | ||
|
|
c430e00b80 | ||
|
|
cf8d6bbd9e | ||
|
|
8b46b0ea36 | ||
|
|
442b86de32 | ||
|
|
04dea7e6c2 | ||
|
|
a8f15bceea | ||
|
|
a60dae7e4e | ||
|
|
891b713be3 | ||
|
|
cf880639f6 | ||
|
|
03dcac7f76 | ||
|
|
c81acb7ff3 | ||
|
|
c1bee64676 | ||
|
|
f37bf9c778 | ||
|
|
4021132be2 | ||
|
|
67811a6fd4 |
No files matched your search
+47
-20
@@ -11,8 +11,9 @@ ahci_test
|
||||
ascii.bitmaps
|
||||
ascii.h
|
||||
autom4te.cache
|
||||
build_env.mk
|
||||
.bzrignore
|
||||
build-grub-gen-asciih
|
||||
build-grub-gen-widthspec
|
||||
build-grub-mkfont
|
||||
cdboot_test
|
||||
cmp_test
|
||||
config.cache
|
||||
@@ -30,47 +31,63 @@ docs/*.info
|
||||
docs/stamp-vti
|
||||
docs/version.texi
|
||||
ehci_test
|
||||
*.elf
|
||||
example_grub_script_test
|
||||
example_scripted_test
|
||||
example_unit_test
|
||||
*.exec
|
||||
*.exec.exe
|
||||
fddboot_test
|
||||
genkernsyms.sh
|
||||
gensymlist.sh
|
||||
gentrigtables
|
||||
gentrigtables.exe
|
||||
gettext_strings_test
|
||||
grub-bin2h
|
||||
grub-bios-setup
|
||||
/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
|
||||
/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-mk*
|
||||
/grub-menulst2cfg
|
||||
/grub-menulst2cfg.exe
|
||||
/grub-mk*
|
||||
grub-mount
|
||||
grub-ofpathname
|
||||
grub-pe2elf
|
||||
grub-probe
|
||||
/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-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
|
||||
@@ -101,17 +118,20 @@ grub_script.tab.h
|
||||
grub_script.yy.c
|
||||
grub_script.yy.h
|
||||
grub-set-default
|
||||
grub-setup
|
||||
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.exe
|
||||
include/grub/cpu
|
||||
include/grub/machine
|
||||
install-sh
|
||||
@@ -127,6 +147,7 @@ mod-*.c
|
||||
missing
|
||||
netboot_test
|
||||
*.o
|
||||
*.a
|
||||
ohci_test
|
||||
partmap_test
|
||||
pata_test
|
||||
@@ -155,16 +176,15 @@ GPATH
|
||||
GRTAGS
|
||||
GSYMS
|
||||
GTAGS
|
||||
Makefile.tpl
|
||||
compile
|
||||
depcomp
|
||||
mdate-sh
|
||||
texinfo.tex
|
||||
grub-core/lib/libgcrypt-grub
|
||||
**/.deps
|
||||
**/.deps-util
|
||||
**/.deps-core
|
||||
**/.dirstamp
|
||||
.deps
|
||||
.deps-util
|
||||
.deps-core
|
||||
.dirstamp
|
||||
Makefile.util.am
|
||||
contrib
|
||||
grub-core/bootinfo.txt
|
||||
@@ -178,7 +198,9 @@ 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
|
||||
@@ -199,7 +221,7 @@ 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.S
|
||||
grub-core/rs_decoder.h
|
||||
widthspec.bin
|
||||
widthspec.h
|
||||
docs/stamp-1
|
||||
@@ -213,9 +235,14 @@ include/grub/gcrypt/gcrypt.h
|
||||
include/grub/gcrypt/g10lib.h
|
||||
po/POTFILES.in
|
||||
po/POTFILES-shell.in
|
||||
grub-glue-efi
|
||||
grub-render-label
|
||||
/grub-glue-efi
|
||||
/grub-render-label
|
||||
/grub-glue-efi.exe
|
||||
/grub-render-label.exe
|
||||
grub-core/gnulib/locale.h
|
||||
grub-core/gnulib/unitypes.h
|
||||
grub-core/gnulib/uniwidth.h
|
||||
build-aux/test-driver
|
||||
/garbage-gen
|
||||
/garbage-gen.exe
|
||||
/grub-fs-tester
|
||||
@@ -12,12 +12,30 @@ you don't have any of them, please obtain and install them before
|
||||
configuring the GRUB.
|
||||
|
||||
* GCC 4.1.3 or later
|
||||
Note: older versions may work but support is limited
|
||||
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
|
||||
None of tested clang versions generated usable thumb code
|
||||
earlier versions not tested
|
||||
Note: clang 3.3 or later works for arm64
|
||||
earlier versions have no arm64 support
|
||||
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 doesn't support -mno-app-regs and so can't be used for sparc64
|
||||
Note: clang has no support for ia64 and hence you can't compile GRUB
|
||||
for ia64 with clang
|
||||
* GNU Make
|
||||
* GNU Bison 2.3 or later
|
||||
* GNU gettext 0.17 or later
|
||||
* GNU binutils 2.9.1.0.23 or later
|
||||
* Flex 2.5.35 or later
|
||||
* Other standard GNU/Unix tools
|
||||
* a libc with large file support (e.g. glibc 2.1 or later)
|
||||
|
||||
On GNU/Linux, you also need:
|
||||
|
||||
@@ -37,10 +55,9 @@ To build GRUB's graphical terminal (gfxterm), you need:
|
||||
If you use a development snapshot or want to hack on GRUB you may
|
||||
need the following.
|
||||
|
||||
* Python 2.5.2 or later
|
||||
* Python 2.6 or later
|
||||
* Autoconf 2.60 or later
|
||||
* Automake 1.10.1 or later
|
||||
* Autogen 5.10 or later
|
||||
|
||||
Prerequisites for make-check:
|
||||
|
||||
@@ -124,7 +141,7 @@ If build and host are different make check isn't available.
|
||||
If build and host are different man pages are not generated.
|
||||
|
||||
As an example imagine you have a build system running on FreeBSD on sparc
|
||||
which prepares packages for developpers running amd64 GNU/Linux laptop and
|
||||
which prepares packages for developers running amd64 GNU/Linux laptop and
|
||||
they need to make images for ARM board running U-boot. In this case:
|
||||
|
||||
build=sparc64-freebsd
|
||||
@@ -133,7 +150,7 @@ target=arm-uboot
|
||||
|
||||
For this example the configure line might look like (more details below)
|
||||
(some options are optional and included here for completeness but some rarely
|
||||
used options are omited):
|
||||
used options are omitted):
|
||||
|
||||
./configure BUILD_CC=gcc BUILD_FREETYPE=freetype-config --host=amd64-linux-gnu
|
||||
CC=amd64-linux-gnu-gcc CFLAGS="-g -O2" FREETYPE=amd64-linux-gnu-freetype-config
|
||||
@@ -152,7 +169,8 @@ corresponding platform are not needed for the platform in question.
|
||||
generate sin and cos tables.
|
||||
2. BUILD_CFLAGS= for C options for build.
|
||||
3. BUILD_CPPFLAGS= for C preprocessor options for build.
|
||||
4. BUILD_FREETYPE= for freetype-config for build (optional).
|
||||
4. BUILD_LDFLAGS= for linker options for build.
|
||||
5. BUILD_FREETYPE= for freetype-config for build (optional).
|
||||
|
||||
- For host
|
||||
1. --host= to autoconf name of host.
|
||||
@@ -180,9 +198,9 @@ corresponding platform are not needed for the platform in question.
|
||||
11. TARGET_RANLIB= for ranlib for target.
|
||||
|
||||
- Additionally for emu, for host and target.
|
||||
1. SDL is looked for in stadard linker directories (-lSDL) (optional)
|
||||
2. libpciaccess is looked for in stadard linker directories (-lpciaccess) (optional)
|
||||
3. libusb is looked for in stadard linker directories (-lusb) (optional)
|
||||
1. SDL is looked for in standard linker directories (-lSDL) (optional)
|
||||
2. libpciaccess is looked for in standard linker directories (-lpciaccess) (optional)
|
||||
3. libusb is looked for in standard linker directories (-lusb) (optional)
|
||||
|
||||
- Platform-agnostic tools and data.
|
||||
1. make is the tool you execute after ./configure.
|
||||
|
||||
+65
-16
@@ -1,7 +1,11 @@
|
||||
AUTOMAKE_OPTIONS = subdir-objects -Wno-portability
|
||||
|
||||
DEPDIR = .deps-util
|
||||
SUBDIRS = grub-core/gnulib . grub-core po docs util/bash-completion.d
|
||||
SUBDIRS = grub-core/gnulib .
|
||||
if COND_real_platform
|
||||
SUBDIRS += grub-core
|
||||
endif
|
||||
SUBDIRS += po docs util/bash-completion.d
|
||||
|
||||
include $(top_srcdir)/conf/Makefile.common
|
||||
include $(top_srcdir)/conf/Makefile.extra-dist
|
||||
@@ -66,14 +70,22 @@ 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
|
||||
|
||||
build-grub-mkfont: 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) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-mkfont\" $^ $(build_freetype_cflags) $(build_freetype_libs)
|
||||
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)
|
||||
CLEANFILES += build-grub-mkfont$(BUILD_EXEEXT)
|
||||
|
||||
build-grub-gen-asciih: util/grub-gen-asciih.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
||||
garbage-gen$(BUILD_EXEEXT): util/garbage-gen.c
|
||||
$(BUILD_CC) -o $@ $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $^
|
||||
CLEANFILES += garbage-gen$(BUILD_EXEEXT)
|
||||
EXTRA_DIST += util/garbage-gen.c
|
||||
|
||||
build-grub-gen-widthspec: util/grub-gen-widthspec.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_MKFONT=1 -DGRUB_BUILD=1 -DGRUB_UTIL=1 $^ $(build_freetype_cflags) $(build_freetype_libs) -Wall -Werror
|
||||
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
|
||||
CLEANFILES += build-grub-gen-asciih$(BUILD_EXEEXT)
|
||||
|
||||
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
|
||||
CLEANFILES += build-grub-gen-widthspec$(BUILD_EXEEXT)
|
||||
|
||||
if COND_STARFIELD
|
||||
starfield_DATA = dejavu_10.pf2 dejavu_12.pf2 dejavu_bold_14.pf2 dejavu_14.pf2 dejavu_16.pf2 $(starfield_theme_files)
|
||||
@@ -88,14 +100,14 @@ dejavu_bold_14.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
|
||||
dejavu_16.pf2: $(DJVU_FONT_SOURCE) build-grub-mkfont
|
||||
./build-grub-mkfont -s 16 -o $@ $(DJVU_FONT_SOURCE)
|
||||
else
|
||||
starfield_DATA =
|
||||
starfield_DATA =
|
||||
endif
|
||||
|
||||
EXTRA_DIST += $(starfield_theme_files)
|
||||
EXTRA_DIST += $(srcdir)/themes/starfield/src/slider_s.xcf $(srcdir)/themes/starfield/src/slider_n.xcf $(srcdir)/themes/starfield/src/slider_c.xcf $(srcdir)/themes/starfield/src/blob_nw.xcf $(srcdir)/themes/starfield/src/bootmenu/center.xcf $(srcdir)/themes/starfield/src/bootmenu/corner.xcf $(srcdir)/themes/starfield/src/bootmenu/side.xcf $(srcdir)/themes/starfield/src/terminalbox/side.xcf $(srcdir)/themes/starfield/src/terminalbox/corner.xcf $(srcdir)/themes/starfield/src/terminalbox/center.xcf
|
||||
|
||||
unicode.pf2: $(FONT_SOURCE) build-grub-mkfont
|
||||
./build-grub-mkfont -o $@ $(FONT_SOURCE)
|
||||
./build-grub-mkfont -o $@ $(FONT_SOURCE) || (rm -f $@; exit 1)
|
||||
CLEANFILES += unicode.pf2
|
||||
|
||||
# Arrows and lines are needed to draw the menu, so always include them
|
||||
@@ -103,27 +115,29 @@ UNICODE_ARROWS=0x2190-0x2193
|
||||
UNICODE_LINES=0x2501-0x251B
|
||||
|
||||
ascii.pf2: $(FONT_SOURCE) build-grub-mkfont
|
||||
./build-grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES)
|
||||
./build-grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x7f,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1)
|
||||
CLEANFILES += ascii.pf2
|
||||
|
||||
euro.pf2: $(FONT_SOURCE) build-grub-mkfont
|
||||
./build-grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x4ff,0x1e00-0x1fff,$(UNICODE_ARROWS),$(UNICODE_LINES)
|
||||
./build-grub-mkfont -o $@ $(FONT_SOURCE) -r 0x0-0x4ff,0x1e00-0x1fff,$(UNICODE_ARROWS),$(UNICODE_LINES) || (rm -f $@; exit 1)
|
||||
CLEANFILES += euro.pf2
|
||||
|
||||
ascii.h: $(FONT_SOURCE) build-grub-gen-asciih
|
||||
./build-grub-gen-asciih $(FONT_SOURCE) $@
|
||||
./build-grub-gen-asciih $(FONT_SOURCE) $@ || (rm -f $@; exit 1)
|
||||
CLEANFILES += ascii.h
|
||||
|
||||
widthspec.h: $(FONT_SOURCE) build-grub-gen-widthspec
|
||||
./build-grub-gen-widthspec $(FONT_SOURCE) $@
|
||||
./build-grub-gen-widthspec $(FONT_SOURCE) $@ || (rm -f $@; exit 1)
|
||||
CLEANFILES += widthspec.h
|
||||
|
||||
# Install config.h into platformdir
|
||||
platform_HEADERS = config.h
|
||||
nodist_platform_HEADERS = config.h
|
||||
|
||||
pkgdata_DATA += grub-mkconfig_lib
|
||||
|
||||
|
||||
if COND_real_platform
|
||||
|
||||
if COND_i386_coreboot
|
||||
QEMU32=qemu-system-i386
|
||||
endif
|
||||
@@ -375,8 +389,6 @@ if COND_powerpc_ieee1275
|
||||
BOOTCHECKS = bootcheck-linux-ppc
|
||||
endif
|
||||
|
||||
EXTRA_DIST += grub-core/tests/boot/kbsd.init-i386.S grub-core/tests/boot/kbsd.init-x86_64.S grub-core/tests/boot/kbsd.spec.txt grub-core/tests/boot/kernel-8086.S grub-core/tests/boot/kernel-i386.S grub-core/tests/boot/kfreebsd-aout.cfg grub-core/tests/boot/kfreebsd.cfg grub-core/tests/boot/kfreebsd.init-i386.S grub-core/tests/boot/kfreebsd.init-x86_64.S grub-core/tests/boot/knetbsd.cfg grub-core/tests/boot/kopenbsd.cfg grub-core/tests/boot/kopenbsdlabel.txt grub-core/tests/boot/linux16.cfg grub-core/tests/boot/linux.cfg grub-core/tests/boot/linux.init-i386.S grub-core/tests/boot/linux.init-mips.S grub-core/tests/boot/linux.init-ppc.S grub-core/tests/boot/linux.init-x86_64.S grub-core/tests/boot/linux-ppc.cfg grub-core/tests/boot/multiboot2.cfg grub-core/tests/boot/multiboot.cfg grub-core/tests/boot/ntldr.cfg grub-core/tests/boot/pc-chainloader.cfg grub-core/tests/boot/qemu-shutdown-x86.S
|
||||
|
||||
.PHONY: bootcheck-linux-i386 bootcheck-linux-x86_64 \
|
||||
bootcheck-kfreebsd-i386 bootcheck-kfreebsd-x86_64 \
|
||||
bootcheck-knetbsd-i386 bootcheck-knetbsd-x86_64 \
|
||||
@@ -389,4 +401,41 @@ BOOTCHECK_TIMEOUT=180
|
||||
|
||||
bootcheck: $(BOOTCHECKS)
|
||||
|
||||
if COND_i386_coreboot
|
||||
default_payload.elf: grub-mkstandalone grub-mkimage
|
||||
pkgdatadir=. ./grub-mkstandalone --grub-mkimage=./grub-mkimage -O i386-coreboot -o $@ --modules='ahci pata ehci uhci ohci usb_keyboard usbms part_msdos xfs 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' --fonts= --themes= --locales= -d grub-core/ /boot/grub/grub.cfg=$(srcdir)/coreboot.cfg
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
EXTRA_DIST += grub-core/tests/boot/kbsd.init-i386.S grub-core/tests/boot/kbsd.init-x86_64.S grub-core/tests/boot/kbsd.spec.txt grub-core/tests/boot/kernel-8086.S grub-core/tests/boot/kernel-i386.S grub-core/tests/boot/kfreebsd-aout.cfg grub-core/tests/boot/kfreebsd.cfg grub-core/tests/boot/kfreebsd.init-i386.S grub-core/tests/boot/kfreebsd.init-x86_64.S grub-core/tests/boot/knetbsd.cfg grub-core/tests/boot/kopenbsd.cfg grub-core/tests/boot/kopenbsdlabel.txt grub-core/tests/boot/linux16.cfg grub-core/tests/boot/linux.cfg grub-core/tests/boot/linux.init-i386.S grub-core/tests/boot/linux.init-mips.S grub-core/tests/boot/linux.init-ppc.S grub-core/tests/boot/linux.init-x86_64.S grub-core/tests/boot/linux-ppc.cfg grub-core/tests/boot/multiboot2.cfg grub-core/tests/boot/multiboot.cfg grub-core/tests/boot/ntldr.cfg grub-core/tests/boot/pc-chainloader.cfg grub-core/tests/boot/qemu-shutdown-x86.S
|
||||
|
||||
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||
test -d $(windowsdir) && rm -rf $(windowsdir) || true
|
||||
test -d $(windowsdir) || mkdir $(windowsdir)
|
||||
$(MAKE) -C po $(AM_MAKEFLAGS) windowsdir
|
||||
$(MAKE) -C grub-core $(AM_MAKEFLAGS) windowsdir
|
||||
test -d $(windowsdir)/themes || mkdir $(windowsdir)/themes
|
||||
test -d $(windowsdir)/themes/starfield || mkdir $(windowsdir)/themes/starfield
|
||||
for x in $(PROGRAMS); do \
|
||||
if [ x$(STRIP) != x ]; then $(STRIP) $$x -o $(windowsdir)/$$x; \
|
||||
else cp -fp $$x $(windowsdir)/$$x; fi; \
|
||||
done
|
||||
for x in $(pkgdata_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/$$x; \
|
||||
done
|
||||
for x in $(starfield_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/themes/starfield/$$(basename $$x); \
|
||||
done
|
||||
for x in $(GRUB_WINDOWS_EXTRA_DIST); do \
|
||||
cp -fp $$x $(windowsdir); \
|
||||
done
|
||||
|
||||
windowszip=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows.zip
|
||||
windowszip: windowsdir
|
||||
test -f $(windowszip) && rm $(windowszip) || true
|
||||
zip -r $(windowszip) $(windowsdir)
|
||||
rm -rf $(windowsdir)
|
||||
|
||||
EXTRA_DIST += linguas.sh
|
||||
+339
-17
@@ -9,11 +9,13 @@ library = {
|
||||
common = grub-core/kern/command.c;
|
||||
common = grub-core/kern/device.c;
|
||||
common = grub-core/kern/disk.c;
|
||||
common = grub-core/lib/disk.c;
|
||||
common = util/getroot.c;
|
||||
common = grub-core/osdep/unix/getroot.c;
|
||||
common = grub-core/osdep/getroot.c;
|
||||
common = grub-core/osdep/devmapper/getroot.c;
|
||||
common = grub-core/osdep/relpath.c;
|
||||
extra_dist = grub-core/kern/disk_common.c;
|
||||
extra_dist = grub-core/osdep/unix/relpath.c;
|
||||
extra_dist = grub-core/osdep/aros/relpath.c;
|
||||
extra_dist = grub-core/osdep/windows/relpath.c;
|
||||
@@ -60,6 +62,7 @@ library = {
|
||||
common_nodist = grub_script.tab.h;
|
||||
|
||||
common = grub-core/commands/blocklist.c;
|
||||
common = grub-core/commands/macbless.c;
|
||||
common = grub-core/commands/xnu_uuid.c;
|
||||
common = grub-core/commands/testload.c;
|
||||
common = grub-core/commands/ls.c;
|
||||
@@ -152,8 +155,11 @@ library = {
|
||||
common = grub-core/script/script.c;
|
||||
common = grub-core/script/argv.c;
|
||||
common = grub-core/io/gzio.c;
|
||||
common = grub-core/io/xzio.c;
|
||||
common = grub-core/io/lzopio.c;
|
||||
common = grub-core/kern/ia64/dl_helper.c;
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
common = grub-core/kern/arm64/dl_helper.c;
|
||||
common = grub-core/lib/minilzo/minilzo.c;
|
||||
common = grub-core/lib/xzembed/xz_dec_bcj.c;
|
||||
common = grub-core/lib/xzembed/xz_dec_lzma2.c;
|
||||
@@ -169,8 +175,11 @@ program = {
|
||||
common = util/resolve.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
common = grub-core/kern/arm/dl_helper.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
extra_dist = grub-core/osdep/aros/config.c;
|
||||
extra_dist = grub-core/osdep/windows/config.c;
|
||||
extra_dist = grub-core/osdep/unix/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
extra_dist = util/grub-mkimagexx.c;
|
||||
|
||||
@@ -248,7 +257,7 @@ program = {
|
||||
name = grub-macho2img;
|
||||
mansection = 1;
|
||||
common = util/grub-macho2img.c;
|
||||
condition = COND_APPLE_CC;
|
||||
condition = COND_APPLE_LINKER;
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -308,6 +317,7 @@ program = {
|
||||
installdir = sbin;
|
||||
mansection = 8;
|
||||
common = util/grub-probe.c;
|
||||
common = util/probe.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
@@ -374,7 +384,7 @@ program = {
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBGEOM)';
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
@@ -392,6 +402,21 @@ program = {
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
name = grub-macbless;
|
||||
installdir = sbin;
|
||||
mansection = 8;
|
||||
common = util/grub-macbless.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
data = {
|
||||
common = util/grub.d/README;
|
||||
installdir = grubconf;
|
||||
@@ -477,38 +502,161 @@ script = {
|
||||
installdir = grubconf;
|
||||
};
|
||||
|
||||
script = {
|
||||
program = {
|
||||
mansection = 1;
|
||||
name = grub-mkrescue;
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mkrescue.in;
|
||||
enable = noemu;
|
||||
|
||||
common = util/grub-mkrescue.c;
|
||||
common = util/render-label.c;
|
||||
common = util/glue-efi.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.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/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
|
||||
condition = COND_HAVE_EXEC;
|
||||
};
|
||||
|
||||
script = {
|
||||
program = {
|
||||
mansection = 1;
|
||||
name = grub-mkstandalone;
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mkstandalone.in;
|
||||
common = util/grub-mkstandalone.c;
|
||||
|
||||
common = util/render-label.c;
|
||||
common = util/glue-efi.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
extra_dist = grub-core/osdep/linux/platform.c;
|
||||
extra_dist = grub-core/osdep/windows/platform.c;
|
||||
extra_dist = grub-core/osdep/basic/platform.c;
|
||||
extra_dist = grub-core/osdep/basic/no_platform.c;
|
||||
extra_dist = grub-core/osdep/unix/platform.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
script = {
|
||||
program = {
|
||||
mansection = 8;
|
||||
installdir = sbin;
|
||||
name = grub-install;
|
||||
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-install.in;
|
||||
common = util/grub-install.c;
|
||||
common = util/probe.c;
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
common = util/render-label.c;
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
enable = noemu;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
script = {
|
||||
program = {
|
||||
mansection = 1;
|
||||
installdir = bin;
|
||||
name = grub-mknetdir;
|
||||
|
||||
common = util/grub-install_header;
|
||||
common = util/grub-mknetdir.in;
|
||||
common = util/grub-mknetdir.c;
|
||||
|
||||
common = util/mkimage.c;
|
||||
common = util/grub-install-common.c;
|
||||
common = util/setup_bios.c;
|
||||
common = util/setup_sparc.c;
|
||||
common = grub-core/lib/reed_solomon.c;
|
||||
common = grub-core/osdep/random.c;
|
||||
common = grub-core/osdep/ofpath.c;
|
||||
common = grub-core/osdep/platform.c;
|
||||
common = grub-core/osdep/platform_unix.c;
|
||||
common = grub-core/osdep/compress.c;
|
||||
common = util/editenv.c;
|
||||
common = grub-core/osdep/blocklist.c;
|
||||
common = grub-core/osdep/config.c;
|
||||
common = util/config.c;
|
||||
|
||||
common = util/resolve.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = '$(LIBLZMA)';
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
script = {
|
||||
@@ -556,6 +704,127 @@ script = {
|
||||
installdir = noinst;
|
||||
};
|
||||
|
||||
script = {
|
||||
name = grub-fs-tester;
|
||||
common = tests/util/grub-fs-tester.in;
|
||||
installdir = noinst;
|
||||
dependencies = 'garbage-gen$(BUILD_EXEEXT)';
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = ext234_test;
|
||||
common = tests/ext234_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = squashfs_test;
|
||||
common = tests/squashfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = iso9660_test;
|
||||
common = tests/iso9660_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = hfsplus_test;
|
||||
common = tests/hfsplus_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = ntfs_test;
|
||||
common = tests/ntfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = reiserfs_test;
|
||||
common = tests/reiserfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = fat_test;
|
||||
common = tests/fat_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = minixfs_test;
|
||||
common = tests/minixfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = xfs_test;
|
||||
common = tests/xfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = nilfs2_test;
|
||||
common = tests/nilfs2_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = romfs_test;
|
||||
common = tests/romfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = exfat_test;
|
||||
common = tests/exfat_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = tar_test;
|
||||
common = tests/tar_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = udf_test;
|
||||
common = tests/udf_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = hfs_test;
|
||||
common = tests/hfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = jfs_test;
|
||||
common = tests/jfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = btrfs_test;
|
||||
common = tests/btrfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = zfs_test;
|
||||
common = tests/zfs_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = cpio_test;
|
||||
common = tests/cpio_test.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = example_scripted_test;
|
||||
@@ -881,6 +1150,12 @@ script = {
|
||||
common = tests/grub_cmd_tr.in;
|
||||
};
|
||||
|
||||
script = {
|
||||
testcase;
|
||||
name = file_filter_test;
|
||||
common = tests/file_filter_test.in;
|
||||
};
|
||||
|
||||
program = {
|
||||
testcase;
|
||||
name = example_unit_test;
|
||||
@@ -973,6 +1248,24 @@ program = {
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
name = grub-syslinux2cfg;
|
||||
mansection = 1;
|
||||
common = util/grub-syslinux2cfg.c;
|
||||
common = grub-core/lib/syslinux_parse.c;
|
||||
common = grub-core/lib/getline.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
common = grub-core/kern/emu/argp_common.c;
|
||||
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
name = grub-glue-efi;
|
||||
mansection = 1;
|
||||
@@ -1006,3 +1299,32 @@ program = {
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
|
||||
program = {
|
||||
name = grub-file;
|
||||
mansection = 1;
|
||||
|
||||
common = util/grub-file.c;
|
||||
common = util/render-label.c;
|
||||
common = grub-core/commands/file.c;
|
||||
common = grub-core/commands/file32.c;
|
||||
common = grub-core/commands/file64.c;
|
||||
common = grub-core/loader/i386/xen_file.c;
|
||||
common = grub-core/loader/i386/xen_file32.c;
|
||||
common = grub-core/loader/i386/xen_file64.c;
|
||||
common = grub-core/io/offset.c;
|
||||
common = grub-core/kern/elf.c;
|
||||
common = grub-core/loader/lzss.c;
|
||||
common = grub-core/loader/macho.c;
|
||||
common = grub-core/loader/macho32.c;
|
||||
common = grub-core/loader/macho64.c;
|
||||
common = grub-core/kern/emu/hostfs.c;
|
||||
common = grub-core/disk/host.c;
|
||||
common = grub-core/osdep/init.c;
|
||||
|
||||
ldadd = libgrubmods.a;
|
||||
ldadd = libgrubgcry.a;
|
||||
ldadd = libgrubkern.a;
|
||||
ldadd = grub-core/gnulib/libgnu.a;
|
||||
ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
|
||||
};
|
||||
@@ -1,3 +1,151 @@
|
||||
New in 2.02:
|
||||
|
||||
* New/improved filesystem and disk support:
|
||||
* Big-endian UFS1.
|
||||
* Experimental 64-bit ext2 support.
|
||||
* Various fixes for non-512-byte sector devices.
|
||||
* New `proc' filesystem framework, used by LUKS disks.
|
||||
* Fix DM-RAID partition handling.
|
||||
* New `nativedisk' command to switch from firmware to native disk drivers.
|
||||
* Compressed HFS+.
|
||||
* DragonFly BSD labels.
|
||||
* CBFS (coreboot).
|
||||
* Handle partitioned LVM properly.
|
||||
* Use LVM UUIDs whenever possible.
|
||||
* GPT PReP.
|
||||
* New `progress' module that shows progress information while reading
|
||||
files.
|
||||
* ZFS features support.
|
||||
* ZFS LZ4 support.
|
||||
|
||||
* New/improved terminal and video support:
|
||||
* Monochrome text (matching `hercules' in GRUB Legacy).
|
||||
* Morse code output using system speaker.
|
||||
* `spkmodem' output (simple data protocol using system speaker).
|
||||
* Handle Japanese special keys.
|
||||
* coreboot framebuffer.
|
||||
* Serial on ARC.
|
||||
* Native vt100 handling for grub-emu, replacing the use of the curses
|
||||
library.
|
||||
* New gfxmenu options for terminal window positioning, theme background
|
||||
image handling, and scrollbar padding, plus `item_pixmap_style' and
|
||||
`highlight_overlay'.
|
||||
* Support several more image types (paletted and greyscale).
|
||||
|
||||
* Boot protocol improvements:
|
||||
* Support Apple FAT binaries on non-Apple platforms.
|
||||
* Improve FreeDOS direct loading support compatibility.
|
||||
* Enable `linux16' on all x86 platforms, not just BIOS.
|
||||
* New TrueCrypt ISO loader.
|
||||
* multiboot2 boot-services EFI specification.
|
||||
* multiboot2 EFI memory map specification.
|
||||
* multiboot2 full-file specfication.
|
||||
|
||||
* New/improved network support:
|
||||
* New variables `net_default_*' containing properties of the default
|
||||
interface.
|
||||
* Autoload `http' and `tftp' modules if necessary.
|
||||
* Improve TFTP robustness.
|
||||
* Parse `nd' disk names in GRUB Legacy configuration files.
|
||||
* Issue separate DNS queries for IPv4 and IPv6.
|
||||
|
||||
* Coreboot improvements:
|
||||
* CBFS support both in on-disk images (loopback) and flash.
|
||||
* Ability to launch another payload from flash or disk
|
||||
* Coreboot framebuffer
|
||||
* CBMEMC support (both logging and inspecting logs)
|
||||
* Command for inspecting coreboot timestamps (`coreboot_boottime').
|
||||
* Command for inspecting coreboot tables (`lscoreboot').
|
||||
* New target default_payload.elf.
|
||||
* Increased maximal core size.
|
||||
|
||||
* New/improved platform support:
|
||||
* New `efifwsetup' and `lsefi' commands on EFI platforms.
|
||||
* New `cmosdump' and `cmosset' commands on platforms with CMOS support.
|
||||
* New command `pcidump' for PCI platforms.
|
||||
* Improve opcode parsing in ACPI halt implementation.
|
||||
* Use the TSC as a possible time source on i386-ieee1275.
|
||||
* Merge PowerPC grub-mkrescue implementation with the common one.
|
||||
* Support grub-mkrescue on i386-ieee1275, sparc64, bootinfo machines such
|
||||
as pSeries, and mips-arc.
|
||||
* Make grub-mkrescue better support Apple Intel Macs on CD.
|
||||
* Enable GRUB Legacy configuration file parsing on EFI.
|
||||
* Support halt for Loongson 2E.
|
||||
* ARM U-Boot and EFI ports.
|
||||
* Reorganise platform-dependent code in utilities to avoid #ifdef mess.
|
||||
* AROS and Haiku support for userspace utilities.
|
||||
* Xen PV port.
|
||||
* Fix EFI stack alignment.
|
||||
* ARM64 EFI port.
|
||||
* On Linux, read partition start offsets from sysfs if possible.
|
||||
* New grub-macbless utility, and better integration with Mac firmware in
|
||||
grub-install.
|
||||
* Support Yeeloong 3A.
|
||||
* Add `cpuid --pae' option to detect Physical Address Extension on x86.
|
||||
* Support for USB debug dongles.
|
||||
* Support for *-emu on all platforms (previously only i386/x86_64 worked).
|
||||
* Support *-emu on Windows.
|
||||
|
||||
* Security:
|
||||
* Add optional facility to enforce that all files read by the core image
|
||||
from disk have a valid detached digital signature.
|
||||
|
||||
* Performance:
|
||||
* Avoid costly division operations in many places.
|
||||
* New boot time analysis framework (`./configure --enable-boot-time').
|
||||
* Initialise USB ports in parallel.
|
||||
* New `testspeed' command to test file read speed.
|
||||
* Speed-up gfxterm by storing intermediate results in more compact format.
|
||||
* Lazy LVM/mdraid scan.
|
||||
* Disk hints.
|
||||
|
||||
* Scripting:
|
||||
* New `eval' and `tr' commands.
|
||||
* grub-script-check fails on scripts containing no commands.
|
||||
|
||||
* Installation and other utility improvements:
|
||||
* Add option to compress files on installation or image creation.
|
||||
* Using grub-reboot no longer requires setting `GRUB_DEFAULT=saved'.
|
||||
* Support probing EFI System Partition (requires os-prober >= 1.58).
|
||||
* Fix inconsistent use of `GRUB_CRYPTODISK_ENABLE' and
|
||||
`GRUB_ENABLE_CRYPTODISK'; the latter is now used consistently.
|
||||
* grub-mount handles symbolic links to directories.
|
||||
* Support disabling submenus with `GRUB_DISABLE_SUBMENU' configuration key
|
||||
for grub-mkconfig.
|
||||
* grub-install, grub-mknetdir, grub-mkrescue, and grub-mkstandalone
|
||||
rewritten in C. They should now work in supported non-Unix-like
|
||||
environments.
|
||||
* Native mingw support.
|
||||
* Ability to install on EFI under windows.
|
||||
* Reorganise timeout handling using new `timeout_style' environment
|
||||
variable and `GRUB_TIMEOUT_STYLE' configuration key for grub-mkconfig.
|
||||
Menu hotkeys pressed during a hidden timeout now boot the corresponding
|
||||
menu entry immediately.
|
||||
* New `file' command and grub-file utility to check file types.
|
||||
* New syslinux configuration file parser.
|
||||
|
||||
* Build system:
|
||||
* Remove all uses of nested functions; GRUB no longer requires an
|
||||
executable stack.
|
||||
* Fix documentation build with Texinfo >= 5.1.
|
||||
* More robust and documented cross-compiling support.
|
||||
* Partial clang support for some platforms (experimental).
|
||||
* Partial mingw64 x86_64-efi compile support (highly experimental).
|
||||
* Partial mingw32 i386-* (other than already present i386-pc)
|
||||
compile support (highly experimental).
|
||||
* Support for grub-mkpasswd on Windows.
|
||||
* Eliminate the use of AutoGen. This allowed some performance
|
||||
improvements to the build system.
|
||||
* Remove variable length arrays.
|
||||
* OpenBSD compile and tools support (NetBSD and FreeBSD were already supported).
|
||||
* Fix build with FreeType >= 2.5.1.
|
||||
* Make gentpl.py compatible with Python 3. It now requires at least
|
||||
Python 2.6.
|
||||
* modinfo.sh contains build information now.
|
||||
* Added many new tests to improve robustness.
|
||||
|
||||
* Revision control moved to git.
|
||||
|
||||
New in 2.00:
|
||||
|
||||
* Appearance:
|
||||
@@ -24,7 +172,6 @@ New in 2.00:
|
||||
* IEEE1275 serial.
|
||||
* EFI serial.
|
||||
* Network stack for BIOS, IEEE1275, EMU and EFI, including TFTP, HTTP and DNS.
|
||||
* VBE on coreboot support.
|
||||
|
||||
* New filesystem, filters and disks formats:
|
||||
* DVH partition map.
|
||||
@@ -48,7 +195,7 @@ New in 2.00:
|
||||
* multidevice, mirrored and raidz(2,3) ZFS support.
|
||||
* RAID LVM (internal RAIDing) support.
|
||||
* ZFS crypto support.
|
||||
* ZLE and GZIP on ZFS support.
|
||||
* ZLE, LZ4 and GZIP on ZFS support.
|
||||
* Support ZFS up to 33.
|
||||
* HFS string is now treated like mac-roman and not UTF-8
|
||||
* HFS mtime support.
|
||||
|
||||
+61
-64
@@ -19,6 +19,8 @@ AC_DEFUN([grub_PROG_TARGET_CC],
|
||||
AC_CACHE_VAL(grub_cv_prog_target_cc,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
int main (void);
|
||||
]], [[]])],
|
||||
[grub_cv_prog_target_cc=yes],
|
||||
@@ -134,6 +136,29 @@ if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Check nm
|
||||
AC_DEFUN([grub_PROG_NM_WORKS],
|
||||
[AC_MSG_CHECKING([whether nm works])
|
||||
AC_CACHE_VAL(grub_cv_prog_nm_works,
|
||||
[
|
||||
nm_works_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_works_tmp_dir/ef"
|
||||
if $TARGET_NM "$nm_works_tmp_dir/ef" > /dev/null; then
|
||||
grub_cv_prog_nm_works=yes
|
||||
else
|
||||
grub_cv_prog_nm_minus_p=no
|
||||
fi
|
||||
rm "$nm_works_tmp_dir/ef"
|
||||
rmdir "$nm_works_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_works])
|
||||
|
||||
if test "x$grub_cv_prog_nm_works" != xyes; then
|
||||
AC_MSG_ERROR([nm does not work])
|
||||
fi
|
||||
])
|
||||
|
||||
dnl Supply -P to nm
|
||||
AC_DEFUN([grub_PROG_NM_MINUS_P],
|
||||
[AC_MSG_CHECKING([whether nm accepts -P])
|
||||
@@ -141,13 +166,14 @@ AC_CACHE_VAL(grub_cv_prog_nm_minus_p,
|
||||
[
|
||||
nm_minus_p_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC conftest.c -o "$nm_minus_p_tmp_dir/ef"
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_minus_p_tmp_dir/ef"
|
||||
if $TARGET_NM -P "$nm_minus_p_tmp_dir/ef" 2>&1 > /dev/null; then
|
||||
grub_cv_prog_nm_minus_p=yes
|
||||
else
|
||||
grub_cv_prog_nm_minus_p=no
|
||||
fi
|
||||
rm "$nm_minus_p_tmp_dir/ef"
|
||||
rmdir "$nm_minus_p_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_minus_p])
|
||||
|
||||
@@ -165,13 +191,14 @@ AC_CACHE_VAL(grub_cv_prog_nm_defined_only,
|
||||
[
|
||||
nm_defined_only_tmp_dir="$(mktemp -d "./confXXXXXX")"
|
||||
AC_LANG_CONFTEST([AC_LANG_PROGRAM([[]], [[]])])
|
||||
$TARGET_CC conftest.c -o "$nm_defined_only_tmp_dir/ef"
|
||||
$TARGET_CC $TARGET_CFLAGS -c conftest.c -o "$nm_defined_only_tmp_dir/ef"
|
||||
if $TARGET_NM --defined-only "$nm_defined_only_tmp_dir/ef" 2>&1 > /dev/null; then
|
||||
grub_cv_prog_nm_defined_only=yes
|
||||
else
|
||||
grub_cv_prog_nm_defined_only=no
|
||||
fi
|
||||
rm "$nm_defined_only_tmp_dir/ef"
|
||||
rmdir "$nm_defined_only_tmp_dir"
|
||||
])
|
||||
AC_MSG_RESULT([$grub_cv_prog_nm_defined_only])
|
||||
|
||||
@@ -212,7 +239,7 @@ else
|
||||
sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
|
||||
fi
|
||||
|
||||
if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
grub_cv_i386_asm_addr32=yes
|
||||
else
|
||||
grub_cv_i386_asm_addr32=no
|
||||
@@ -222,37 +249,6 @@ rm -f conftest*])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
|
||||
|
||||
dnl check if our compiler is apple cc
|
||||
dnl because it requires numerous workarounds
|
||||
AC_DEFUN([grub_apple_cc],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([whether our compiler is apple cc])
|
||||
AC_CACHE_VAL(grub_cv_apple_cc,
|
||||
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
|
||||
grub_cv_apple_cc=yes
|
||||
else
|
||||
grub_cv_apple_cc=no
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_apple_cc])])
|
||||
|
||||
dnl check if our target compiler is apple cc
|
||||
dnl because it requires numerous workarounds
|
||||
AC_DEFUN([grub_apple_target_cc],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([whether our target compiler is apple cc])
|
||||
AC_CACHE_VAL(grub_cv_apple_target_cc,
|
||||
[if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
|
||||
grub_cv_apple_target_cc=yes
|
||||
else
|
||||
grub_cv_apple_target_cc=no
|
||||
fi
|
||||
])
|
||||
|
||||
AC_MSG_RESULT([$grub_cv_apple_target_cc])])
|
||||
|
||||
|
||||
dnl Later versions of GAS requires that addr32 and data32 prefixes
|
||||
dnl appear in the same lines as the instructions they modify, while
|
||||
dnl earlier versions requires that they appear in separate lines.
|
||||
@@ -266,7 +262,7 @@ AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
|
||||
l1: addr32 movb %al, l1
|
||||
EOF
|
||||
|
||||
if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
if AC_TRY_COMMAND([${CC-cc} ${TARGET_CCASFLAGS} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
|
||||
grub_cv_i386_asm_prefix_requirement=yes
|
||||
else
|
||||
grub_cv_i386_asm_prefix_requirement=no
|
||||
@@ -294,7 +290,12 @@ AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([if __bss_start is defined by the compiler])
|
||||
AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
int main (void);
|
||||
]],
|
||||
[[asm ("incl __bss_start")]])],
|
||||
[grub_cv_check_uscore_uscore_bss_start_symbol=yes],
|
||||
[grub_cv_check_uscore_uscore_bss_start_symbol=no])])
|
||||
@@ -303,7 +304,11 @@ AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
|
||||
|
||||
AC_MSG_CHECKING([if edata is defined by the compiler])
|
||||
AC_CACHE_VAL(grub_cv_check_edata_symbol,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
int main (void);]],
|
||||
[[asm ("incl edata")]])],
|
||||
[grub_cv_check_edata_symbol=yes],
|
||||
[grub_cv_check_edata_symbol=no])])
|
||||
@@ -312,7 +317,11 @@ AC_MSG_RESULT([$grub_cv_check_edata_symbol])
|
||||
|
||||
AC_MSG_CHECKING([if _edata is defined by the compiler])
|
||||
AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
int main (void);]],
|
||||
[[asm ("incl _edata")]])],
|
||||
[grub_cv_check_uscore_edata_symbol=yes],
|
||||
[grub_cv_check_uscore_edata_symbol=no])])
|
||||
@@ -336,7 +345,11 @@ AC_DEFUN([grub_CHECK_END_SYMBOL],
|
||||
[AC_REQUIRE([AC_PROG_CC])
|
||||
AC_MSG_CHECKING([if end is defined by the compiler])
|
||||
AC_CACHE_VAL(grub_cv_check_end_symbol,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
int main (void);]],
|
||||
[[asm ("incl end")]])],
|
||||
[grub_cv_check_end_symbol=yes],
|
||||
[grub_cv_check_end_symbol=no])])
|
||||
@@ -345,7 +358,11 @@ AC_MSG_RESULT([$grub_cv_check_end_symbol])
|
||||
|
||||
AC_MSG_CHECKING([if _end is defined by the compiler])
|
||||
AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
|
||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||
asm (".globl start; start:");
|
||||
void __main (void);
|
||||
void __main (void) {}
|
||||
int main (void);]],
|
||||
[[asm ("incl _end")]])],
|
||||
[grub_cv_check_uscore_end_symbol=yes],
|
||||
[grub_cv_check_uscore_end_symbol=no])])
|
||||
@@ -391,7 +408,7 @@ AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
|
||||
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
|
||||
void foo (void) { volatile char a[8]; a[3]; }
|
||||
]])])
|
||||
[if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
|
||||
[if eval "$ac_compile -S -mstack-arg-probe -Werror -o conftest.s" 2> /dev/null; then]
|
||||
AC_MSG_RESULT([yes])
|
||||
[# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
|
||||
rm -f conftest.s
|
||||
@@ -401,15 +418,15 @@ else
|
||||
[fi]
|
||||
])
|
||||
|
||||
dnl Check if ln can handle directories properly (mingw).
|
||||
dnl Check if ln -s can handle directories properly (mingw).
|
||||
AC_DEFUN([grub_CHECK_LINK_DIR],[
|
||||
AC_MSG_CHECKING([whether ln can handle directories properly])
|
||||
AC_MSG_CHECKING([whether ln -s can handle directories properly])
|
||||
[mkdir testdir 2>/dev/null
|
||||
case $srcdir in
|
||||
[\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
|
||||
*) reldir=../$srcdir/include/grub/util ;;
|
||||
esac
|
||||
if ln -s $reldir testdir/util 2>/dev/null ; then]
|
||||
if ln -s $reldir testdir/util 2>/dev/null && rm -f testdir/util 2>/dev/null ; then]
|
||||
AC_MSG_RESULT([yes])
|
||||
[link_dir=yes
|
||||
else
|
||||
@@ -480,23 +497,3 @@ dnl program.
|
||||
AC_DEFUN([grub_TRANSFORM],[dnl
|
||||
AC_SUBST(AS_TR_SH([$1]), [`AS_ECHO([$1]) | sed "$program_transform_name"`])dnl
|
||||
])
|
||||
|
||||
dnl Check if the C compiler supports `-mno-unaligned-access'.
|
||||
AC_DEFUN([grub_CHECK_NO_UNALIGNED_ACCESS],[
|
||||
[# foobar
|
||||
nua_possible=yes]
|
||||
AC_MSG_CHECKING([whether `$CC' supports `-mno-unaligned-access'])
|
||||
AC_LANG_CONFTEST([AC_LANG_SOURCE([[
|
||||
int main() {
|
||||
return 0;
|
||||
}
|
||||
]])])
|
||||
|
||||
[if eval "$ac_compile -S -mno-unaligned-access -o conftest.s" 2> /dev/null; then]
|
||||
AC_MSG_RESULT([yes])
|
||||
[rm -f conftest.s
|
||||
else
|
||||
nua_possible=no]
|
||||
AC_MSG_RESULT([no])
|
||||
[fi]
|
||||
])
|
||||
+3
-8
@@ -8,8 +8,6 @@ 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 util -iname '*.in' ! -name Makefile.in |sort > po/POTFILES-shell.in
|
||||
|
||||
autogen --version >/dev/null || exit 1
|
||||
|
||||
echo "Importing unicode..."
|
||||
python util/import_unicode.py unicode/UnicodeData.txt unicode/BidiMirroring.txt unicode/ArabicShaping.txt grub-core/unidata.c
|
||||
|
||||
@@ -32,10 +30,7 @@ for x in mpi-asm-defs.h mpih-add1.c mpih-sub1.c mpih-mul1.c mpih-mul2.c mpih-mul
|
||||
ln -s generic/"$x" grub-core/lib/libgcrypt-grub/mpi/"$x"
|
||||
done
|
||||
|
||||
echo "Creating Makefile.tpl..."
|
||||
python gentpl.py | sed -e '/^$/{N;/^\n$/D;}' > Makefile.tpl
|
||||
|
||||
echo "Running autogen..."
|
||||
echo "Generating Automake input..."
|
||||
|
||||
# Automake doesn't like including files from a path outside the project.
|
||||
rm -f contrib grub-core/contrib
|
||||
@@ -59,8 +54,8 @@ for extra in contrib/*/Makefile.core.def; do
|
||||
fi
|
||||
done
|
||||
|
||||
cat $UTIL_DEFS | autogen -T Makefile.tpl | sed -e '/^$/{N;/^\n$/D;}' > Makefile.util.am
|
||||
cat $CORE_DEFS | autogen -T Makefile.tpl | sed -e '/^$/{N;/^\n$/D;}' > grub-core/Makefile.core.am
|
||||
python gentpl.py $UTIL_DEFS > Makefile.util.am
|
||||
python gentpl.py $CORE_DEFS > grub-core/Makefile.core.am
|
||||
|
||||
for extra in contrib/*/Makefile.common; do
|
||||
if test -e "$extra"; then
|
||||
|
||||
+22
-62
@@ -6,42 +6,28 @@ export LC_COLLATE := C
|
||||
unexport LC_ALL
|
||||
|
||||
# Platform specific options
|
||||
if COND_i386_pc
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_i386_qemu
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_i386_coreboot
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_i386_ieee1275
|
||||
CFLAGS_PLATFORM += -mrtd -mregparm=3 -freg-struct-return
|
||||
endif
|
||||
if COND_mips_loongson
|
||||
CFLAGS_PLATFORM += -mexplicit-relocs
|
||||
CPPFLAGS_PLATFORM = -DUSE_ASCII_FALLBACK
|
||||
endif
|
||||
if COND_mips
|
||||
CFLAGS_PLATFORM += -mflush-func=grub_red_herring
|
||||
CCASFLAGS_PLATFORM = -march=mips3
|
||||
endif
|
||||
if COND_sparc64_ieee1275
|
||||
CFLAGS_PLATFORM += -mno-app-regs
|
||||
LDFLAGS_PLATFORM = -Wl,-melf64_sparc -mno-relax
|
||||
endif
|
||||
if COND_sparc64_emu
|
||||
CFLAGS_PLATFORM += -mno-app-regs
|
||||
LDFLAGS_PLATFORM = -Wl,--no-relax
|
||||
endif
|
||||
if COND_arm
|
||||
CFLAGS_PLATFORM += -mthumb-interwork -mlong-calls
|
||||
if !COND_emu
|
||||
LDFLAGS_PLATFORM = -Wl,--wrap=__clear_cache
|
||||
endif
|
||||
endif
|
||||
if COND_arm64
|
||||
CFLAGS_PLATFORM += -mcmodel=large
|
||||
endif
|
||||
|
||||
#FIXME: discover and check XEN headers
|
||||
CPPFLAGS_XEN = -I/usr/include
|
||||
|
||||
# Other options
|
||||
|
||||
if ! COND_emu
|
||||
CFLAGS_PLATFORM += -Dfloat=__grub_poison
|
||||
CFLAGS_PLATFORM += -Ddouble=__grub_poison
|
||||
endif
|
||||
|
||||
CPPFLAGS_DEFAULT = -DGRUB_FILE=\"$(subst $(srcdir)/,,$<)\"
|
||||
CPPFLAGS_DEFAULT += -I$(builddir)
|
||||
CPPFLAGS_DEFAULT += -I$(srcdir)
|
||||
@@ -49,38 +35,17 @@ CPPFLAGS_DEFAULT += -I$(top_builddir)
|
||||
CPPFLAGS_DEFAULT += -I$(top_srcdir)
|
||||
CPPFLAGS_DEFAULT += -I$(top_srcdir)/include
|
||||
CPPFLAGS_DEFAULT += -I$(top_builddir)/include
|
||||
CPPFLAGS_DEFAULT += -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/include
|
||||
CPPFLAGS_DEFAULT += -I$(top_srcdir)/grub-core/lib/libgcrypt-grub/src/
|
||||
CCASFLAGS_DEFAULT = $(CPPFLAGS_DEFAULT) -DASM_FILE=1
|
||||
BUILD_CPPFLAGS += $(CPPFLAGS_DEFAULT)
|
||||
|
||||
LDADD_KERNEL =
|
||||
|
||||
if ! COND_i386_pc
|
||||
if ! COND_i386_efi
|
||||
if ! COND_i386_qemu
|
||||
if ! COND_i386_coreboot
|
||||
if ! COND_i386_multiboot
|
||||
if ! COND_i386_ieee1275
|
||||
if ! COND_x86_64_efi
|
||||
LDADD_KERNEL += -lgcc
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
LDADD_KERNEL = $(TARGET_LIBGCC)
|
||||
|
||||
CFLAGS_KERNEL = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
|
||||
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -static-libgcc
|
||||
LDFLAGS_KERNEL = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) $(TARGET_LDFLAGS_STATIC_LIBGCC)
|
||||
CPPFLAGS_KERNEL = $(CPPFLAGS_CPU) $(CPPFLAGS_PLATFORM) -DGRUB_KERNEL=1
|
||||
CCASFLAGS_KERNEL = $(CCASFLAGS_CPU) $(CCASFLAGS_PLATFORM)
|
||||
if COND_CYGWIN
|
||||
STRIPFLAGS_KERNEL = -F elf32-i386 -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version
|
||||
else
|
||||
STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .note.gnu.gold-version
|
||||
endif
|
||||
STRIPFLAGS_KERNEL = -R .rel.dyn -R .reginfo -R .note -R .comment -R .drectve -R .note.gnu.gold-version
|
||||
|
||||
CFLAGS_MODULE = $(CFLAGS_CPU) $(CFLAGS_PLATFORM) -ffreestanding
|
||||
LDFLAGS_MODULE = $(LDFLAGS_CPU) $(LDFLAGS_PLATFORM) -nostdlib $(TARGET_LDFLAGS_OLDMAGIC) -Wl,-r,-d
|
||||
@@ -107,13 +72,13 @@ grubconfdir = $(sysconfdir)/grub.d
|
||||
platformdir = $(pkglibdir)/$(target_cpu)-$(platform)
|
||||
starfielddir = $(pkgdatadir)/themes/starfield
|
||||
|
||||
CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion -Wno-old-style-definition -Wno-unsafe-loop-optimizations
|
||||
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
|
||||
|
||||
CFLAGS_POSIX = -fno-builtin
|
||||
CPPFLAGS_POSIX = -I$(top_srcdir)/grub-core/lib/posix_wrap
|
||||
|
||||
CFLAGS_GCRY = -Wno-error -Wno-missing-field-initializers -Wno-redundant-decls $(CFLAGS_POSIX)
|
||||
CFLAGS_GCRY = -Wno-error -Wno-missing-field-initializers -Wno-redundant-decls -Wno-undef $(CFLAGS_POSIX)
|
||||
CPPFLAGS_GCRY = -I$(top_srcdir)/grub-core/lib/libgcrypt_wrap $(CPPFLAGS_POSIX) -D_GCRYPT_IN_LIBGCRYPT=1 -I$(top_srcdir)/include/grub/gcrypt
|
||||
|
||||
CPPFLAGS_EFIEMU = -I$(top_srcdir)/grub-core/efiemu/runtime
|
||||
@@ -164,20 +129,15 @@ EXTRA_DIST =
|
||||
CLEANFILES =
|
||||
BUILT_SOURCES =
|
||||
|
||||
# Rules for autogen definition files
|
||||
|
||||
.PRECIOUS: $(top_srcdir)/Makefile.tpl
|
||||
$(top_srcdir)/Makefile.tpl: $(top_srcdir)/gentpl.py
|
||||
python $< | sed -e '/^$$/{N;/^\\n$$/D;}' > $@.new || (rm -f $@.new; exit 1)
|
||||
mv $@.new $@
|
||||
# Rules for Automake input
|
||||
|
||||
.PRECIOUS: $(top_srcdir)/Makefile.util.am
|
||||
$(top_srcdir)/Makefile.util.am: $(top_srcdir)/Makefile.util.def $(top_srcdir)/Makefile.utilgcry.def $(top_srcdir)/Makefile.tpl
|
||||
cat $(top_srcdir)/Makefile.util.def $(top_srcdir)/Makefile.utilgcry.def | autogen -T $(top_srcdir)/Makefile.tpl | sed -e '/^$$/{N;/^\\n$$/D;}' > $@.new || (rm -f $@.new; exit 1)
|
||||
$(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)
|
||||
mv $@.new $@
|
||||
|
||||
.PRECIOUS: $(top_srcdir)/grub-core/Makefile.core.am
|
||||
$(top_srcdir)/grub-core/Makefile.core.am: $(top_srcdir)/grub-core/Makefile.core.def $(top_srcdir)/grub-core/Makefile.gcry.def $(top_srcdir)/Makefile.tpl
|
||||
$(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
|
||||
cat $(top_srcdir)/grub-core/Makefile.core.def $(top_srcdir)/grub-core/Makefile.gcry.def | autogen -T $(top_srcdir)/Makefile.tpl | sed -e '/^$$/{N;/^\\n$$/D;}' > $@.new || (rm -f $@.new; exit 1)
|
||||
python $^ > $@.new || (rm -f $@.new; exit 1)
|
||||
mv $@.new $@
|
||||
@@ -2,7 +2,6 @@ EXTRA_DIST += autogen.sh
|
||||
EXTRA_DIST += geninit.sh
|
||||
|
||||
EXTRA_DIST += gentpl.py
|
||||
EXTRA_DIST += Makefile.tpl
|
||||
EXTRA_DIST += Makefile.util.def
|
||||
EXTRA_DIST += Makefile.utilgcry.def
|
||||
|
||||
@@ -12,9 +11,11 @@ EXTRA_DIST += util/import_gcry.py
|
||||
EXTRA_DIST += util/import_unicode.py
|
||||
|
||||
EXTRA_DIST += docs/man
|
||||
EXTRA_DIST += docs/autoiso.cfg
|
||||
EXTRA_DIST += docs/grub.cfg
|
||||
EXTRA_DIST += docs/osdetect.cfg
|
||||
|
||||
EXTRA_DIST += conf/i386-pc-cygwin-img-ld.sc
|
||||
EXTRA_DIST += conf/i386-cygwin-img-ld.sc
|
||||
|
||||
EXTRA_DIST += grub-core/Makefile.core.def
|
||||
EXTRA_DIST += grub-core/Makefile.gcry.def
|
||||
@@ -26,6 +27,11 @@ EXTRA_DIST += grub-core/gensymlist.sh
|
||||
EXTRA_DIST += grub-core/genemuinit.sh
|
||||
EXTRA_DIST += grub-core/genemuinitheader.sh
|
||||
|
||||
EXTRA_DIST += grub-core/gnulib-fix-null-deref.diff
|
||||
EXTRA_DIST += grub-core/gnulib-fix-width.diff
|
||||
EXTRA_DIST += grub-core/gnulib-no-abort.diff
|
||||
EXTRA_DIST += grub-core/gnulib-no-gets.diff
|
||||
|
||||
EXTRA_DIST += grub-core/lib/libgcrypt
|
||||
EXTRA_DIST += grub-core/lib/libgcrypt-grub/mpi/generic
|
||||
EXTRA_DIST += $(shell find $(top_srcdir)/include -name '*.h')
|
||||
@@ -103,3 +109,15 @@ EXTRA_DIST += grub-core/osdep/windows/sleep.c
|
||||
EXTRA_DIST += tests/dfly-mbr-mbexample.mbr.img.gz
|
||||
EXTRA_DIST += tests/dfly-mbr-mbexample.dfly.img.gz
|
||||
|
||||
EXTRA_DIST += coreboot.cfg
|
||||
|
||||
EXTRA_DIST += tests/file_filter/file
|
||||
EXTRA_DIST += tests/file_filter/file.gz
|
||||
EXTRA_DIST += tests/file_filter/file.gz.sig
|
||||
EXTRA_DIST += tests/file_filter/file.lzop
|
||||
EXTRA_DIST += tests/file_filter/file.lzop.sig
|
||||
EXTRA_DIST += tests/file_filter/file.xz
|
||||
EXTRA_DIST += tests/file_filter/file.xz.sig
|
||||
EXTRA_DIST += tests/file_filter/keys
|
||||
EXTRA_DIST += tests/file_filter/keys.pub
|
||||
EXTRA_DIST += tests/file_filter/test.cfg
|
||||
@@ -5,6 +5,8 @@ SECTIONS
|
||||
.text :
|
||||
{
|
||||
start = . ;
|
||||
_start = . ;
|
||||
__start = . ;
|
||||
*(.text)
|
||||
etext = . ;
|
||||
}
|
||||
@@ -33,6 +35,8 @@ SECTIONS
|
||||
{
|
||||
*(.edata)
|
||||
end = . ;
|
||||
_end = . ;
|
||||
__end = . ;
|
||||
}
|
||||
.stab :
|
||||
{
|
||||
+3
-6
@@ -6,6 +6,8 @@
|
||||
#define __powerpc__ 1
|
||||
#endif
|
||||
|
||||
#define GCRYPT_NO_DEPRECATED 1
|
||||
|
||||
/* Define to 1 to enable disk cache statistics. */
|
||||
#define DISK_CACHE_STATS @DISK_CACHE_STATS@
|
||||
#define BOOT_TIME_STATS @BOOT_TIME_STATS@
|
||||
@@ -26,6 +28,7 @@
|
||||
#elif defined (GRUB_UTIL) || !defined (GRUB_MACHINE)
|
||||
#include <config-util.h>
|
||||
#else
|
||||
#define HAVE_FONT_SOURCE @HAVE_FONT_SOURCE@
|
||||
/* Define if C symbols get an underscore after compilation. */
|
||||
#define HAVE_ASM_USCORE @HAVE_ASM_USCORE@
|
||||
/* Define it to \"addr32\" or \"addr32;\" to make GAS happy. */
|
||||
@@ -48,12 +51,6 @@
|
||||
#define PACKAGE_NAME "@PACKAGE_NAME@"
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@"
|
||||
/* Default boot directory name" */
|
||||
#define GRUB_BOOT_DIR_NAME "@bootdirname@"
|
||||
/* Default grub directory name */
|
||||
#define GRUB_DIR_NAME "@grubdirname@"
|
||||
/* Define to 1 if GCC generates calls to __register_frame_info(). */
|
||||
#define NEED_REGISTER_FRAME_INFO @NEED_REGISTER_FRAME_INFO@
|
||||
|
||||
#define GRUB_TARGET_CPU "@GRUB_TARGET_CPU@"
|
||||
#define GRUB_PLATFORM "@GRUB_PLATFORM@"
|
||||
|
||||
+731
-341
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,3 @@
|
||||
if test -f (cbfsdisk)/etc/grub.cfg; then
|
||||
source (cbfsdisk)/etc/grub.cfg
|
||||
fi
|
||||
@@ -0,0 +1,244 @@
|
||||
# Sample GRUB script to autodetect operating systems
|
||||
#
|
||||
# Copyright (C) 2010 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/>.
|
||||
|
||||
function pathname { regexp -s 2:"$2" '^(\(.*\))?(/.*)$' "$1"; }
|
||||
function devname { regexp -s "$2" '^(\(.*\)).*$' "$1"; }
|
||||
|
||||
function loopback_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if test -f /boot/grub/loopback.cfg; then
|
||||
cfgpath=/boot/grub/loopback.cfg
|
||||
elif test -f /grub/loopback.cfg; then
|
||||
cfgpath=/grub/loopback.cfg
|
||||
else
|
||||
return 1;
|
||||
fi
|
||||
|
||||
echo loopback.cfg $isopath: yes
|
||||
menuentry "Boot GRUB Loopback Config from ${realdev}${isopath}" "$realdev" "$isopath" "$cfgpath" {
|
||||
set device="$2"
|
||||
set iso_path="$3"
|
||||
set cfg_path="$4"
|
||||
|
||||
export iso_path
|
||||
loopback loopdev_cfg "${device}${iso_path}"
|
||||
set root=(loopdev_cfg)
|
||||
configfile $cfg_path
|
||||
loopback -d loopdev_cfg
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function grml_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
result=1
|
||||
for dir in /boot/grml /boot/grmlsmall /boot/grmlmedium; do
|
||||
if ! test -f ${dir}/linux26 -a -f ${dir}/initrd.gz; then continue; fi
|
||||
|
||||
echo grml $isopath: yes
|
||||
result=0
|
||||
menuentry "GRML Linux from ${realdev}${isopath}" \
|
||||
"$realdev" "$isopath" "$dir" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
set grmldir="$4"
|
||||
|
||||
loopback loopdev_grml "${device}${isopath}"
|
||||
set root=(loopdev_grml)
|
||||
linux $grmldir/linux26 findiso="$isopath" apm=power-off quiet \
|
||||
boot=live nomce
|
||||
initrd $grmldir/initrd.gz
|
||||
loopback -d loopdev_grml
|
||||
}
|
||||
done
|
||||
return $result
|
||||
}
|
||||
|
||||
function pmagic_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /pmagic/bzImage -a -f /pmagic/initramfs; then return 1; fi
|
||||
|
||||
echo pmagic $isopath: yes
|
||||
menuentry "Parted Magic from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
|
||||
loopback loopdev_pmagic "${device}${isopath}"
|
||||
set root=(loopdev_pmagic)
|
||||
linux /pmagic/bzImage iso_filename="$isopath" edd=off noapic \
|
||||
load_ramdisk=1 prompt_ramdisk=0 rw sleep=10 loglevel=0 \
|
||||
keymap=$langcode
|
||||
initrd /pmagic/initramfs
|
||||
loopback -d loopdev_pmagic
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function sidux_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
result=1
|
||||
for kernel in /boot/vmlinuz-*-sidux-*; do
|
||||
if ! test -f "$kernel"; then continue; fi
|
||||
regexp -s 1:v1 -s 2:v2 '/boot/vmlinuz-(.*)-sidux-(.*)' "$kernel"
|
||||
|
||||
initrd="/boot/initrd.img-$v1-sidux-$v2"
|
||||
if ! test -f "$initrd"; then continue; fi
|
||||
|
||||
result=0
|
||||
echo sidux $isopath: yes
|
||||
menuentry "Sidux vmlinux-$v1-sidux-$v2 from ${realdev}${isopath}" "$realdev" "$isopath" "$kernel" "$initrd" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
set kernel="$4"
|
||||
set initrd="$5"
|
||||
|
||||
loopback loopdev_sidux "${device}${isopath}"
|
||||
set root=(loopdev_sidux)
|
||||
linux $kernel fromiso=$isopath boot=fll quiet
|
||||
initrd $initrd
|
||||
loopback -d loopdev_sidux
|
||||
}
|
||||
done
|
||||
return $result
|
||||
}
|
||||
|
||||
function slax_iso_entry {
|
||||
realdev="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /boot/vmlinuz -a -f /boot/initrd.gz; then return 1; fi
|
||||
|
||||
echo slax $isopath: yes
|
||||
menuentry "Slax Linux from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
|
||||
loopback loopdev_slax "${device}${isopath}"
|
||||
set root=(loopdev_slax)
|
||||
linux /boot/vmlinuz from=$isopath ramdisk_size=6666 root=/dev/ram0 rw
|
||||
initrd /boot/initrd.gz
|
||||
loopback -d loopdev_slax
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function tinycore_iso_entry {
|
||||
realpath="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /boot/bzImage -a -f /boot/tinycore.gz; then return 1; fi
|
||||
|
||||
echo tinycore $isopath: yes
|
||||
menuentry "Tinycore Linux from ${realdev}${isopath}" "$realdev" "$isopath" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
|
||||
loopback loopdev_tiny "${device}${isopath}"
|
||||
set root=(loopdev_tiny)
|
||||
linux /boot/bzImage
|
||||
initrd /boot/tinycore.gz
|
||||
loopback -d loopdev_tiny
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function casper_iso_entry {
|
||||
realpath="$1"
|
||||
isopath="$2"
|
||||
loopdev="$3"
|
||||
|
||||
if ! test -f /casper/vmlinuz; then return 1; fi
|
||||
initrd=
|
||||
for f in /casper/initrd.*z; do
|
||||
if ! test -f "$f"; then continue; fi
|
||||
pathname "$f" initrd
|
||||
done
|
||||
if test -z "$initrd"; then return 1; fi
|
||||
|
||||
echo casper $isopath: yes
|
||||
menuentry "Casper based Linux from ${realdev}${isopath}" "$realdev" "$isopath" "$initrd" {
|
||||
set device="$2"
|
||||
set isopath="$3"
|
||||
set initrd="$4"
|
||||
|
||||
loopback loopdev_casper "${device}${isopath}"
|
||||
set root=(loopdev_casper)
|
||||
linux /casper/vmlinuz boot=casper iso-scan/filename="$isopath" quiet splash noprompt keyb="$langcode" \
|
||||
debian-installer/language="$langcode" console-setup/layoutcode?="$langcode" --
|
||||
initrd $initrd
|
||||
loopback -d loopdev_casper
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
function scan_isos {
|
||||
isodirs="$1"
|
||||
|
||||
for dev in (*); do
|
||||
for dir in $isodirs; do
|
||||
for file in ${dev}${dir}/*.iso ${dev}${dir}/*.ISO; do
|
||||
if ! test -f "$file"; then continue; fi
|
||||
|
||||
pathname $file isopath
|
||||
if test -z "$dev" -o -z "$isopath"; then continue; fi
|
||||
|
||||
if ! loopback loopdev_scan "$file"; then continue; fi
|
||||
saved_root=$root
|
||||
set root=(loopdev_scan)
|
||||
|
||||
if loopback_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif grml_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif pmagic_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif sidux_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif slax_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif tinycore_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
elif casper_iso_entry $dev $isopath (loopdev_scan); then true;
|
||||
else true; fi
|
||||
|
||||
set root=$saved_root
|
||||
loopback -d loopdev_scan
|
||||
done
|
||||
done
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
# XXX Remove later
|
||||
insmod serial
|
||||
serial
|
||||
terminal_output --append serial
|
||||
# terminal_input --append serial
|
||||
|
||||
langcode="$lang"
|
||||
|
||||
insmod regexp
|
||||
scan_isos /iso /boot/iso
|
||||
|
||||
+162
-42
@@ -79,7 +79,7 @@ This edition documents version @value{VERSION}.
|
||||
* Contributing Changes::
|
||||
* Porting::
|
||||
* Error Handling::
|
||||
* CIA::
|
||||
* Stack and heap size::
|
||||
* BIOS port memory map::
|
||||
* Video Subsystem::
|
||||
* PFF2 Font File Format::
|
||||
@@ -92,24 +92,36 @@ This edition documents version @value{VERSION}.
|
||||
@node Getting the source code
|
||||
@chapter Getting the source code
|
||||
|
||||
GRUB is maintained using the @uref{http://bazaar-vcs.org/, Bazaar revision
|
||||
control system}. To fetch the primary development branch:
|
||||
GRUB is maintained using the @uref{GIT revision
|
||||
control system}. To fetch:
|
||||
|
||||
@example
|
||||
bzr get http://bzr.savannah.gnu.org/r/grub/trunk/grub
|
||||
git clone git://git.sv.gnu.org/grub.git
|
||||
@end example
|
||||
|
||||
The GRUB developers maintain several other branches with work in progress.
|
||||
Of these, the most interesting is the experimental branch, which is a
|
||||
staging area for new code which we expect to eventually merge into trunk but
|
||||
which is not yet ready:
|
||||
|
||||
Web access is available under
|
||||
@example
|
||||
bzr get http://bzr.savannah.gnu.org/r/grub/branches/experimental
|
||||
http://git.savannah.gnu.org/cgit/grub.git/
|
||||
@end example
|
||||
|
||||
Once you have used @kbd{bzr get} to fetch an initial copy of a branch, you
|
||||
can use @kbd{bzr pull} to keep it up to date. If you have modified your
|
||||
The branches available are:
|
||||
|
||||
@table @samp
|
||||
@item master
|
||||
Main development branch.
|
||||
@item grub-legacy
|
||||
GRUB 0.97 codebase. Kept for reference and legal reasons
|
||||
@item multiboot
|
||||
Multiboot specfication
|
||||
@item multiboot2
|
||||
Multiboot2 specfication
|
||||
@item developer branches
|
||||
Prefixed with developer name. Every developer of a team manages his own branches.
|
||||
Developer branches do not need changelog entries.
|
||||
@end table
|
||||
|
||||
Once you have used @kbd{git clone} to fetch an initial copy of a branch, you
|
||||
can use @kbd{git pull} to keep it up to date. If you have modified your
|
||||
local version, you may need to resolve conflicts when pulling.
|
||||
|
||||
@node Coding style
|
||||
@@ -216,12 +228,12 @@ The opening @samp{/*} and closing @samp{*/} should be placed together on a line
|
||||
Here is a brief map of the GRUB code base.
|
||||
|
||||
GRUB uses Autoconf and Automake, with most of the Automake input generated
|
||||
by AutoGen. The top-level build rules are in @file{configure.ac},
|
||||
by a Python script. The top-level build rules are in @file{configure.ac},
|
||||
@file{grub-core/Makefile.core.def}, and @file{Makefile.util.def}. Each
|
||||
block in a @file{*.def} file represents a build target, and specifies the
|
||||
source files used to build it on various platforms. The @file{*.def} files
|
||||
are processed into AutoGen input by @file{gentpl.py} (which you only need to
|
||||
look at if you are extending the build system). If you are adding a new
|
||||
are processed into Automake input by @file{gentpl.py} (which you only need
|
||||
to look at if you are extending the build system). If you are adding a new
|
||||
module which follows an existing pattern, such as a new command or a new
|
||||
filesystem implementation, it is usually easiest to grep
|
||||
@file{grub-core/Makefile.core.def} and @file{Makefile.util.def} for an
|
||||
@@ -334,10 +346,10 @@ anymore.
|
||||
@itemize
|
||||
@item Always use latest GRUB 2 source code. So get that first.
|
||||
|
||||
For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a Bazaar (bzr) repository.
|
||||
For developers it is recommended always to use the newest development version of GRUB 2. If development takes a long period of time, please remember to keep in sync with newest developments regularly so it is much easier to integrate your change in the future. GRUB 2 is being developed in a GIT repository.
|
||||
|
||||
Please check Savannah's GRUB project page for details how to get newest bzr:
|
||||
@uref{http://savannah.gnu.org/bzr/?group=grub, GRUB 2 bzr Repository}
|
||||
Please check Savannah's GRUB project page for details how to get newest git:
|
||||
@uref{https://savannah.gnu.org/git/?group=grub, GRUB 2 git Repository}
|
||||
|
||||
@item Compile it and try it out.
|
||||
|
||||
@@ -895,33 +907,68 @@ if (grub_errno != GRUB_ERR_NONE)
|
||||
grub_error_pop ();
|
||||
@end example
|
||||
|
||||
@node CIA
|
||||
@chapter CIA
|
||||
@c By Robert Millan and Carles Pina
|
||||
If you have commit access, please setup CIA in your Bazaar
|
||||
config so those in IRC receive notification of your commits.
|
||||
@node Stack and heap size
|
||||
@chapter Stack and heap size
|
||||
|
||||
In @file{~/.bazaar/bazaar.conf}, add "cia_send_revno = true".
|
||||
Optionally, you can also add "cia_user = myusername" if you'd
|
||||
like CIA service to use a specific account (for statistical purpose).
|
||||
On emu stack and heap are just normal host OS stack and heap. Stack is typically
|
||||
8 MiB although it's OS-dependent.
|
||||
|
||||
In the @file{.bzr/branch/branch.conf} of your checkout branch,
|
||||
"set nickname = /path_to_this_branch" and "cia_project = GNU GRUB".
|
||||
On i386-pc, i386-coreboot, i386-qemu and i386-multiboot the stack is 60KiB.
|
||||
All available space between 1MiB and 4GiB marks is part of heap.
|
||||
|
||||
Additionally, please set cia_send_revno in the [DEFAULT] section
|
||||
of your @file{~/.bazaar/bazaar.conf}. E.g.:
|
||||
On *-xen stack is 4MiB. If compiled for x86-64 with GCC 4.4 or later adressable
|
||||
space is unlimited. When compiled for x86-64 with older GCC version adressable
|
||||
space is limited to 2GiB. When compiling for i386 adressable space is limited
|
||||
to 4GiB. All adressable pages except the ones for stack, GRUB binary, special
|
||||
pages and page table are in the heap.
|
||||
|
||||
@example
|
||||
[DEFAULT]
|
||||
cia_send_revno = true
|
||||
@end example
|
||||
On *-efi GRUB uses same stack as EFI. If compiled for x86-64 with GCC 4.4 or
|
||||
later adressable space is unlimited. When compiled for x86-64 with older GCC
|
||||
version adressable space is limited to 2GiB. For all other platforms adressable
|
||||
space is limited to 4GiB. GRUB allocates pages from EFI for its heap, at most
|
||||
1.6 GiB.
|
||||
|
||||
Remember to install cia-clients (Debian/Ubuntu package) to be able to use CIA.
|
||||
On i386-ieee1275 and powerpc-ieee1275 GRUB uses same stack as IEEE1275.
|
||||
It allocates at most 32MiB for its heap.
|
||||
|
||||
On sparc64-ieee1275 stack is 256KiB and heap is 2MiB.
|
||||
|
||||
On mips(el)-qemu_mips and mipsel-loongson stack is 2MiB (everything below
|
||||
GRUB image) and everything above GRUB image (from 2MiB + kernel size)
|
||||
until 256MiB is part of heap.
|
||||
|
||||
On mips-arc stack is 2MiB (everything below GRUB image) and everything above
|
||||
GRUB image(from 2MiB + kernel size) until 128MiB is part of heap.
|
||||
|
||||
On mipsel-arc stack is 2MiB (everything below GRUB image which is not part
|
||||
of ARC) and everything above GRUB image (from 7MiB + kernel size)
|
||||
until 256MiB is part of heap.
|
||||
|
||||
On arm-uboot stack is 256KiB and heap is 2MiB.
|
||||
|
||||
In short:
|
||||
|
||||
@multitable @columnfractions .15 .25 .5
|
||||
@headitem Platform @tab Stack @tab Heap
|
||||
@item emu @tab 8 MiB @tab ?
|
||||
@item i386-pc @tab 60 KiB @tab < 4 GiB
|
||||
@item i386-coreboot @tab 60 KiB @tab < 4 GiB
|
||||
@item i386-multiboot @tab 60 KiB @tab < 4 GiB
|
||||
@item i386-qemu @tab 60 KiB @tab < 4 GiB
|
||||
@item *-efi @tab ? @tab < 1.6 GiB
|
||||
@item i386-ieee1275 @tab ? @tab < 32 MiB
|
||||
@item powerpc-ieee1275 @tab ? @tab < 32 MiB
|
||||
@item sparc64-ieee1275 @tab 256KiB @tab 2 MiB
|
||||
@item arm-uboot @tab 256KiB @tab 2 MiB
|
||||
@item mips(el)-qemu_mips @tab 2MiB @tab 253 MiB
|
||||
@item mipsel-loongson @tab 2MiB @tab 253 MiB
|
||||
@item mips-arc @tab 2MiB @tab 125 MiB
|
||||
@item mipsel-arc @tab 2MiB @tab 248 MiB
|
||||
@item x86_64-xen (GCC >= 4.4) @tab 4MiB @tab unlimited
|
||||
@item x86_64-xen (GCC < 4.4) @tab 4MiB @tab < 2GiB
|
||||
@item i386-xen @tab 4MiB @tab < 4GiB
|
||||
@end multitable
|
||||
|
||||
Keep in mind Bazaar sends notifications for all commits to branches that have
|
||||
this setting, regardless of whether they're bound branches (checkouts) or not.
|
||||
So if you make local commits in a non-bound branch and it bothers you that
|
||||
others can read them, do not use this setting.
|
||||
|
||||
@node BIOS port memory map
|
||||
@chapter BIOS port memory map
|
||||
@@ -934,9 +981,8 @@ others can read them, do not use this setting.
|
||||
@item ? @tab 0x2000 - 1 @tab Real mode stack
|
||||
@item 0x7C00 @tab 0x7D00 - 1 @tab Boot sector
|
||||
@item 0x8000 @tab ? @tab GRUB kernel
|
||||
@item 0x68000 @tab 0x78000 - 1 @tab Disk buffer
|
||||
@item 0x68000 @tab 0x71000 - 1 @tab Disk buffer
|
||||
@item ? @tab 0x80000 - 1 @tab Protected mode stack
|
||||
@item 0x80000 @tab ? @tab Heap
|
||||
@item ? @tab 0xA0000 - 1 @tab Extended BIOS Data Area
|
||||
@item 0xA0000 @tab 0xC0000 - 1 @tab Video RAM
|
||||
@item 0xC0000 @tab 0x100000 - 1 @tab BIOS
|
||||
@@ -1113,6 +1159,47 @@ struct grub_video_palette_data
|
||||
Used to query indexed color palettes. If mode is RGB mode, colors will be copied from emulated palette data. In Indexed Color modes, palettes will be read from hardware. Color values will be converted to suit structure format. @code{start} will tell what hardware color index (or emulated color index) will be used as a source for first indice of @code{palette_data}, after that both hardware color index and @code{palette_data} index will be incremented until @code{count} number of colors have been read.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_set_area_status
|
||||
@itemize
|
||||
|
||||
@item Prototype:
|
||||
@example
|
||||
grub_err_t
|
||||
grub_video_set_area_status (grub_video_area_status_t area_status);
|
||||
@end example
|
||||
@example
|
||||
enum grub_video_area_status_t
|
||||
@{
|
||||
GRUB_VIDEO_AREA_DISABLED,
|
||||
GRUB_VIDEO_AREA_ENABLED
|
||||
@};
|
||||
@end example
|
||||
|
||||
@item Description:
|
||||
|
||||
Used to set area drawing mode for redrawing the specified region. Draw commands
|
||||
are performed in the intersection of the viewport and the region called area.
|
||||
Coordinates remain related to the viewport. If draw commands try to draw over
|
||||
the area, they are clipped.
|
||||
Set status to DISABLED if you need to draw everything.
|
||||
Set status to ENABLED and region to the desired rectangle to redraw everything
|
||||
inside the region leaving everything else intact.
|
||||
Should be used for redrawing of active elements.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_get_area_status
|
||||
@itemize
|
||||
|
||||
@item Prototype:
|
||||
@example
|
||||
grub_err_r
|
||||
grub_video_get_area_status (grub_video_area_status_t *area_status);
|
||||
@end example
|
||||
|
||||
@item Description:
|
||||
Used to query the area status.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_set_viewport
|
||||
@itemize
|
||||
@item Prototype:
|
||||
@@ -1139,6 +1226,37 @@ grub_video_get_viewport (unsigned int *x, unsigned int *y, unsigned int *width,
|
||||
Used to query current viewport dimensions. Software developer can use this to choose best way to render contents of the viewport.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_set_region
|
||||
@itemize
|
||||
@item Prototype:
|
||||
|
||||
@example
|
||||
grub_err_t
|
||||
grub_video_set_region (unsigned int x, unsigned int y, unsigned int width, unsigned int height);
|
||||
@end example
|
||||
@item Description:
|
||||
|
||||
Used to specify the region of the screen which should be redrawn. Use absolute
|
||||
values. When the region is set and area status is ENABLE all draw commands will
|
||||
be performed inside the interseption of region and viewport named area.
|
||||
If draw commands try to draw over viewport, they are clipped. If developer
|
||||
requests larger than possible region, width and height will be clamped to fit
|
||||
screen. Should be used for redrawing of active elements.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_get_region
|
||||
@itemize
|
||||
@item Prototype:
|
||||
|
||||
@example
|
||||
grub_err_t
|
||||
grub_video_get_region (unsigned int *x, unsigned int *y, unsigned int *width, unsigned int *height);
|
||||
@end example
|
||||
@item Description:
|
||||
|
||||
Used to query current region dimensions.
|
||||
@end itemize
|
||||
|
||||
@subsection grub_video_map_color
|
||||
@itemize
|
||||
@item Prototype:
|
||||
@@ -1694,7 +1812,9 @@ right edges of two adjacent glyphs. The @strong{device width} field determines
|
||||
the effective leading value that is used to render the font.
|
||||
|
||||
@end itemize
|
||||
@image{font_char_metrics,,,,png}
|
||||
@ifnottex
|
||||
@image{font_char_metrics,,,,.png}
|
||||
@end ifnottex
|
||||
|
||||
An illustration of how the various font metrics apply to characters.
|
||||
|
||||
|
||||
+223
-53
@@ -701,6 +701,26 @@ you may run those commands directly to install GRUB, without using
|
||||
with the internals of GRUB. Installing a boot loader on a running OS may be
|
||||
extremely dangerous.
|
||||
|
||||
On EFI systems for fixed disk install you have to mount EFI System Partition.
|
||||
If you mount it at @file{/boot/efi} then you don't need any special arguments:
|
||||
|
||||
@example
|
||||
# @kbd{grub-install}
|
||||
@end example
|
||||
|
||||
Otherwise you need to specify where your EFI System partition is mounted:
|
||||
|
||||
@example
|
||||
# @kbd{grub-install --efi-directory=/mnt/efi}
|
||||
@end example
|
||||
|
||||
For removable installs you have to use @option{--removable} and specify both
|
||||
@option{--boot-directory} and @option{--efi-directory}:
|
||||
|
||||
@example
|
||||
# @kbd{grub-install --efi-directory=/mnt/usb --boot-directory=/mnt/usb/boot --removable}
|
||||
@end example
|
||||
|
||||
@node Making a GRUB bootable CD-ROM
|
||||
@section Making a GRUB bootable CD-ROM
|
||||
|
||||
@@ -1234,14 +1254,14 @@ Valid keys in @file{/etc/default/grub} are as follows:
|
||||
@item GRUB_DEFAULT
|
||||
The default menu entry. This may be a number, in which case it identifies
|
||||
the Nth entry in the generated menu counted from zero, or the title of a
|
||||
menu entry, or the special string @samp{saved}. Using the title may be
|
||||
menu entry, or the special string @samp{saved}. Using the id may be
|
||||
useful if you want to set a menu entry as the default even though there may
|
||||
be a variable number of entries before it.
|
||||
|
||||
For example, if you have:
|
||||
|
||||
@verbatim
|
||||
menuentry 'Example GNU/Linux distribution' --class gnu-linux {
|
||||
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
|
||||
...
|
||||
}
|
||||
@end verbatim
|
||||
@@ -1249,12 +1269,17 @@ menuentry 'Example GNU/Linux distribution' --class gnu-linux {
|
||||
then you can make this the default using:
|
||||
|
||||
@example
|
||||
GRUB_DEFAULT='Example GNU/Linux distribution'
|
||||
GRUB_DEFAULT=example-gnu-linux
|
||||
@end example
|
||||
|
||||
Previously it was documented the way to use entry title. While this still
|
||||
works it's not recommended since titles often contain unstable device names
|
||||
and may be translated
|
||||
|
||||
If you set this to @samp{saved}, then the default menu entry will be that
|
||||
saved by @samp{GRUB_SAVEDEFAULT}, @command{grub-set-default}, or
|
||||
@command{grub-reboot}.
|
||||
saved by @samp{GRUB_SAVEDEFAULT} or @command{grub-set-default}. This relies on
|
||||
the environment block, which may not be available in all situations
|
||||
(@pxref{Environment block}).
|
||||
|
||||
The default is @samp{0}.
|
||||
|
||||
@@ -1263,7 +1288,7 @@ If this option is set to @samp{true}, then, when an entry is selected, save
|
||||
it as a new default entry for use by future runs of GRUB. This is only
|
||||
useful if @samp{GRUB_DEFAULT=saved}; it is a separate option because
|
||||
@samp{GRUB_DEFAULT=saved} is useful without this option, in conjunction with
|
||||
@command{grub-set-default} or @command{grub-reboot}. Unset by default.
|
||||
@command{grub-set-default}. Unset by default.
|
||||
This option relies on the environment block, which may not be available in
|
||||
all situations (@pxref{Environment block}).
|
||||
|
||||
@@ -1273,23 +1298,26 @@ a key is pressed. The default is @samp{5}. Set to @samp{0} to boot
|
||||
immediately without displaying the menu, or to @samp{-1} to wait
|
||||
indefinitely.
|
||||
|
||||
@item GRUB_HIDDEN_TIMEOUT
|
||||
Wait this many seconds for @key{ESC} to be pressed before displaying the menu.
|
||||
If no @key{ESC} is pressed during that time, display the menu for the number of
|
||||
seconds specified in GRUB_TIMEOUT before booting the default entry. We expect
|
||||
that most people who use GRUB_HIDDEN_TIMEOUT will want to have GRUB_TIMEOUT set
|
||||
to @samp{0} so that the menu is not displayed at all unless @key{ESC} is
|
||||
pressed.
|
||||
Unset by default.
|
||||
If @samp{GRUB_TIMEOUT_STYLE} is set to @samp{countdown} or @samp{hidden},
|
||||
the timeout is instead counted before the menu is displayed.
|
||||
|
||||
@item GRUB_HIDDEN_TIMEOUT_QUIET
|
||||
In conjunction with @samp{GRUB_HIDDEN_TIMEOUT}, set this to @samp{true} to
|
||||
suppress the verbose countdown while waiting for a key to be pressed before
|
||||
displaying the menu. Unset by default.
|
||||
@item GRUB_TIMEOUT_STYLE
|
||||
If this option is unset or set to @samp{menu}, then GRUB will display the
|
||||
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.
|
||||
|
||||
If this option is set to @samp{countdown} or @samp{hidden}, then, before
|
||||
displaying the menu, GRUB will wait for the timeout set by
|
||||
@samp{GRUB_TIMEOUT} to expire. If @key{ESC} is pressed during that time, it
|
||||
will display the menu and wait for input. If a hotkey associated with a
|
||||
menu entry is pressed, it will boot the associated menu entry immediately.
|
||||
If the timeout expires before either of these happens, it will boot the
|
||||
default entry. In the @samp{countdown} case, it will show a one-line
|
||||
indication of the remaining time.
|
||||
|
||||
@item GRUB_DEFAULT_BUTTON
|
||||
@itemx GRUB_TIMEOUT_BUTTON
|
||||
@itemx GRUB_HIDDEN_TIMEOUT_BUTTON
|
||||
@itemx GRUB_TIMEOUT_STYLE_BUTTON
|
||||
@itemx GRUB_BUTTON_CMOS_ADDRESS
|
||||
Variants of the corresponding variables without the @samp{_BUTTON} suffix,
|
||||
used to support vendor-specific power buttons. @xref{Vendor power-on keys}.
|
||||
@@ -1426,6 +1454,22 @@ Normally, @command{grub-mkconfig} will try to use the external
|
||||
systems installed on the same system and generate appropriate menu entries
|
||||
for them. Set this option to @samp{true} to disable this.
|
||||
|
||||
@item GRUB_OS_PROBER_SKIP_LIST
|
||||
List of space-separated FS UUIDs of filesystems to be ignored from os-prober
|
||||
output. For efi chainloaders it's <UUID>@@<EFI FILE>
|
||||
|
||||
@item GRUB_DISABLE_SUBMENU
|
||||
Normally, @command{grub-mkconfig} will generate top level menu entry for
|
||||
the kernel with highest version number and put all other found kernels
|
||||
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
|
||||
in submenu. If this option is set to @samp{y}, flat menu with all entries
|
||||
on top level will be generated instead. Changing this option will require
|
||||
changing existing values of @samp{GRUB_DEFAULT}, @samp{fallback} (@pxref{fallback})
|
||||
and @samp{default} (@pxref{default}) environment variables as well as saved
|
||||
default entry using @command{grub-set-default} and value used with
|
||||
@command{grub-reboot}.
|
||||
|
||||
@item GRUB_ENABLE_CRYPTODISK
|
||||
If set to @samp{y}, @command{grub-mkconfig} and @command{grub-install} will
|
||||
check for encrypted disks and generate additional commands needed to access
|
||||
@@ -1448,6 +1492,44 @@ Each module will be loaded as early as possible, at the start of
|
||||
|
||||
@end table
|
||||
|
||||
The following options are still accepted for compatibility with existing
|
||||
configurations, but have better replacements:
|
||||
|
||||
@table @samp
|
||||
@item GRUB_HIDDEN_TIMEOUT
|
||||
Wait this many seconds before displaying the menu. If @key{ESC} is pressed
|
||||
during that time, display the menu and wait for input according to
|
||||
@samp{GRUB_TIMEOUT}. If a hotkey associated with a menu entry is pressed,
|
||||
boot the associated menu entry immediately. If the timeout expires before
|
||||
either of these happens, display the menu for the number of seconds
|
||||
specified in @samp{GRUB_TIMEOUT} before booting the default entry.
|
||||
|
||||
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
|
||||
@key{ESC} is pressed.
|
||||
|
||||
This option is unset by default, and is deprecated in favour of the less
|
||||
confusing @samp{GRUB_TIMEOUT_STYLE=countdown} or
|
||||
@samp{GRUB_TIMEOUT_STYLE=hidden}.
|
||||
|
||||
@item GRUB_HIDDEN_TIMEOUT_QUIET
|
||||
In conjunction with @samp{GRUB_HIDDEN_TIMEOUT}, set this to @samp{true} to
|
||||
suppress the verbose countdown while waiting for a key to be pressed before
|
||||
displaying the menu.
|
||||
|
||||
This option is unset by default, and is deprecated in favour of the less
|
||||
confusing @samp{GRUB_TIMEOUT_STYLE=countdown}.
|
||||
|
||||
@item GRUB_HIDDEN_TIMEOUT_BUTTON
|
||||
Variant of @samp{GRUB_HIDDEN_TIMEOUT}, used to support vendor-specific power
|
||||
buttons. @xref{Vendor power-on keys}.
|
||||
|
||||
This option is unset by default, and is deprecated in favour of the less
|
||||
confusing @samp{GRUB_TIMEOUT_STYLE=countdown} or
|
||||
@samp{GRUB_TIMEOUT_STYLE=hidden}.
|
||||
|
||||
@end table
|
||||
|
||||
For more detailed customisation of @command{grub-mkconfig}'s output, you may
|
||||
edit the scripts in @file{/etc/grub.d} directly.
|
||||
@file{/etc/grub.d/40_custom} is particularly useful for adding entire custom
|
||||
@@ -2436,17 +2518,20 @@ menu requires several fancy features of your terminal.
|
||||
@node Vendor power-on keys
|
||||
@chapter Using GRUB with vendor power-on keys
|
||||
|
||||
Some laptop vendors provide an additional power-on button which boots another
|
||||
OS. GRUB supports such buttons with the @samp{GRUB_TIMEOUT_BUTTON},
|
||||
@samp{GRUB_DEFAULT_BUTTON}, @samp{GRUB_HIDDEN_TIMEOUT_BUTTON} and
|
||||
Some laptop vendors provide an additional power-on button which boots
|
||||
another OS. GRUB supports such buttons with the @samp{GRUB_TIMEOUT_BUTTON},
|
||||
@samp{GRUB_TIMEOUT_STYLE_BUTTON}, @samp{GRUB_DEFAULT_BUTTON}, and
|
||||
@samp{GRUB_BUTTON_CMOS_ADDRESS} variables in default/grub (@pxref{Simple
|
||||
configuration}). @samp{GRUB_TIMEOUT_BUTTON}, @samp{GRUB_DEFAULT_BUTTON} and
|
||||
@samp{GRUB_HIDDEN_TIMEOUT_BUTTON} are used instead of the corresponding
|
||||
variables without the @samp{_BUTTON} suffix when powered on using the special
|
||||
button. @samp{GRUB_BUTTON_CMOS_ADDRESS} is vendor-specific and partially
|
||||
model-specific. Values known to the GRUB team are:
|
||||
configuration}). @samp{GRUB_TIMEOUT_BUTTON},
|
||||
@samp{GRUB_TIMEOUT_STYLE_BUTTON}, and @samp{GRUB_DEFAULT_BUTTON} are used
|
||||
instead of the corresponding variables without the @samp{_BUTTON} suffix
|
||||
when powered on using the special button. @samp{GRUB_BUTTON_CMOS_ADDRESS}
|
||||
is vendor-specific and partially model-specific. Values known to the GRUB
|
||||
team are:
|
||||
|
||||
@table @key
|
||||
@item Dell XPS M1330M
|
||||
121:3
|
||||
@item Dell XPS M1530
|
||||
85:3
|
||||
@item Dell Latitude E4300
|
||||
@@ -2626,6 +2711,7 @@ Heavily limited platforms:
|
||||
Lightly limited platforms:
|
||||
|
||||
@itemize
|
||||
@item *-xen: limited only by adress space and RAM size.
|
||||
@item i386-qemu: kernel.img (.text + .data + .bss) is limited by 392704 bytes.
|
||||
(core.img would be limited by ROM size but it's unlimited on qemu
|
||||
@item All EFI platforms: limited by contiguous RAM size and possibly firmware bugs
|
||||
@@ -2681,9 +2767,9 @@ by a digit, like @samp{fd0}, or @samp{cd}.
|
||||
AHCI, PATA (ata), crypto, USB use the name of driver followed by a number.
|
||||
Memdisk and host are limited to one disk and so it's refered just by driver
|
||||
name.
|
||||
RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM and arcdisk (arc) use
|
||||
intrinsic name of disk prefixed by driver name. Additionally just ``nand''
|
||||
refers to the disk aliased as ``nand''.
|
||||
RAID (md), ofdisk (ieee1275 and nand), LVM (lvm), LDM, virtio (vdsk)
|
||||
and arcdisk (arc) use intrinsic name of disk prefixed by driver name.
|
||||
Additionally just ``nand'' refers to the disk aliased as ``nand''.
|
||||
Conflicts are solved by suffixing a number if necessarry.
|
||||
Commas need to be escaped.
|
||||
Loopback uses whatever name specified to @command{loopback} command.
|
||||
@@ -2949,6 +3035,7 @@ These variables have special meaning to GRUB.
|
||||
* biosnum::
|
||||
* check_signatures::
|
||||
* chosen::
|
||||
* cmdpath::
|
||||
* color_highlight::
|
||||
* color_normal::
|
||||
* debug::
|
||||
@@ -2985,6 +3072,7 @@ These variables have special meaning to GRUB.
|
||||
* superusers::
|
||||
* theme::
|
||||
* timeout::
|
||||
* timeout_style::
|
||||
@end menu
|
||||
|
||||
|
||||
@@ -3018,6 +3106,16 @@ the titles of each of the submenus starting from the top level followed by
|
||||
the title of the menu entry itself, separated by @samp{>}.
|
||||
|
||||
|
||||
@node cmdpath
|
||||
@subsection cmdpath
|
||||
|
||||
The location from which @file{core.img} was loaded as an absolute
|
||||
directory name (@pxref{File name syntax}). This is set by GRUB at
|
||||
startup based on information returned by platform firmware. Not every
|
||||
platform provides this information and some may return only device
|
||||
without path name.
|
||||
|
||||
|
||||
@node color_highlight
|
||||
@subsection color_highlight
|
||||
|
||||
@@ -3025,7 +3123,7 @@ This variable contains the ``highlight'' foreground and background terminal
|
||||
colors, separated by a slash (@samp{/}). Setting this variable changes
|
||||
those colors. For the available color names, @pxref{color_normal}.
|
||||
|
||||
The default is @samp{black/white}.
|
||||
The default is @samp{black/light-gray}.
|
||||
|
||||
|
||||
@node color_normal
|
||||
@@ -3054,7 +3152,7 @@ those colors. Each color must be a name from the following list:
|
||||
@item white
|
||||
@end itemize
|
||||
|
||||
The default is @samp{white/black}.
|
||||
The default is @samp{light-gray/black}.
|
||||
|
||||
The color support support varies from terminal to terminal.
|
||||
|
||||
@@ -3088,7 +3186,8 @@ to go beyond the current 16 colors.
|
||||
This variable may be set to enable debugging output from various components
|
||||
of GRUB. The value is a list of debug facility names separated by
|
||||
whitespace or @samp{,}, or @samp{all} to enable all available debugging
|
||||
output.
|
||||
output. The facility names are the first argument to grub_dprintf. Consult
|
||||
source for more details.
|
||||
|
||||
|
||||
@node default
|
||||
@@ -3096,7 +3195,21 @@ output.
|
||||
|
||||
If this variable is set, it identifies a menu entry that should be selected
|
||||
by default, possibly after a timeout (@pxref{timeout}). The entry may be
|
||||
identified by number or by title.
|
||||
identified by number or by id.
|
||||
|
||||
For example, if you have:
|
||||
|
||||
@verbatim
|
||||
menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
|
||||
...
|
||||
}
|
||||
@end verbatim
|
||||
|
||||
then you can make this the default using:
|
||||
|
||||
@example
|
||||
default=example-gnu-linux
|
||||
@end example
|
||||
|
||||
If the entry is in a submenu, then it must be identified using the titles of
|
||||
each of the submenus starting from the top level followed by the number or
|
||||
@@ -3136,7 +3249,8 @@ If this variable is set, it sets the resolution used on the @samp{gfxterm}
|
||||
graphical terminal. Note that you can only use modes which your graphics
|
||||
card supports via VESA BIOS Extensions (VBE), so for example native LCD
|
||||
panel resolutions may not be available. The default is @samp{auto}, which
|
||||
selects a platform-specific default that should look reasonable.
|
||||
selects a platform-specific default that should look reasonable. Supported
|
||||
modes can be listed by @samp{videoinfo} command in GRUB.
|
||||
|
||||
The resolution may be specified as a sequence of one or more modes,
|
||||
separated by commas (@samp{,}) or semicolons (@samp{;}); each will be tried
|
||||
@@ -3391,8 +3505,21 @@ keyboard input before booting the default menu entry. A timeout of @samp{0}
|
||||
means to boot the default entry immediately without displaying the menu; a
|
||||
timeout of @samp{-1} (or unset) means to wait indefinitely.
|
||||
|
||||
This variable is often set by @samp{GRUB_TIMEOUT} or
|
||||
@samp{GRUB_HIDDEN_TIMEOUT} (@pxref{Simple configuration}).
|
||||
If @samp{timeout_style} (@pxref{timeout_style}) is set to @samp{countdown}
|
||||
or @samp{hidden}, the timeout is instead counted before the menu is
|
||||
displayed.
|
||||
|
||||
This variable is often set by @samp{GRUB_TIMEOUT} (@pxref{Simple
|
||||
configuration}).
|
||||
|
||||
|
||||
@node timeout_style
|
||||
@subsection timeout_style
|
||||
|
||||
This variable may be set to @samp{menu}, @samp{countdown}, or @samp{hidden}
|
||||
to control the way in which the timeout (@pxref{timeout}) interacts with
|
||||
displaying the menu. See the documentation of @samp{GRUB_TIMEOUT_STYLE}
|
||||
(@pxref{Simple configuration}) for details.
|
||||
|
||||
|
||||
@node Environment block
|
||||
@@ -3680,6 +3807,8 @@ you forget a command, you can run the command @command{help}
|
||||
* lsfonts:: List loaded fonts
|
||||
* lsmod:: Show loaded modules
|
||||
* md5sum:: Compute or check MD5 hash
|
||||
* module:: Load module for multiboot kernel
|
||||
* multiboot:: Load multiboot compliant kernel
|
||||
* nativedisk:: Switch to native disk drivers
|
||||
* normal:: Enter normal mode
|
||||
* normal_exit:: Exit from normal mode
|
||||
@@ -4347,7 +4476,7 @@ List devices or files.
|
||||
With no arguments, print all devices known to GRUB.
|
||||
|
||||
If the argument is a device name enclosed in parentheses (@pxref{Device
|
||||
syntax}), then list all files at the root directory of that device.
|
||||
syntax}), then print the name of the filesystem of that device.
|
||||
|
||||
If the argument is a directory given as an absolute file name (@pxref{File
|
||||
name syntax}), then list the contents of that directory.
|
||||
@@ -4369,7 +4498,6 @@ List loaded fonts.
|
||||
Show list of loaded modules.
|
||||
@end deffn
|
||||
|
||||
|
||||
@node md5sum
|
||||
@subsection md5sum
|
||||
|
||||
@@ -4378,6 +4506,34 @@ Alias for @code{hashsum --hash md5 arg @dots{}}. See command @command{hashsum}
|
||||
(@pxref{hashsum}) for full description.
|
||||
@end deffn
|
||||
|
||||
@node module
|
||||
@subsection module
|
||||
|
||||
@deffn Command module [--nounzip] file [arguments]
|
||||
Load a module for multiboot kernel image. The rest of the
|
||||
line is passed verbatim as the module command line.
|
||||
@end deffn
|
||||
|
||||
@node multiboot
|
||||
@subsection multiboot
|
||||
|
||||
@deffn Command multiboot [--quirk-bad-kludge] [--quirk-modules-after-kernel] file @dots{}
|
||||
Load a multiboot kernel image from @var{file}. The rest of the
|
||||
line is passed verbatim as the @dfn{kernel command-line}. Any module must
|
||||
be reloaded after using this command (@pxref{module}).
|
||||
|
||||
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
|
||||
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
|
||||
use kludge. Use this option to ignore kludge.
|
||||
Known affected systems: old Solaris, SkyOS.
|
||||
|
||||
--quirk-modules-after-kernel is needed for kernels which load at relatively
|
||||
high address e.g. 16MiB mark and can't cope with modules stuffed between
|
||||
1MiB mark and beginning of the kernel.
|
||||
Known afftected systems: VMWare.
|
||||
@end deffn
|
||||
|
||||
@node nativedisk
|
||||
@subsection nativedisk
|
||||
@@ -4783,7 +4939,8 @@ Alias for @code{hashsum --hash sha512 arg @dots{}}. See command @command{hashsum
|
||||
@deffn Command sleep [@option{--verbose}] [@option{--interruptible}] count
|
||||
Sleep for @var{count} seconds. If option @option{--interruptible} is given,
|
||||
allow @key{ESC} to interrupt sleep. With @option{--verbose} show countdown
|
||||
of remaining seconds.
|
||||
of remaining seconds. Exit code is set to 0 if timeout expired and to 1
|
||||
if timeout was interrupted by @key{ESC}.
|
||||
@end deffn
|
||||
|
||||
|
||||
@@ -5120,12 +5277,14 @@ is given, use default list of servers.
|
||||
|
||||
|
||||
@node Internationalisation
|
||||
@chapter Charset
|
||||
@chapter Internationalisation
|
||||
|
||||
@section Charset
|
||||
GRUB uses UTF-8 internally other than in rendering where some GRUB-specific
|
||||
appropriate representation is used. All text files (including config) are
|
||||
assumed to be encoded in UTF-8.
|
||||
|
||||
@chapter Filesystems
|
||||
@section Filesystems
|
||||
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
|
||||
as UTF-8, again according to specification. BtrFS, cpio, tar, squash4, minix,
|
||||
@@ -5159,7 +5318,7 @@ treated as distinct from u+combining diaresis. This however means that in
|
||||
order to access file on HFS+ its name must be specified in normalisation form D.
|
||||
On normalized ZFS subvolumes filenames out of normalisation are inaccessible.
|
||||
|
||||
@chapter Output terminal
|
||||
@section Output terminal
|
||||
Firmware output console ``console'' on ARC and IEEE1275 are limited to ASCII.
|
||||
|
||||
BIOS firmware console and VGA text are limited to ASCII and some pseudographics.
|
||||
@@ -5193,7 +5352,7 @@ called ``annotation characters'' If you can complete either of
|
||||
two lists or, better, propose a patch to improve rendering, please contact
|
||||
developer team.
|
||||
|
||||
@chapter Input terminal
|
||||
@section Input terminal
|
||||
Firmware console on BIOS, IEEE1275 and ARC doesn't allow you to enter non-ASCII
|
||||
characters. EFI specification allows for such but author is unaware of any
|
||||
actual implementations. Serial input is currently limited for latin1 (unlikely
|
||||
@@ -5203,15 +5362,15 @@ So no dead keys or advanced input method. Also there is no keymap change hotkey.
|
||||
In practice it makes difficult to enter any text using non-Latin alphabet.
|
||||
Moreover all current input consumers are limited to ASCII.
|
||||
|
||||
@chapter Gettext
|
||||
@section Gettext
|
||||
GRUB supports being translated. For this you need to have language *.mo files in $prefix/locale, load gettext module and set ``lang'' variable.
|
||||
|
||||
@chapter Regexp
|
||||
@section Regexp
|
||||
Regexps work on unicode characters, however no attempt at checking cannonical
|
||||
equivalence has been made. Moreover the classes like [:alpha:] match only
|
||||
ASCII subset.
|
||||
|
||||
@chapter Other
|
||||
@section Other
|
||||
Currently GRUB always uses YEAR-MONTH-DAY HOUR:MINUTE:SECOND [WEEKDAY] 24-hour
|
||||
datetime format but weekdays are translated.
|
||||
GRUB always uses the decimal number format with [0-9] as digits and . as
|
||||
@@ -5340,9 +5499,8 @@ may halt or otherwise impact the boot process.
|
||||
|
||||
GRUB uses GPG-style detached signatures (meaning that a file
|
||||
@file{foo.sig} will be produced when file @file{foo} is signed), and
|
||||
currently supports the DSA signing algorithm. Both 2048-bit and
|
||||
3072-bit keys are supported. A signing key can be generated as
|
||||
follows:
|
||||
currently supports the DSA and RSA signing algorithms. A signing key
|
||||
can be generated as follows:
|
||||
|
||||
@example
|
||||
gpg --gen-key
|
||||
@@ -5682,7 +5840,7 @@ X86 support is summarised in the following table. ``Yes'' means that the kernel
|
||||
PowerPC, IA64 and Sparc64 ports support only Linux. MIPS port supports Linux
|
||||
and multiboot2.
|
||||
|
||||
@chapter Boot tests
|
||||
@section Boot tests
|
||||
|
||||
As you have seen in previous chapter the support matrix is pretty big and some of the configurations are only rarely used. To ensure the quality bootchecks are available for all x86 targets except EFI chainloader, Appleloader and XNU. All x86 platforms have bootcheck facility except ieee1275. Multiboot, multiboot2, BIOS chainloader, ntldr and freebsd-bootloader boot targets are tested only with a fake kernel images. Only Linux is tested among the payloads using Linux protocols.
|
||||
|
||||
@@ -5836,8 +5994,20 @@ mounted on
|
||||
Recheck the device map, even if @file{/boot/grub/device.map} already
|
||||
exists. You should use this option whenever you add/remove a disk
|
||||
into/from your computer.
|
||||
@end table
|
||||
|
||||
@item --no-rs-codes
|
||||
By default on x86 BIOS systems, @command{grub-install} will use some
|
||||
extra space in the bootloader embedding area for Reed-Solomon
|
||||
error-correcting codes. This enables GRUB to still boot successfully
|
||||
if some blocks are corrupted. The exact amount of protection offered
|
||||
is dependent on available space in the embedding area. R sectors of
|
||||
redundancy can tolerate up to R/2 corrupted sectors. This
|
||||
redundancy may be cumbersome if attempting to cryptographically
|
||||
validate the contents of the bootloader embedding area, or in more
|
||||
modern systems with GPT-style partition tables (@pxref{BIOS
|
||||
installation}) where GRUB does not reside in any unpartitioned space
|
||||
outside of the MBR. Disable the Reed-Solomon codes with this option.
|
||||
@end table
|
||||
|
||||
@node Invoking grub-mkconfig
|
||||
@chapter Invoking grub-mkconfig
|
||||
@@ -6215,7 +6385,7 @@ just do:
|
||||
@end group
|
||||
@end example
|
||||
|
||||
Also, the latest version is available using Bazaar. See
|
||||
Also, the latest version is available using Git. See
|
||||
@uref{http://www.gnu.org/software/grub/grub-download.html} for more
|
||||
information.
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
[NAME]
|
||||
grub-file \- check file type
|
||||
@@ -0,0 +1,4 @@
|
||||
[NAME]
|
||||
grub-macbless \- bless a mac file/directory
|
||||
[SEE ALSO]
|
||||
.BR grub-install (1)
|
||||
@@ -0,0 +1,4 @@
|
||||
[NAME]
|
||||
grub-syslinux2cfg \- transform syslinux config into grub.cfg
|
||||
[SEE ALSO]
|
||||
.BR grub-menulst2cfg (8)
|
||||
@@ -178,6 +178,12 @@ for dev in (*); do
|
||||
# uuid: filesystem UUID
|
||||
probe -s uuid -u $dev
|
||||
|
||||
if test -f ($device)/isolinux/isolinux.cfg ; then
|
||||
menuentry "ISOLINUX config (on $device)" $device {
|
||||
set root=$2
|
||||
syslinux_configfile -i /isolinux/isolinux.cfg
|
||||
}
|
||||
fi
|
||||
if test -f ($device)/bootmgr -a -f ($device)/boot/bcd; then
|
||||
menuentry "Windows Vista bootmgr (on $device)" $device {
|
||||
set root=$2
|
||||
|
||||
+70
-44
@@ -10,10 +10,6 @@ CCAS=$(TARGET_CC)
|
||||
RANLIB=$(TARGET_RANLIB)
|
||||
STRIP=$(TARGET_STRIP)
|
||||
|
||||
if COND_HAVE_FONT_SOURCE
|
||||
TARGET_CFLAGS += -DUSE_ASCII_FALLBACK=1 -DHAVE_UNIFONT_WIDTHSPEC=1
|
||||
endif
|
||||
|
||||
MACHO2IMG=$(top_builddir)/grub-macho2img
|
||||
|
||||
AM_CFLAGS = $(TARGET_CFLAGS)
|
||||
@@ -30,17 +26,22 @@ CFLAGS_LIBRARY += $(CFLAGS_PLATFORM) -fno-builtin
|
||||
CPPFLAGS_LIBRARY += $(CPPFLAGS_PLATFORM)
|
||||
CCASFLAGS_LIBRARY += $(CCASFLAGS_PLATFORM)
|
||||
|
||||
build-grub-pe2elf: $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) -DGRUB_BUILD=1 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pe2elf\" $^
|
||||
build-grub-pep2elf$(BUILD_EXEEXT): $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=64 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pep2elf\" $^
|
||||
CLEANFILES += build-grub-pep2elf$(BUILD_EXEEXT)
|
||||
|
||||
build-grub-pe2elf$(BUILD_EXEEXT): $(top_srcdir)/util/grub-pe2elf.c $(top_srcdir)/grub-core/kern/emu/misc.c $(top_srcdir)/util/misc.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) -DGRUB_BUILD=1 -DGRUB_TARGET_WORDSIZE=32 -DGRUB_UTIL=1 -DGRUB_BUILD_PROGRAM_NAME=\"build-grub-pe2elf\" $^
|
||||
CLEANFILES += build-grub-pe2elf$(BUILD_EXEEXT)
|
||||
|
||||
# gentrigtables
|
||||
gentrigtables: gentrigtables.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $< $(BUILD_LIBM)
|
||||
CLEANFILES += gentrigtables
|
||||
gentrigtables$(BUILD_EXEEXT): gentrigtables.c
|
||||
$(BUILD_CC) -o $@ -I$(top_srcdir)/include $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) $(BUILD_LDFLAGS) $< $(BUILD_LIBM)
|
||||
CLEANFILES += gentrigtables$(BUILD_EXEEXT)
|
||||
|
||||
# trigtables.c
|
||||
trigtables.c: gentrigtables gentrigtables.c $(top_srcdir)/configure.ac
|
||||
./gentrigtables > $@
|
||||
trigtables.c: gentrigtables$(BUILD_EXEEXT) gentrigtables.c $(top_srcdir)/configure.ac
|
||||
./gentrigtables$(BUILD_EXEEXT) > $@
|
||||
CLEANFILES += trigtables.c
|
||||
|
||||
# XXX Use Automake's LEX & YACC support
|
||||
@@ -75,6 +76,7 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i18n.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/kernel.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/list.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/misc.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/compiler-rt.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/parser.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/partition.h
|
||||
@@ -82,7 +84,9 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/term.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/time.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/mm_private.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/net.h
|
||||
if !COND_clang
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/libgcc.h
|
||||
endif
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/memory.h
|
||||
|
||||
if COND_i386_pc
|
||||
@@ -102,7 +106,6 @@ endif
|
||||
if COND_i386_coreboot
|
||||
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_builddir)/include/grub/i386/pc/int.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
|
||||
@@ -112,7 +115,6 @@ endif
|
||||
|
||||
if COND_i386_multiboot
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/i386/pc/int.h
|
||||
endif
|
||||
|
||||
if COND_i386_qemu
|
||||
@@ -128,6 +130,24 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/i386/tsc.h
|
||||
endif
|
||||
|
||||
if COND_i386_xen
|
||||
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/terminfo.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_x86_64_xen
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/xen.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/x86_64/xen/hypercall.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/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
endif
|
||||
|
||||
if COND_x86_64_efi
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||
@@ -153,7 +173,6 @@ endif
|
||||
if COND_mips_qemu_mips
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/cache.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/serial.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/loader.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h
|
||||
@@ -165,7 +184,6 @@ if COND_mips_loongson
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/keyboard_layouts.h
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/time.h
|
||||
KERNEL_HEADER_FILES += $(top_builddir)/include/grub/cpu/cache.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
|
||||
@@ -206,12 +224,19 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/uboot.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/uboot/disk.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||
endif
|
||||
|
||||
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/disk.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/system.h
|
||||
endif
|
||||
|
||||
if COND_arm64_efi
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/efi.h
|
||||
KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/efi/disk.h
|
||||
endif
|
||||
|
||||
if COND_emu
|
||||
@@ -270,12 +295,12 @@ grub_emu-grub_emu_init.$(OBJEXT):grub_emu_init.h
|
||||
kern/emu/grub_emu_dyn-main.$(OBJEXT):grub_emu_init.h
|
||||
grub_emu_dyn-grub_emu_init.$(OBJEXT):grub_emu_init.h
|
||||
|
||||
grub_emu_init.h: genemuinitheader.sh $(MOD_FILES)
|
||||
rm -f $@; echo $(MOD_FILES) | sh $(srcdir)/genemuinitheader.sh $(TARGET_NM) > $@
|
||||
grub_emu_init.h: genemuinitheader.sh $(MODULE_FILES)
|
||||
rm -f $@; echo $(MODULE_FILES) | sh $(srcdir)/genemuinitheader.sh $(TARGET_NM) > $@
|
||||
CLEANFILES += grub_emu_init.h
|
||||
|
||||
grub_emu_init.c: grub_emu_init.h genemuinit.sh $(MOD_FILES)
|
||||
rm -f $@; echo $(MOD_FILES) | sh $(srcdir)/genemuinit.sh $(TARGET_NM) > $@
|
||||
grub_emu_init.c: grub_emu_init.h genemuinit.sh $(MODULE_FILES)
|
||||
rm -f $@; echo $(MODULE_FILES) | sh $(srcdir)/genemuinit.sh $(TARGET_NM) > $@
|
||||
CLEANFILES += grub_emu_init.c
|
||||
endif
|
||||
|
||||
@@ -368,43 +393,44 @@ CLEANFILES += $(MOD_FILES)
|
||||
|
||||
if COND_ENABLE_EFIEMU
|
||||
efiemu32.o: efiemu/runtime/efiemu.c $(TARGET_OBJ2ELF)
|
||||
-rm -f $@; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF32 -DAPPLE_CC -m32 -Wall -Werror -nostdlib -O2 -c -o $@.bin $< || exit 1; \
|
||||
$(OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin; \
|
||||
-rm -f $@
|
||||
-rm -f $@.bin
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m32 -Wall -Werror -nostdlib -static -O2 -c -o $@.bin $<
|
||||
if test "x$(TARGET_APPLE_LINKER)" = x1; then \
|
||||
$(TARGET_OBJCONV) -felf32 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin ; \
|
||||
elif test ! -z "$(TARGET_OBJ2ELF)"; then \
|
||||
$(TARGET_OBJ2ELF) $@.bin || (rm -f $@.bin; exit 1); \
|
||||
mv $@.bin $@ ; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF32 -m32 -Wall -Werror -nostdlib -O2 -c -o $@ $< || exit 1; \
|
||||
if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
|
||||
mv $@.bin $@ ; \
|
||||
fi
|
||||
|
||||
# Link format -arch,x86_64 means Apple linker
|
||||
efiemu64_c.o: efiemu/runtime/efiemu.c
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -DAPPLE_CC=1 -m64 -nostdlib -Wall -Werror -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
fi
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -nostdlib -Wall -Werror -O2 -mcmodel=large -mno-red-zone -c -o $@ $<
|
||||
|
||||
efiemu64_s.o: efiemu/runtime/efiemu.S
|
||||
-rm -f $@
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -DAPPLE_CC=1 -m64 -Wall -Werror -nostdlib -O2 -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
else \
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -DELF64 -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $< || exit 1; \
|
||||
fi
|
||||
$(TARGET_CC) $(DEFS) $(INCLUDES) $(CPPFLAGS_EFIEMU) $(CPPFLAGS_DEFAULT) -m64 -Wall -Werror -nostdlib -O2 -mcmodel=large -mno-red-zone -c -o $@ $<
|
||||
|
||||
efiemu64.o: efiemu64_c.o efiemu64_s.o $(TARGET_OBJ2ELEF)
|
||||
-rm -f $@; \
|
||||
if test "x$(TARGET_APPLE_CC)" = x1; then \
|
||||
rm -f $@.bin; \
|
||||
$(TARGET_CC) -m64 -Wl,-r -nostdlib -o $@.bin $^ || exit 1; \
|
||||
$(OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
|
||||
-rm -f $@
|
||||
-rm -f $@.bin
|
||||
$(TARGET_CC) -m64 $(EFIEMU64_LINK_FORMAT) -nostdlib -static -Wl,-r -o $@.bin $^
|
||||
if test "x$(EFIEMU64_LINK_FORMAT)" = x-arch,x86_64; then \
|
||||
$(TARGET_OBJCONV) -felf64 -nu -nd $@.bin $@ || exit 1; \
|
||||
rm -f $@.bin; \
|
||||
else \
|
||||
$(TARGET_CC) -m64 -nostdlib -Wl,-r -o $@ $^ || exit 1; \
|
||||
if test ! -z "$(TARGET_OBJ2ELF)"; then $(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi; \
|
||||
mv $@.bin $@ ; \
|
||||
fi
|
||||
|
||||
platform_DATA += efiemu32.o efiemu64.o
|
||||
CLEANFILES += efiemu32.o efiemu64.o efiemu64_c.o efiemu64_s.o
|
||||
endif
|
||||
|
||||
windowsdir=$(top_builddir)/$(PACKAGE)-$(VERSION)-for-windows
|
||||
windowsdir: $(PROGRAMS) $(starfield_DATA) $(platform_DATA)
|
||||
test -d $(windowsdir)/$(target_cpu)-$(platform) || mkdir $(windowsdir)/$(target_cpu)-$(platform)
|
||||
for x in $(platform_DATA); do \
|
||||
cp -fp $$x $(windowsdir)/$(target_cpu)-$(platform)/$$x; \
|
||||
done
|
||||
+186
-28
@@ -59,20 +59,32 @@ kernel = {
|
||||
ia64_efi_ldflags = '-Wl,-r,-d';
|
||||
ia64_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||
|
||||
x86_64_xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
i386_xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
arm_efi_ldflags = '-Wl,-r,-d';
|
||||
arm_efi_stripflags = '--strip-unneeded -K start -R .note -R .comment -R .note.gnu.gold-version';
|
||||
|
||||
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';
|
||||
|
||||
i386_pc_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
i386_pc_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x9000';
|
||||
|
||||
i386_qemu_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
i386_qemu_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
|
||||
i386_coreboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
i386_coreboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
|
||||
i386_multiboot_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
i386_multiboot_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x8200';
|
||||
i386_ieee1275_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
i386_ieee1275_ldflags = '$(TARGET_IMG_BASE_LDOPT),0x10000';
|
||||
i386_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
i386_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
|
||||
x86_64_xen_ldflags = '$(TARGET_IMG_LDFLAGS)';
|
||||
x86_64_xen_ldflags = '$(TARGET_IMG_BASE_LDOPT),0';
|
||||
|
||||
ldadd = '$(LDADD_KERNEL)';
|
||||
|
||||
i386_coreboot_ldflags = '-Wl,-Ttext=0x8200';
|
||||
i386_multiboot_ldflags = '-Wl,-Ttext=0x8200';
|
||||
i386_ieee1275_ldflags = '-Wl,-Ttext=0x10000';
|
||||
mips_loongson_ldflags = '-Wl,-Ttext,0x80200000';
|
||||
powerpc_ieee1275_ldflags = '-Wl,-Ttext,0x200000';
|
||||
sparc64_ieee1275_ldflags = '-Wl,-Ttext,0x4400';
|
||||
@@ -80,7 +92,6 @@ kernel = {
|
||||
mips_qemu_mips_ldflags = '-Wl,-Ttext,0x80200000';
|
||||
|
||||
mips_arc_cppflags = '-DGRUB_DECOMPRESSOR_LINK_ADDR=$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
mips_loongson_cppflags = '-DUSE_ASCII_FALLBACK';
|
||||
i386_qemu_cppflags = '-DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)';
|
||||
emu_cflags = '$(CFLAGS_GNULIB)';
|
||||
emu_cppflags = '$(CPPFLAGS_GNULIB)';
|
||||
@@ -90,6 +101,8 @@ kernel = {
|
||||
i386_pc_startup = kern/i386/pc/startup.S;
|
||||
i386_efi_startup = kern/i386/efi/startup.S;
|
||||
x86_64_efi_startup = kern/x86_64/efi/startup.S;
|
||||
i386_xen_startup = kern/i386/xen/startup.S;
|
||||
x86_64_xen_startup = kern/x86_64/xen/startup.S;
|
||||
i386_qemu_startup = kern/i386/qemu/startup.S;
|
||||
i386_ieee1275_startup = kern/i386/ieee1275/startup.S;
|
||||
i386_coreboot_startup = kern/i386/coreboot/startup.S;
|
||||
@@ -99,6 +112,7 @@ kernel = {
|
||||
powerpc_ieee1275_startup = kern/powerpc/ieee1275/startup.S;
|
||||
arm_uboot_startup = kern/arm/uboot/startup.S;
|
||||
arm_efi_startup = kern/arm/efi/startup.S;
|
||||
arm64_efi_startup = kern/arm64/efi/startup.S;
|
||||
|
||||
common = kern/command.c;
|
||||
common = kern/corecmd.c;
|
||||
@@ -118,6 +132,7 @@ kernel = {
|
||||
common = kern/rescue_reader.c;
|
||||
common = kern/term.c;
|
||||
|
||||
noemu = kern/compiler-rt.c;
|
||||
noemu = kern/mm.c;
|
||||
noemu = kern/time.c;
|
||||
noemu = kern/generic/millisleep.c;
|
||||
@@ -146,6 +161,7 @@ kernel = {
|
||||
terminfoinkernel = lib/arg.c;
|
||||
|
||||
i386 = kern/i386/dl.c;
|
||||
i386_xen = kern/i386/dl.c;
|
||||
|
||||
i386_coreboot = kern/i386/coreboot/init.c;
|
||||
i386_multiboot = kern/i386/coreboot/init.c;
|
||||
@@ -164,19 +180,31 @@ kernel = {
|
||||
i386_efi = kern/i386/efi/init.c;
|
||||
i386_efi = bus/pci.c;
|
||||
|
||||
x86_64_efi = kern/x86_64/dl.c;
|
||||
x86_64 = kern/x86_64/dl.c;
|
||||
x86_64_xen = kern/x86_64/dl.c;
|
||||
x86_64_efi = kern/x86_64/efi/callwrap.S;
|
||||
x86_64_efi = kern/i386/efi/init.c;
|
||||
x86_64_efi = bus/pci.c;
|
||||
|
||||
xen = kern/i386/tsc.c;
|
||||
x86_64_xen = kern/x86_64/xen/hypercall.S;
|
||||
i386_xen = kern/i386/xen/hypercall.S;
|
||||
xen = kern/xen/init.c;
|
||||
xen = term/xen/console.c;
|
||||
xen = disk/xen/xendisk.c;
|
||||
xen = commands/boot.c;
|
||||
|
||||
ia64_efi = kern/ia64/efi/startup.S;
|
||||
ia64_efi = kern/ia64/efi/init.c;
|
||||
ia64_efi = kern/ia64/dl.c;
|
||||
ia64_efi = kern/ia64/dl_helper.c;
|
||||
ia64_efi = kern/ia64/cache.c;
|
||||
|
||||
arm_efi = kern/arm/efi/init.c;
|
||||
arm_efi = kern/arm/efi/misc.c;
|
||||
|
||||
arm64_efi = kern/arm/efi/init.c;
|
||||
|
||||
i386_pc = kern/i386/pc/init.c;
|
||||
i386_pc = kern/i386/pc/mmap.c;
|
||||
i386_pc = term/i386/pc/console.c;
|
||||
@@ -218,12 +246,14 @@ kernel = {
|
||||
mips_loongson = video/sm712.c;
|
||||
mips_loongson = video/sis315pro.c;
|
||||
mips_loongson = video/radeon_fuloong2e.c;
|
||||
mips_loongson = video/radeon_yeeloong3a.c;
|
||||
extra_dist = video/sm712_init.c;
|
||||
extra_dist = video/sis315_init.c;
|
||||
mips_loongson = commands/keylayouts.c;
|
||||
|
||||
powerpc_ieee1275 = kern/powerpc/cache.S;
|
||||
powerpc_ieee1275 = kern/powerpc/dl.c;
|
||||
powerpc_ieee1275 = kern/powerpc/compiler-rt.S;
|
||||
|
||||
sparc64_ieee1275 = kern/sparc64/cache.S;
|
||||
sparc64_ieee1275 = kern/sparc64/dl.c;
|
||||
@@ -237,6 +267,11 @@ kernel = {
|
||||
arm = kern/arm/cache.c;
|
||||
arm = kern/arm/misc.S;
|
||||
|
||||
arm64 = kern/arm64/cache.c;
|
||||
arm64 = kern/arm64/cache_flush.S;
|
||||
arm64 = kern/arm64/dl.c;
|
||||
arm64 = kern/arm64/dl_helper.c;
|
||||
|
||||
emu = disk/host.c;
|
||||
emu = kern/emu/cache_s.S;
|
||||
emu = kern/emu/hostdisk.c;
|
||||
@@ -255,6 +290,9 @@ kernel = {
|
||||
emu = osdep/emuconsole.c;
|
||||
extra_dist = osdep/unix/emuconsole.c;
|
||||
extra_dist = osdep/windows/emuconsole.c;
|
||||
emu = osdep/dl.c;
|
||||
extra_dist = osdep/unix/dl.c;
|
||||
extra_dist = osdep/windows/dl.c;
|
||||
emu = osdep/sleep.c;
|
||||
emu = osdep/init.c;
|
||||
emu = osdep/emunet.c;
|
||||
@@ -409,9 +447,9 @@ image = {
|
||||
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -DGRUB_EMBED_DECOMPRESSOR=1';
|
||||
|
||||
objcopyflags = '-O binary';
|
||||
mips_ldflags = '-static-libgcc -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '-lgcc';
|
||||
cflags = '-Wno-unreachable-code -static-libgcc';
|
||||
mips_ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '$(TARGET_LIBGCC)';
|
||||
cflags = '-Wno-unreachable-code $(TARGET_LDFLAGS_STATIC_LIBGCC)';
|
||||
enable = mips;
|
||||
};
|
||||
|
||||
@@ -423,9 +461,9 @@ image = {
|
||||
cppflags = '-DGRUB_EMBED_DECOMPRESSOR=1';
|
||||
|
||||
objcopyflags = '-O binary';
|
||||
mips_ldflags = '-static-libgcc -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '-lgcc';
|
||||
cflags = '-static-libgcc';
|
||||
mips_ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) -Wl,-Ttext,$(TARGET_DECOMPRESSOR_LINK_ADDR)';
|
||||
ldadd = '$(TARGET_LIBGCC)';
|
||||
cflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC)';
|
||||
enable = mips;
|
||||
};
|
||||
|
||||
@@ -443,7 +481,7 @@ image = {
|
||||
name = fwstart;
|
||||
mips_loongson = boot/mips/loongson/fwstart.S;
|
||||
objcopyflags = '-O binary';
|
||||
ldflags = '-static-libgcc -lgcc -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) $(TARGET_LIBGCC) -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
enable = mips_loongson;
|
||||
};
|
||||
|
||||
@@ -451,10 +489,16 @@ image = {
|
||||
name = fwstart_fuloong2f;
|
||||
mips_loongson = boot/mips/loongson/fuloong2f.S;
|
||||
objcopyflags = '-O binary';
|
||||
ldflags = '-static-libgcc -lgcc -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
ldflags = '$(TARGET_LDFLAGS_STATIC_LIBGCC) $(TARGET_LIBGCC) -Wl,-N,-S,-Ttext,0xbfc00000,-Bstatic';
|
||||
enable = mips_loongson;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = disk;
|
||||
common = lib/disk.c;
|
||||
extra_dist = kern/disk_common.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = trig;
|
||||
common_nodist = trigtables.c;
|
||||
@@ -491,6 +535,7 @@ module = {
|
||||
module = {
|
||||
name = emuusb;
|
||||
common = bus/usb/usb.c;
|
||||
enable = emu;
|
||||
condition = COND_GRUB_EMU_USB;
|
||||
};
|
||||
|
||||
@@ -539,6 +584,7 @@ module = {
|
||||
module = {
|
||||
name = pci;
|
||||
common = bus/pci.c;
|
||||
i386_ieee1275 = bus/i386/ieee1275/pci.c;
|
||||
|
||||
enable = i386_pc;
|
||||
enable = i386_ieee1275;
|
||||
@@ -560,6 +606,7 @@ module = {
|
||||
common = bus/emu/pci.c;
|
||||
common = commands/lspci.c;
|
||||
|
||||
enable = emu;
|
||||
condition = COND_GRUB_EMU_PCI;
|
||||
};
|
||||
|
||||
@@ -570,11 +617,12 @@ module = {
|
||||
enable = mips_arc;
|
||||
};
|
||||
|
||||
library = {
|
||||
name = libgnulib.a;
|
||||
common = gnulib/regex.c;
|
||||
cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
|
||||
cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)';
|
||||
module = {
|
||||
name = lsxen;
|
||||
common = commands/xen/lsxen.c;
|
||||
cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -628,8 +676,7 @@ module = {
|
||||
name = regexp;
|
||||
common = commands/regexp.c;
|
||||
common = commands/wildcard.c;
|
||||
ldadd = libgnulib.a;
|
||||
dependencies = libgnulib.a;
|
||||
common = gnulib/regex.c;
|
||||
cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
|
||||
cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB)';
|
||||
};
|
||||
@@ -712,6 +759,7 @@ module = {
|
||||
enable = mips_arc;
|
||||
enable = ia64_efi;
|
||||
enable = arm_efi;
|
||||
enable = arm64_efi;
|
||||
enable = arm_uboot;
|
||||
};
|
||||
|
||||
@@ -732,8 +780,10 @@ module = {
|
||||
|
||||
module = {
|
||||
name = cpuid;
|
||||
x86 = commands/i386/cpuid.c;
|
||||
common = commands/i386/cpuid.c;
|
||||
enable = x86;
|
||||
enable = i386_xen;
|
||||
enable = x86_64_xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -790,6 +840,8 @@ module = {
|
||||
i386_multiboot = lib/i386/halt.c;
|
||||
i386_coreboot = lib/i386/halt.c;
|
||||
i386_qemu = lib/i386/halt.c;
|
||||
xen = lib/xen/halt.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
efi = lib/efi/halt.c;
|
||||
ieee1275 = lib/ieee1275/halt.c;
|
||||
emu = lib/emu/halt.c;
|
||||
@@ -803,11 +855,14 @@ module = {
|
||||
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;
|
||||
sparc64_ieee1275 = lib/ieee1275/reboot.c;
|
||||
mips_arc = lib/mips/arc/reboot.c;
|
||||
mips_loongson = lib/mips/loongson/reboot.c;
|
||||
mips_qemu_mips = lib/mips/qemu_mips/reboot.c;
|
||||
xen = lib/xen/reboot.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
uboot = lib/uboot/reboot.c;
|
||||
common = commands/reboot.c;
|
||||
};
|
||||
@@ -1390,6 +1445,11 @@ module = {
|
||||
common = fs/zfs/zfsinfo.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = macbless;
|
||||
common = commands/macbless.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = pxe;
|
||||
i386_pc = net/drivers/i386/pc/pxe.c;
|
||||
@@ -1431,6 +1491,11 @@ module = {
|
||||
common = io/gzio.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = offsetio;
|
||||
common = io/offset.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = bufio;
|
||||
common = io/bufio.c;
|
||||
@@ -1464,13 +1529,21 @@ module = {
|
||||
x86 = lib/i386/relocator64.S;
|
||||
i386 = lib/i386/relocator_asm.S;
|
||||
x86_64 = lib/x86_64/relocator_asm.S;
|
||||
i386_xen = lib/i386/relocator_asm.S;
|
||||
x86_64_xen = lib/x86_64/relocator_asm.S;
|
||||
x86 = lib/i386/relocator.c;
|
||||
x86 = lib/i386/relocator_common_c.c;
|
||||
ieee1275 = lib/ieee1275/relocator.c;
|
||||
efi = lib/efi/relocator.c;
|
||||
mips = lib/mips/relocator_asm.S;
|
||||
mips = lib/mips/relocator.c;
|
||||
powerpc = lib/powerpc/relocator_asm.S;
|
||||
powerpc = lib/powerpc/relocator.c;
|
||||
xen = lib/xen/relocator.c;
|
||||
i386_xen = lib/i386/xen/relocator.S;
|
||||
x86_64_xen = lib/x86_64/xen/relocator.S;
|
||||
xen = lib/i386/relocator_common_c.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
extra_dist = lib/i386/relocator_common.S;
|
||||
extra_dist = kern/powerpc/cache_flush.S;
|
||||
@@ -1478,6 +1551,7 @@ module = {
|
||||
enable = mips;
|
||||
enable = powerpc;
|
||||
enable = x86;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1489,6 +1563,8 @@ module = {
|
||||
powerpc_ieee1275 = lib/ieee1275/datetime.c;
|
||||
sparc64_ieee1275 = lib/ieee1275/cmos.c;
|
||||
powerpc_ieee1275 = lib/ieee1275/cmos.c;
|
||||
xen = lib/xen/datetime.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
|
||||
mips_arc = lib/arc/datetime.c;
|
||||
enable = noemu;
|
||||
@@ -1505,6 +1581,7 @@ module = {
|
||||
extra_dist = lib/ia64/setjmp.S;
|
||||
extra_dist = lib/ia64/longjmp.S;
|
||||
extra_dist = lib/arm/setjmp.S;
|
||||
extra_dist = lib/arm64/setjmp.S;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -1546,6 +1623,14 @@ module = {
|
||||
enable = i386_pc;
|
||||
};
|
||||
|
||||
|
||||
module = {
|
||||
name = truecrypt;
|
||||
i386_pc = loader/i386/pc/truecrypt.c;
|
||||
enable = i386_pc;
|
||||
};
|
||||
|
||||
|
||||
module = {
|
||||
name = freedos;
|
||||
i386_pc = loader/i386/pc/freedos.c;
|
||||
@@ -1563,6 +1648,7 @@ module = {
|
||||
cppflags = "-DGRUB_USE_MULTIBOOT2";
|
||||
|
||||
common = loader/multiboot.c;
|
||||
common = lib/cmdline.c;
|
||||
common = loader/multiboot_mbi2.c;
|
||||
enable = x86;
|
||||
enable = mips;
|
||||
@@ -1571,6 +1657,7 @@ module = {
|
||||
module = {
|
||||
name = multiboot;
|
||||
common = loader/multiboot.c;
|
||||
common = lib/cmdline.c;
|
||||
x86 = loader/i386/multiboot_mbi.c;
|
||||
extra_dist = loader/multiboot_elfxx.c;
|
||||
enable = x86;
|
||||
@@ -1579,13 +1666,16 @@ module = {
|
||||
module = {
|
||||
name = linux;
|
||||
x86 = loader/i386/linux.c;
|
||||
xen = loader/i386/xen.c;
|
||||
xen_cppflags = '$(CPPFLAGS_XEN)';
|
||||
i386_pc = lib/i386/pc/vesa_modes_table.c;
|
||||
mips = loader/mips/linux.c;
|
||||
powerpc_ieee1275 = loader/powerpc/ieee1275/linux.c;
|
||||
sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c;
|
||||
ia64_efi = loader/ia64/efi/linux.c;
|
||||
arm = loader/arm/linux.c;
|
||||
arm = lib/fdt.c;
|
||||
arm64 = loader/arm64/linux.c;
|
||||
fdt = lib/fdt.c;
|
||||
common = loader/linux.c;
|
||||
common = lib/cmdline.c;
|
||||
enable = noemu;
|
||||
@@ -1595,16 +1685,21 @@ module = {
|
||||
name = xnu;
|
||||
x86 = loader/xnu_resume.c;
|
||||
x86 = loader/i386/xnu.c;
|
||||
x86 = loader/macho32.c;
|
||||
x86 = loader/macho64.c;
|
||||
x86 = loader/macho.c;
|
||||
x86 = loader/xnu.c;
|
||||
x86 = loader/lzss.c;
|
||||
|
||||
extra_dist = loader/machoXX.c;
|
||||
enable = x86;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = macho;
|
||||
|
||||
common = loader/macho.c;
|
||||
common = loader/macho32.c;
|
||||
common = loader/macho64.c;
|
||||
common = loader/lzss.c;
|
||||
extra_dist = loader/machoXX.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = appleldr;
|
||||
common = loader/efi/appleloader.c;
|
||||
@@ -1617,6 +1712,7 @@ module = {
|
||||
efi = loader/efi/chainloader.c;
|
||||
i386_pc = loader/i386/pc/chainloader.c;
|
||||
i386_coreboot = loader/i386/coreboot/chainloader.c;
|
||||
i386_coreboot = lib/LzmaDec.c;
|
||||
enable = i386_pc;
|
||||
enable = i386_coreboot;
|
||||
enable = efi;
|
||||
@@ -1638,6 +1734,7 @@ module = {
|
||||
enable = x86;
|
||||
enable = ia64_efi;
|
||||
enable = arm_efi;
|
||||
enable = arm64_efi;
|
||||
enable = mips;
|
||||
};
|
||||
|
||||
@@ -1659,6 +1756,7 @@ module = {
|
||||
common = normal/term.c;
|
||||
common = normal/context.c;
|
||||
common = normal/charset.c;
|
||||
common = lib/getline.c;
|
||||
|
||||
common = script/main.c;
|
||||
common = script/script.c;
|
||||
@@ -1842,6 +1940,42 @@ module = {
|
||||
common = tests/setjmp_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = signature_test;
|
||||
common = tests/signature_test.c;
|
||||
common = tests/signatures.h;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = sleep_test;
|
||||
common = tests/sleep_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = xnu_uuid_test;
|
||||
common = tests/xnu_uuid_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = pbkdf2_test;
|
||||
common = tests/pbkdf2_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = legacy_password_test;
|
||||
common = tests/legacy_password_test.c;
|
||||
enable = i386_pc;
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = div_test;
|
||||
common = tests/div_test.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = videotest_checksum;
|
||||
common = tests/videotest_checksum.c;
|
||||
@@ -1995,11 +2129,19 @@ module = {
|
||||
emu = lib/i386/pc/vesa_modes_table.c;
|
||||
i386_efi = lib/i386/pc/vesa_modes_table.c;
|
||||
x86_64_efi = lib/i386/pc/vesa_modes_table.c;
|
||||
xen = lib/i386/pc/vesa_modes_table.c;
|
||||
|
||||
enable = i386_pc;
|
||||
enable = i386_efi;
|
||||
enable = x86_64_efi;
|
||||
enable = emu;
|
||||
enable = xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = syslinuxcfg;
|
||||
common = lib/syslinux_parse.c;
|
||||
common = commands/syslinuxcfg.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2033,8 +2175,12 @@ module = {
|
||||
module = {
|
||||
name = backtrace;
|
||||
x86 = lib/i386/backtrace.c;
|
||||
i386_xen = lib/i386/backtrace.c;
|
||||
x86_64_xen = lib/i386/backtrace.c;
|
||||
common = lib/backtrace.c;
|
||||
enable = x86;
|
||||
enable = i386_xen;
|
||||
enable = x86_64_xen;
|
||||
};
|
||||
|
||||
module = {
|
||||
@@ -2140,3 +2286,15 @@ module = {
|
||||
name = progress;
|
||||
common = lib/progress.c;
|
||||
};
|
||||
|
||||
module = {
|
||||
name = file;
|
||||
common = commands/file.c;
|
||||
common = commands/file32.c;
|
||||
common = commands/file64.c;
|
||||
extra_dist = commands/fileXX.c;
|
||||
common = loader/i386/xen_file.c;
|
||||
common = loader/i386/xen_file32.c;
|
||||
common = loader/i386/xen_file64.c;
|
||||
extra_dist = loader/i386/xen_fileXX.c;
|
||||
};
|
||||
@@ -31,27 +31,32 @@
|
||||
.macro floppy
|
||||
part_start:
|
||||
|
||||
probe_values:
|
||||
LOCAL(probe_values):
|
||||
.byte 36, 18, 15, 9, 0
|
||||
|
||||
LOCAL(floppy_probe):
|
||||
pushw %dx
|
||||
/*
|
||||
* Perform floppy probe.
|
||||
*/
|
||||
|
||||
movw $probe_values - 1, %si
|
||||
#ifdef __APPLE__
|
||||
LOCAL(probe_values_minus_one) = LOCAL(probe_values) - 1
|
||||
movw MACRO_DOLLAR(LOCAL(probe_values_minus_one)), %si
|
||||
#else
|
||||
movw MACRO_DOLLAR(LOCAL(probe_values)) - 1, %si
|
||||
#endif
|
||||
|
||||
LOCAL(probe_loop):
|
||||
/* reset floppy controller INT 13h AH=0 */
|
||||
xorw %ax, %ax
|
||||
int $0x13
|
||||
int MACRO_DOLLAR(0x13)
|
||||
|
||||
incw %si
|
||||
movb (%si), %cl
|
||||
|
||||
/* if number of sectors is 0, display error and die */
|
||||
cmpb $0, %cl
|
||||
jne 1f
|
||||
testb %cl, %cl
|
||||
jnz 1f
|
||||
|
||||
/*
|
||||
* Floppy disk probe failure.
|
||||
@@ -64,20 +69,20 @@ fd_probe_error_string: .asciz "Floppy"
|
||||
|
||||
1:
|
||||
/* perform read */
|
||||
movw $GRUB_BOOT_MACHINE_BUFFER_SEG, %bx
|
||||
movw MACRO_DOLLAR(GRUB_BOOT_MACHINE_BUFFER_SEG), %bx
|
||||
movw %bx, %es
|
||||
xorw %bx, %bx
|
||||
movw $0x201, %ax
|
||||
movb $0, %ch
|
||||
movb $0, %dh
|
||||
int $0x13
|
||||
movw MACRO_DOLLAR(0x201), %ax
|
||||
movb MACRO_DOLLAR(0), %ch
|
||||
movb MACRO_DOLLAR(0), %dh
|
||||
int MACRO_DOLLAR(0x13)
|
||||
|
||||
/* if error, jump to "LOCAL(probe_loop)" */
|
||||
jc LOCAL(probe_loop)
|
||||
|
||||
/* %cl is already the correct value! */
|
||||
movb $1, %dh
|
||||
movb $79, %ch
|
||||
movb MACRO_DOLLAR(1), %dh
|
||||
movb MACRO_DOLLAR(79), %ch
|
||||
|
||||
jmp LOCAL(final_init)
|
||||
.endm
|
||||
@@ -180,7 +185,9 @@ kernel_address:
|
||||
#ifndef HYBRID_BOOT
|
||||
. = _start + GRUB_BOOT_MACHINE_KERNEL_SECTOR
|
||||
kernel_sector:
|
||||
.long 1, 0
|
||||
.long 1
|
||||
kernel_sector_high:
|
||||
.long 0
|
||||
#endif
|
||||
|
||||
. = _start + GRUB_BOOT_MACHINE_BOOT_DRIVE
|
||||
@@ -285,7 +292,7 @@ lba_mode:
|
||||
/* the absolute address */
|
||||
movl kernel_sector, %ebx
|
||||
movl %ebx, 8(%si)
|
||||
movl kernel_sector + 4, %ebx
|
||||
movl kernel_sector_high, %ebx
|
||||
movl %ebx, 12(%si)
|
||||
|
||||
/* the segment of buffer address */
|
||||
@@ -318,11 +325,12 @@ LOCAL(chs_mode):
|
||||
int $0x13
|
||||
jnc LOCAL(final_init)
|
||||
|
||||
popw %dx
|
||||
/*
|
||||
* The call failed, so maybe use the floppy probe instead.
|
||||
*/
|
||||
testb $GRUB_BOOT_MACHINE_BIOS_HD_FLAG, %dl
|
||||
jz LOCAL(floppy_probe)
|
||||
testb %dl, %dl
|
||||
jnb LOCAL(floppy_probe)
|
||||
|
||||
/* Nope, we definitely have a hard disk, and we're screwed. */
|
||||
ERR(hd_probe_error_string)
|
||||
@@ -353,7 +361,7 @@ LOCAL(final_init):
|
||||
|
||||
setup_sectors:
|
||||
/* load logical sector start (top half) */
|
||||
movl kernel_sector + 4, %eax
|
||||
movl kernel_sector_high, %eax
|
||||
|
||||
orl %eax, %eax
|
||||
jnz LOCAL(geometry_error)
|
||||
@@ -505,7 +513,9 @@ LOCAL(message):
|
||||
#ifdef HYBRID_BOOT
|
||||
. = _start + 0x1b0
|
||||
kernel_sector:
|
||||
.long 1, 0
|
||||
.long 1
|
||||
kernel_sector_high:
|
||||
.long 0
|
||||
#endif
|
||||
. = _start + GRUB_BOOT_MACHINE_WINDOWS_NT_MAGIC
|
||||
nt_magic:
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
|
||||
#include <config.h>
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/i386/pc/memory.h>
|
||||
#include <grub/machine/memory.h>
|
||||
#include <grub/machine/boot.h>
|
||||
#include <grub/machine/kernel.h>
|
||||
@@ -59,7 +58,7 @@ VARIABLE(grub_core_entry_addr)
|
||||
orb $0x02, %al
|
||||
outb $0x92
|
||||
1:
|
||||
movl grub_core_entry_addr, %edx
|
||||
movl EXT_C(grub_core_entry_addr), %edx
|
||||
jmp *%edx
|
||||
|
||||
#include "../../../kern/i386/realmode.S"
|
||||
|
||||
@@ -63,18 +63,18 @@ __start:
|
||||
This way we don't need to sacrifice a register for it. */
|
||||
retry_cs5536:
|
||||
/* We have only one bus (0). Function is 0. */
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_CONF_CTRL_REG_ADDR)
|
||||
lui $t1, %hi(GRUB_MACHINE_PCI_CONFSPACE)
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_CONF_CTRL_REG_ADDR_2F)
|
||||
lui $t1, %hi(GRUB_MACHINE_PCI_CONFSPACE_2F)
|
||||
lui $t3, %hi(GRUB_CS5536_PCIID)
|
||||
addiu $t3, $t3, %lo(GRUB_CS5536_PCIID)
|
||||
ori $t4, $zero, 1
|
||||
1:
|
||||
andi $t4, $t4, ((1 << GRUB_PCI_NUM_DEVICES) - 1)
|
||||
andi $t4, $t4, ((1 << GRUB_PCI_NUM_DEVICES_2F) - 1)
|
||||
/* In case of failure try again. CS5536 may be slow to come up. */
|
||||
beql $t4, $zero, retry_cs5536
|
||||
nop
|
||||
sw $t4, %lo(GRUB_MACHINE_PCI_CONF_CTRL_REG_ADDR) ($t0)
|
||||
lw $t2, (%lo(GRUB_MACHINE_PCI_CONFSPACE) + GRUB_PCI_REG_PCI_ID) ($t1)
|
||||
sw $t4, %lo(GRUB_MACHINE_PCI_CONF_CTRL_REG_ADDR_2F) ($t0)
|
||||
lw $t2, (%lo(GRUB_MACHINE_PCI_CONFSPACE_2F) + GRUB_PCI_REG_PCI_ID) ($t1)
|
||||
bnel $t2, $t3, 1b
|
||||
sll $t4, $t4, 1
|
||||
|
||||
@@ -86,9 +86,9 @@ retry_cs5536:
|
||||
move $a0, $t4
|
||||
#endif
|
||||
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_CONFSPACE)
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_CONFSPACE_2F)
|
||||
li $t1, GRUB_CS5536_MSR_MAILBOX_CONFIG_ENABLED
|
||||
sw $t1, (%lo(GRUB_MACHINE_PCI_CONFSPACE) + GRUB_CS5536_MSR_MAILBOX_CONFIG) ($t0)
|
||||
sw $t1, (%lo(GRUB_MACHINE_PCI_CONFSPACE_2F) + GRUB_CS5536_MSR_MAILBOX_CONFIG) ($t0)
|
||||
|
||||
/* Set GPIO LBAR. */
|
||||
lui $a0, %hi(GRUB_CS5536_MSR_GPIO_BAR)
|
||||
@@ -121,21 +121,21 @@ retry_cs5536:
|
||||
bal message
|
||||
addiu $a0, $a0, %lo(smbus_enabled)
|
||||
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS)
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_SMBUS)
|
||||
|
||||
/* Disable SMB. */
|
||||
sb $zero, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL2) ($t0)
|
||||
sb $zero, %lo(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL2) ($t0)
|
||||
|
||||
/* Disable interrupts. */
|
||||
sb $zero, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1) ($t0)
|
||||
sb $zero, %lo(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1) ($t0)
|
||||
|
||||
/* Set as master. */
|
||||
sb $zero, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_ADDR) ($t0)
|
||||
sb $zero, %lo(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_ADDR) ($t0)
|
||||
|
||||
/* Launch SMBus controller at slowest speed possible. */
|
||||
ori $t1, $zero, 0xff
|
||||
sb $t1, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL3) ($t0)
|
||||
sb $t1, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL2) ($t0)
|
||||
sb $t1, %lo(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL3) ($t0)
|
||||
sb $t1, %lo(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL2) ($t0)
|
||||
|
||||
/* Yeeloong and Fuloong2f have only one memory slot. */
|
||||
/* Output first byte on serial for debugging. */
|
||||
@@ -237,8 +237,8 @@ other_exception:
|
||||
addiu $a0, $a0, %lo(unhandled_exception)
|
||||
|
||||
gpio_init:
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO)
|
||||
addiu $t0, $t0, %lo(GRUB_MACHINE_PCI_IO_BASE + GRUB_CS5536_LBAR_GPIO)
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_GPIO)
|
||||
addiu $t0, $t0, %lo(GRUB_MACHINE_PCI_IO_BASE_2F + GRUB_CS5536_LBAR_GPIO)
|
||||
lui $t1, %hi (gpio_dump)
|
||||
addiu $t1, $t1, %lo (gpio_dump)
|
||||
|
||||
@@ -368,18 +368,18 @@ self:
|
||||
Clobbered: $t0
|
||||
*/
|
||||
wrmsr:
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_CONFSPACE)
|
||||
sw $a0, (%lo(GRUB_MACHINE_PCI_CONFSPACE) + GRUB_CS5536_MSR_MAILBOX_ADDR) ($t0)
|
||||
sw $a1, (%lo(GRUB_MACHINE_PCI_CONFSPACE) + GRUB_CS5536_MSR_MAILBOX_DATA0) ($t0)
|
||||
lui $t0, %hi(GRUB_MACHINE_PCI_CONFSPACE_2F)
|
||||
sw $a0, (%lo(GRUB_MACHINE_PCI_CONFSPACE_2F) + GRUB_CS5536_MSR_MAILBOX_ADDR) ($t0)
|
||||
sw $a1, (%lo(GRUB_MACHINE_PCI_CONFSPACE_2F) + GRUB_CS5536_MSR_MAILBOX_DATA0) ($t0)
|
||||
jr $ra
|
||||
sw $a2, (%lo(GRUB_MACHINE_PCI_CONFSPACE) + GRUB_CS5536_MSR_MAILBOX_DATA1) ($t0)
|
||||
sw $a2, (%lo(GRUB_MACHINE_PCI_CONFSPACE_2F) + GRUB_CS5536_MSR_MAILBOX_DATA1) ($t0)
|
||||
|
||||
/* Wait for SMBus data or empty transmitter. */
|
||||
/* In: $a0 = exception handler. Out: none. Clobbered: $t0, $t1 */
|
||||
smbus_wait:
|
||||
1:
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_STATUS + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lb $t0, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_STATUS + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_STATUS + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
lb $t0, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_STATUS + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
andi $t1, $t0, GRUB_CS5536_SMB_REG_STATUS_SDAST
|
||||
bne $t1, $zero, return
|
||||
nop
|
||||
@@ -401,52 +401,52 @@ read_spd:
|
||||
addiu $a0, $a0, %hi(read_spd_fail)
|
||||
|
||||
/* Send START. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
ori $t1, $t1, GRUB_CS5536_SMB_REG_CTRL1_START
|
||||
bal smbus_wait
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
/* Send device address. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
sll $t1, $a1, 1
|
||||
bal smbus_wait
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
/* Send ACK. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
ori $t1, $t1, GRUB_CS5536_SMB_REG_CTRL1_ACK
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
/* Send byte address. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
bal smbus_wait
|
||||
sb $t2, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t2, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
/* Send START. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
ori $t1, $t1, GRUB_CS5536_SMB_REG_CTRL1_START
|
||||
bal smbus_wait
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
/* Send device address. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
sll $t1, $a1, 1
|
||||
ori $t1, $t1, 1
|
||||
bal smbus_wait
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
/* Send STOP. */
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
lb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
ori $t1, $t1, GRUB_CS5536_SMB_REG_CTRL1_STOP
|
||||
bal smbus_wait
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
sb $t1, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_CTRL1 + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE)
|
||||
lb $v0, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE) ($t0)
|
||||
lui $t0, %hi(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F)
|
||||
lb $v0, %lo(GRUB_CS5536_LBAR_SMBUS + GRUB_CS5536_SMB_REG_DATA + GRUB_MACHINE_PCI_IO_BASE_2F) ($t0)
|
||||
jr $t3
|
||||
andi $v0, $v0, 0xff
|
||||
read_spd_fail:
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
.extern __bss_start
|
||||
.extern _end
|
||||
.extern _edata
|
||||
|
||||
.globl __start, _start, start
|
||||
.set noreorder
|
||||
@@ -248,8 +249,9 @@ cmdlinedone:
|
||||
#include "../../kern/mips/cache_flush.S"
|
||||
|
||||
/* Decompress the payload. */
|
||||
lui $a0, %hi(__bss_start)
|
||||
addiu $a0, $a0, %lo(__bss_start)
|
||||
lui $a0, %hi(_edata)
|
||||
addiu $a0, $a0, %lo(_edata)
|
||||
|
||||
lui $t0, %hi(base)
|
||||
addiu $t0, $t0, %lo(base)
|
||||
subu $a0, $a0, $t0
|
||||
@@ -265,16 +267,16 @@ cmdlinedone:
|
||||
*/
|
||||
move $s6, $a3
|
||||
|
||||
lui $t0, %hi(EXT_C(grub_decompress_core))
|
||||
addiu $t0, $t0, %lo(EXT_C(grub_decompress_core))
|
||||
lui $t9, %hi(EXT_C(grub_decompress_core))
|
||||
addiu $t9, $t9, %lo(EXT_C(grub_decompress_core))
|
||||
|
||||
#ifdef GRUB_MACHINE_ARC
|
||||
lui $sp, %hi(_start - 512)
|
||||
jalr $t0
|
||||
jalr $t9
|
||||
addiu $sp, $sp, %lo(_start - 512)
|
||||
#else
|
||||
lui $sp, %hi(_start - 256)
|
||||
jalr $t0
|
||||
jalr $t9
|
||||
addiu $sp, $sp, %lo(_start - 256)
|
||||
#endif
|
||||
move $a0, $s1
|
||||
@@ -287,3 +289,11 @@ cmdlinedone:
|
||||
|
||||
jr $t1
|
||||
nop
|
||||
/* Ensure that .data section is created. In code we suppose that _edata
|
||||
is first location not in decompressor image. Strictly speaking it's
|
||||
_edata only when .data is present and _etext otherwise. But checking
|
||||
for .data presence would cost more in code than it is to ensure that
|
||||
.data is created.
|
||||
*/
|
||||
.data
|
||||
.long 0
|
||||
@@ -44,11 +44,11 @@ pic_base:
|
||||
. = _start + GRUB_BOOT_MACHINE_BOOT_DEVPATH
|
||||
boot_path:
|
||||
. = _start + GRUB_BOOT_MACHINE_KERNEL_BYTE
|
||||
kernel_byte: .xword (2 << 9)
|
||||
boot_path_end:
|
||||
kernel_byte: .xword (2 << 9)
|
||||
kernel_address: .word GRUB_BOOT_MACHINE_KERNEL_ADDR
|
||||
#else
|
||||
#define boot_path (_start + 512)
|
||||
#define boot_path (_start + 512 + SCRATCH_PAD_BOOT_SIZE)
|
||||
#define boot_path_end (_start + 1024)
|
||||
#include <grub/offsets.h>
|
||||
|
||||
@@ -140,7 +140,11 @@ prom_call:
|
||||
|
||||
boot_continue:
|
||||
mov %o7, PIC_REG /* PIC base */
|
||||
#ifndef CDBOOT
|
||||
sethi %hi(SCRATCH_PAD_BOOT), %l1 /* OF argument slots */
|
||||
#else
|
||||
GET_ABS(_start + 512, %l1) /* OF argument slots */
|
||||
#endif
|
||||
|
||||
/* Find the /chosen node so we can fetch the stdout handle,
|
||||
* and thus perform console output.
|
||||
|
||||
+113
-36
@@ -30,8 +30,66 @@ static grub_addr_t addr_win[GRUB_MACHINE_PCI_NUM_WIN] =
|
||||
{GRUB_MACHINE_PCI_WIN1_ADDR, GRUB_MACHINE_PCI_WIN2_ADDR,
|
||||
GRUB_MACHINE_PCI_WIN3_ADDR};
|
||||
|
||||
grub_bonito_type_t grub_bonito_type;
|
||||
|
||||
static volatile void *
|
||||
config_addr (grub_pci_address_t addr)
|
||||
{
|
||||
if (grub_bonito_type == GRUB_BONITO_2F)
|
||||
{
|
||||
GRUB_MACHINE_PCI_CONF_CTRL_REG_2F = 1 << ((addr >> 11) & 0xf);
|
||||
return (volatile void *) (GRUB_MACHINE_PCI_CONFSPACE_2F
|
||||
| (addr & 0x07ff));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (addr >> 16)
|
||||
return (volatile void *) (GRUB_MACHINE_PCI_CONFSPACE_3A_EXT | addr);
|
||||
else
|
||||
return (volatile void *) (GRUB_MACHINE_PCI_CONFSPACE_3A | addr);
|
||||
}
|
||||
}
|
||||
|
||||
grub_uint32_t
|
||||
grub_pci_read (grub_pci_address_t addr)
|
||||
{
|
||||
return *(volatile grub_uint32_t *) config_addr (addr);
|
||||
}
|
||||
|
||||
grub_uint16_t
|
||||
grub_pci_read_word (grub_pci_address_t addr)
|
||||
{
|
||||
return *(volatile grub_uint16_t *) config_addr (addr);
|
||||
}
|
||||
|
||||
grub_uint8_t
|
||||
grub_pci_read_byte (grub_pci_address_t addr)
|
||||
{
|
||||
return *(volatile grub_uint8_t *) config_addr (addr);
|
||||
}
|
||||
|
||||
void
|
||||
grub_pci_write (grub_pci_address_t addr, grub_uint32_t data)
|
||||
{
|
||||
*(volatile grub_uint32_t *) config_addr (addr) = data;
|
||||
}
|
||||
|
||||
void
|
||||
grub_pci_write_word (grub_pci_address_t addr, grub_uint16_t data)
|
||||
{
|
||||
*(volatile grub_uint16_t *) config_addr (addr) = data;
|
||||
}
|
||||
|
||||
void
|
||||
grub_pci_write_byte (grub_pci_address_t addr, grub_uint8_t data)
|
||||
{
|
||||
*(volatile grub_uint8_t *) config_addr (addr) = data;
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
write_bases (void)
|
||||
write_bases_2f (void)
|
||||
{
|
||||
int i;
|
||||
grub_uint32_t reg = 0;
|
||||
@@ -39,38 +97,54 @@ write_bases (void)
|
||||
reg |= (((base_win[i] >> GRUB_MACHINE_PCI_WIN_SHIFT)
|
||||
& GRUB_MACHINE_PCI_WIN_MASK)
|
||||
<< (i * GRUB_MACHINE_PCI_WIN_MASK_SIZE));
|
||||
GRUB_MACHINE_PCI_IO_CTRL_REG = reg;
|
||||
GRUB_MACHINE_PCI_IO_CTRL_REG_2F = reg;
|
||||
}
|
||||
|
||||
volatile void *
|
||||
grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
grub_addr_t base, grub_size_t size)
|
||||
{
|
||||
int i;
|
||||
grub_addr_t newbase;
|
||||
if (grub_bonito_type == GRUB_BONITO_2F)
|
||||
{
|
||||
int i;
|
||||
grub_addr_t newbase;
|
||||
|
||||
/* First try already used registers. */
|
||||
for (i = 0; i < GRUB_MACHINE_PCI_NUM_WIN; i++)
|
||||
if (usage_win[i] && base_win[i] <= base
|
||||
&& base_win[i] + sizes_win[i] > base + size)
|
||||
{
|
||||
usage_win[i]++;
|
||||
return (void *)
|
||||
(addr_win[i] | (base & GRUB_MACHINE_PCI_WIN_OFFSET_MASK));
|
||||
}
|
||||
/* Map new register. */
|
||||
newbase = base & ~GRUB_MACHINE_PCI_WIN_OFFSET_MASK;
|
||||
for (i = 0; i < GRUB_MACHINE_PCI_NUM_WIN; i++)
|
||||
if (!usage_win[i] && newbase <= base
|
||||
&& newbase + sizes_win[i] > base + size)
|
||||
{
|
||||
usage_win[i]++;
|
||||
base_win[i] = newbase;
|
||||
write_bases ();
|
||||
return (void *)
|
||||
(addr_win[i] | (base & GRUB_MACHINE_PCI_WIN_OFFSET_MASK));
|
||||
}
|
||||
grub_fatal ("Out of PCI windows.");
|
||||
/* First try already used registers. */
|
||||
for (i = 0; i < GRUB_MACHINE_PCI_NUM_WIN; i++)
|
||||
if (usage_win[i] && base_win[i] <= base
|
||||
&& base_win[i] + sizes_win[i] > base + size)
|
||||
{
|
||||
usage_win[i]++;
|
||||
return (void *)
|
||||
(addr_win[i] | (base & GRUB_MACHINE_PCI_WIN_OFFSET_MASK));
|
||||
}
|
||||
/* Map new register. */
|
||||
newbase = base & ~GRUB_MACHINE_PCI_WIN_OFFSET_MASK;
|
||||
for (i = 0; i < GRUB_MACHINE_PCI_NUM_WIN; i++)
|
||||
if (!usage_win[i] && newbase <= base
|
||||
&& newbase + sizes_win[i] > base + size)
|
||||
{
|
||||
usage_win[i]++;
|
||||
base_win[i] = newbase;
|
||||
write_bases_2f ();
|
||||
return (void *)
|
||||
(addr_win[i] | (base & GRUB_MACHINE_PCI_WIN_OFFSET_MASK));
|
||||
}
|
||||
grub_fatal ("Out of PCI windows.");
|
||||
}
|
||||
else
|
||||
{
|
||||
int region = 0;
|
||||
if (base >= 0x10000000
|
||||
&& base + size <= 0x18000000)
|
||||
region = 1;
|
||||
if (base >= 0x1c000000
|
||||
&& base + size <= 0x1f000000)
|
||||
region = 2;
|
||||
if (region == 0)
|
||||
grub_fatal ("Attempt to map out of regions");
|
||||
return (void *) (0xa0000000 | base);
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
@@ -86,14 +160,17 @@ grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
volatile void *mem,
|
||||
grub_size_t size __attribute__ ((unused)))
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < GRUB_MACHINE_PCI_NUM_WIN; i++)
|
||||
if (usage_win[i] && addr_win[i]
|
||||
== (((grub_addr_t) mem | 0x20000000)
|
||||
& ~GRUB_MACHINE_PCI_WIN_OFFSET_MASK))
|
||||
{
|
||||
usage_win[i]--;
|
||||
return;
|
||||
}
|
||||
grub_fatal ("Tried to unmap not mapped region");
|
||||
if (grub_bonito_type == GRUB_BONITO_2F)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < GRUB_MACHINE_PCI_NUM_WIN; i++)
|
||||
if (usage_win[i] && addr_win[i]
|
||||
== (((grub_addr_t) mem | 0x20000000)
|
||||
& ~GRUB_MACHINE_PCI_WIN_OFFSET_MASK))
|
||||
{
|
||||
usage_win[i]--;
|
||||
return;
|
||||
}
|
||||
grub_fatal ("Tried to unmap not mapped region");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 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/pci.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/ieee1275/ieee1275.h>
|
||||
|
||||
volatile void *
|
||||
grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
grub_addr_t base,
|
||||
grub_size_t size)
|
||||
{
|
||||
if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_REAL_MODE))
|
||||
return (volatile void *) base;
|
||||
if (grub_ieee1275_map (base, base, size, 7))
|
||||
grub_fatal ("couldn't map 0x%lx", base);
|
||||
return (volatile void *) base;
|
||||
}
|
||||
|
||||
void
|
||||
grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
|
||||
volatile void *mem __attribute__ ((unused)),
|
||||
grub_size_t size __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
+46
-33
@@ -534,11 +534,20 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||
"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_BUS_MASTER | grub_pci_read_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");
|
||||
}
|
||||
@@ -661,23 +670,23 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||
for (i = 0; i < (GRUB_EHCI_N_TD - 1); i++)
|
||||
{
|
||||
e->td_virt[i].link_td = e->td_phys + (i + 1) * sizeof (struct grub_ehci_td);
|
||||
e->td_virt[i].next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
e->td_virt[i].alt_next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
e->td_virt[i].next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
e->td_virt[i].alt_next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
}
|
||||
e->td_virt[GRUB_EHCI_N_TD - 1].next_td =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
e->td_virt[GRUB_EHCI_N_TD - 1].alt_next_td =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
e->tdfree_virt = e->td_virt;
|
||||
/* Set Terminate in first QH, which is used in framelist */
|
||||
e->qh_virt[0].qh_hptr = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE | GRUB_EHCI_HPTR_TYPE_QH);
|
||||
e->qh_virt[0].td_overlay.next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
e->qh_virt[0].qh_hptr = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE | GRUB_EHCI_HPTR_TYPE_QH);
|
||||
e->qh_virt[0].td_overlay.next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
e->qh_virt[0].td_overlay.alt_next_td =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
/* Also set Halted bit in token */
|
||||
e->qh_virt[0].td_overlay.token = grub_cpu_to_le32 (GRUB_EHCI_STATUS_HALTED);
|
||||
e->qh_virt[0].td_overlay.token = grub_cpu_to_le32_compile_time (GRUB_EHCI_STATUS_HALTED);
|
||||
/* Set the H bit in first QH used for AL */
|
||||
e->qh_virt[1].ep_char = grub_cpu_to_le32 (GRUB_EHCI_H);
|
||||
e->qh_virt[1].ep_char = grub_cpu_to_le32_compile_time (GRUB_EHCI_H);
|
||||
/* Set Terminate into TD in rest of QHs and set horizontal link
|
||||
* pointer to itself - these QHs will be used for asynchronous
|
||||
* schedule and they should have valid value in horiz. link */
|
||||
@@ -688,12 +697,12 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||
e->qh_chunk) &
|
||||
GRUB_EHCI_POINTER_MASK) | GRUB_EHCI_HPTR_TYPE_QH);
|
||||
e->qh_virt[i].td_overlay.next_td =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
e->qh_virt[i].td_overlay.alt_next_td =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
/* Also set Halted bit in token */
|
||||
e->qh_virt[i].td_overlay.token =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_STATUS_HALTED);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_STATUS_HALTED);
|
||||
}
|
||||
|
||||
/* Note: QH 0 and QH 1 are reserved and must not be used anywhere.
|
||||
@@ -982,7 +991,7 @@ grub_ehci_find_qh (struct grub_ehci *e, grub_usb_transfer_t transfer)
|
||||
target = ((transfer->endpoint << GRUB_EHCI_EP_NUM_OFF) |
|
||||
transfer->devaddr) & GRUB_EHCI_TARGET_MASK;
|
||||
target = grub_cpu_to_le32 (target);
|
||||
mask = grub_cpu_to_le32 (GRUB_EHCI_TARGET_MASK);
|
||||
mask = grub_cpu_to_le32_compile_time (GRUB_EHCI_TARGET_MASK);
|
||||
|
||||
/* low speed interrupt transfers are linked to the periodic */
|
||||
/* schedule, everything else to the asynchronous schedule */
|
||||
@@ -1191,7 +1200,7 @@ grub_ehci_transaction (struct grub_ehci *e,
|
||||
grub_memset ((void *) td, 0, sizeof (struct grub_ehci_td));
|
||||
|
||||
/* Don't point to any TD yet, just terminate. */
|
||||
td->next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
td->next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
/* Set alternate pointer. When short packet occurs, alternate TD
|
||||
* will not be really fetched because it is not active. But don't
|
||||
* forget, EHCI will try to fetch alternate TD every scan of AL
|
||||
@@ -1316,9 +1325,9 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
|
||||
/* Fill whole alternate TD by zeros (= inactive) and set
|
||||
* Terminate bits and Halt bit */
|
||||
grub_memset ((void *) cdata->td_alt_virt, 0, sizeof (struct grub_ehci_td));
|
||||
cdata->td_alt_virt->next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
cdata->td_alt_virt->alt_next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
cdata->td_alt_virt->token = grub_cpu_to_le32 (GRUB_EHCI_STATUS_HALTED);
|
||||
cdata->td_alt_virt->next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
cdata->td_alt_virt->alt_next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
cdata->td_alt_virt->token = grub_cpu_to_le32_compile_time (GRUB_EHCI_STATUS_HALTED);
|
||||
|
||||
/* Allocate appropriate number of TDs and set */
|
||||
for (i = 0; i < transfer->transcnt; i++)
|
||||
@@ -1355,7 +1364,7 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
|
||||
cdata->td_last_virt = td;
|
||||
cdata->td_last_phys = grub_dma_virt2phys (td, e->td_chunk);
|
||||
/* Last TD should not have set alternate TD */
|
||||
cdata->td_last_virt->alt_next_td = grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
cdata->td_last_virt->alt_next_td = grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
|
||||
grub_dprintf ("ehci", "setup_transfer: cdata=%p, qh=%p\n",
|
||||
cdata,cdata->qh_virt);
|
||||
@@ -1368,14 +1377,14 @@ grub_ehci_setup_transfer (grub_usb_controller_t dev,
|
||||
/* Start transfer: */
|
||||
/* Unlink possible alternate pointer in QH */
|
||||
cdata->qh_virt->td_overlay.alt_next_td =
|
||||
grub_cpu_to_le32 (GRUB_EHCI_TERMINATE);
|
||||
grub_cpu_to_le32_compile_time (GRUB_EHCI_TERMINATE);
|
||||
/* Link new TDs with QH via next_td */
|
||||
cdata->qh_virt->td_overlay.next_td =
|
||||
grub_cpu_to_le32 (grub_dma_virt2phys
|
||||
(cdata->td_first_virt, e->td_chunk));
|
||||
/* Reset Active and Halted bits in QH to activate Advance Queue,
|
||||
* i.e. reset token */
|
||||
cdata->qh_virt->td_overlay.token = grub_cpu_to_le32 (0);
|
||||
cdata->qh_virt->td_overlay.token = grub_cpu_to_le32_compile_time (0);
|
||||
|
||||
/* Finito */
|
||||
transfer->controller_data = cdata;
|
||||
@@ -1399,9 +1408,9 @@ grub_ehci_pre_finish_transfer (grub_usb_transfer_t transfer)
|
||||
* safely manipulate with QH TD part. */
|
||||
cdata->qh_virt->td_overlay.token = (cdata->qh_virt->td_overlay.token
|
||||
|
|
||||
grub_cpu_to_le32
|
||||
grub_cpu_to_le32_compile_time
|
||||
(GRUB_EHCI_STATUS_HALTED)) &
|
||||
grub_cpu_to_le32 (~GRUB_EHCI_STATUS_ACTIVE);
|
||||
grub_cpu_to_le32_compile_time (~GRUB_EHCI_STATUS_ACTIVE);
|
||||
|
||||
/* Print debug data here if necessary */
|
||||
|
||||
@@ -1504,7 +1513,7 @@ grub_ehci_check_transfer (grub_usb_controller_t dev,
|
||||
struct grub_ehci *e = dev->data;
|
||||
struct grub_ehci_transfer_controller_data *cdata =
|
||||
transfer->controller_data;
|
||||
grub_uint32_t token;
|
||||
grub_uint32_t token, token_ftd;
|
||||
|
||||
grub_dprintf ("ehci",
|
||||
"check_transfer: EHCI STATUS=%08x, cdata=%p, qh=%p\n",
|
||||
@@ -1532,13 +1541,18 @@ grub_ehci_check_transfer (grub_usb_controller_t dev,
|
||||
return grub_ehci_parse_notrun (dev, transfer, actual);
|
||||
|
||||
token = grub_le_to_cpu32 (cdata->qh_virt->td_overlay.token);
|
||||
/* If the transfer consist from only one TD, we should check */
|
||||
/* if the TD was really executed and deactivated - to prevent */
|
||||
/* false detection of transfer finish. */
|
||||
token_ftd = grub_le_to_cpu32 (cdata->td_first_virt->token);
|
||||
|
||||
/* Detect QH halted */
|
||||
if ((token & GRUB_EHCI_STATUS_HALTED) != 0)
|
||||
return grub_ehci_parse_halt (dev, transfer, actual);
|
||||
|
||||
/* Detect QH not active - QH is not active and no next TD */
|
||||
if ((token & GRUB_EHCI_STATUS_ACTIVE) == 0)
|
||||
if (token && ((token & GRUB_EHCI_STATUS_ACTIVE) == 0)
|
||||
&& ((token_ftd & GRUB_EHCI_STATUS_ACTIVE) == 0))
|
||||
{
|
||||
/* It could be finish at all or short packet condition */
|
||||
if ((grub_le_to_cpu32 (cdata->qh_virt->td_overlay.next_td)
|
||||
@@ -1677,7 +1691,7 @@ grub_ehci_hubports (grub_usb_controller_t dev)
|
||||
return portinfo;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable)
|
||||
{
|
||||
@@ -1699,14 +1713,14 @@ grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while (grub_ehci_port_read (e, port) & GRUB_EHCI_PORT_ENABLED)
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO, "portstatus: EHCI Timed out - disable");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
|
||||
if (!enable) /* We don't need reset port */
|
||||
{
|
||||
grub_dprintf ("ehci", "portstatus: Disabled.\n");
|
||||
grub_dprintf ("ehci", "portstatus: end, status=0x%02x\n",
|
||||
grub_ehci_port_read (e, port));
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_dprintf ("ehci", "portstatus: enable\n");
|
||||
@@ -1724,8 +1738,7 @@ grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while (grub_ehci_port_read (e, port) & GRUB_EHCI_PORT_RESET)
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO,
|
||||
"portstatus: EHCI Timed out - reset port");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
grub_boot_time ("Port %d reset", port);
|
||||
/* Remember "we did the reset" - needed by detect_dev */
|
||||
e->reset |= (1 << port);
|
||||
@@ -1753,7 +1766,7 @@ grub_ehci_portstatus (grub_usb_controller_t dev,
|
||||
grub_dprintf ("ehci", "portstatus: end, status=0x%02x\n",
|
||||
grub_ehci_port_read (e, port));
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_speed_t
|
||||
@@ -1888,7 +1901,7 @@ grub_ehci_restore_hw (void)
|
||||
}
|
||||
}
|
||||
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -1911,7 +1924,7 @@ grub_ehci_fini_hw (int noreturn __attribute__ ((unused)))
|
||||
grub_ehci_reset (e);
|
||||
}
|
||||
|
||||
return GRUB_USB_ERR_NONE;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static struct grub_usb_controller_dev usb_controller = {
|
||||
|
||||
+23
-19
@@ -47,7 +47,7 @@ struct grub_ohci_hcca
|
||||
grub_uint32_t donehead;
|
||||
|
||||
grub_uint8_t reserved[116];
|
||||
} __attribute__((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
/* OHCI General Transfer Descriptor */
|
||||
struct grub_ohci_td
|
||||
@@ -64,7 +64,7 @@ struct grub_ohci_td
|
||||
* physical address in CPU endian */
|
||||
grub_uint32_t tr_index; /* index of TD in transfer */
|
||||
grub_uint8_t pad[8 - sizeof (volatile struct grub_ohci_td *)]; /* padding to 32 bytes */
|
||||
} __attribute__((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
/* OHCI Endpoint Descriptor. */
|
||||
struct grub_ohci_ed
|
||||
@@ -73,7 +73,7 @@ struct grub_ohci_ed
|
||||
grub_uint32_t td_tail;
|
||||
grub_uint32_t td_head;
|
||||
grub_uint32_t next_ed;
|
||||
} __attribute__((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
typedef volatile struct grub_ohci_td *grub_ohci_td_t;
|
||||
typedef volatile struct grub_ohci_ed *grub_ohci_ed_t;
|
||||
@@ -265,16 +265,20 @@ grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
|
||||
base = grub_pci_read (addr);
|
||||
|
||||
#if 0
|
||||
/* Stop if there is no IO space base address defined. */
|
||||
if (! (base & 1))
|
||||
return 0;
|
||||
#endif
|
||||
base &= GRUB_PCI_ADDR_MEM_MASK;
|
||||
if (!base)
|
||||
{
|
||||
grub_dprintf ("ehci",
|
||||
"EHCI: EHCI is not mapper\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_BUS_MASTER | grub_pci_read_word(addr));
|
||||
GRUB_PCI_COMMAND_MEM_ENABLED
|
||||
| GRUB_PCI_COMMAND_BUS_MASTER
|
||||
| grub_pci_read_word(addr));
|
||||
|
||||
grub_dprintf ("ohci", "class=0x%02x 0x%02x interface 0x%02x\n",
|
||||
class, subclass, interf);
|
||||
@@ -310,7 +314,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||
grub_memset ((void *) o->ed_ctrl, 0, sizeof (struct grub_ohci_ed)
|
||||
* GRUB_OHCI_CTRL_EDS);
|
||||
for (j=0; j < GRUB_OHCI_CTRL_EDS; j++)
|
||||
o->ed_ctrl[j].target = grub_cpu_to_le32 (1 << 14); /* skip */
|
||||
o->ed_ctrl[j].target = grub_cpu_to_le32_compile_time (1 << 14); /* skip */
|
||||
|
||||
grub_dprintf ("ohci", "EDs-C: chunk=%p, virt=%p, phys=0x%02x\n",
|
||||
o->ed_ctrl_chunk, o->ed_ctrl, o->ed_ctrl_addr);
|
||||
@@ -325,7 +329,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
|
||||
/* Preset EDs */
|
||||
grub_memset ((void*)o->ed_bulk, 0, sizeof(struct grub_ohci_ed) * GRUB_OHCI_BULK_EDS);
|
||||
for (j=0; j < GRUB_OHCI_BULK_EDS; j++)
|
||||
o->ed_bulk[j].target = grub_cpu_to_le32 (1 << 14); /* skip */
|
||||
o->ed_bulk[j].target = grub_cpu_to_le32_compile_time (1 << 14); /* skip */
|
||||
|
||||
grub_dprintf ("ohci", "EDs-B: chunk=%p, virt=%p, phys=0x%02x\n",
|
||||
o->ed_bulk_chunk, o->ed_bulk, o->ed_bulk_addr);
|
||||
@@ -1216,7 +1220,7 @@ grub_ohci_cancel_transfer (grub_usb_controller_t dev,
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable)
|
||||
{
|
||||
@@ -1236,11 +1240,11 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
while ((grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port)
|
||||
& (1 << 1)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO, "OHCI Timed out - disable");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
|
||||
grub_dprintf ("ohci", "end of portstatus=0x%02x\n",
|
||||
grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port));
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* OHCI does one reset signal 10ms long but USB spec.
|
||||
@@ -1257,7 +1261,7 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
while (! (grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port)
|
||||
& GRUB_OHCI_SET_PORT_RESET_STATUS_CHANGE))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO, "OHCI Timed out - reset");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
|
||||
/* End the reset signaling - reset the reset status change */
|
||||
grub_ohci_writereg32 (o, GRUB_OHCI_REG_RHUBPORT + port,
|
||||
@@ -1275,7 +1279,7 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
while (! (grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port)
|
||||
& (1 << 1)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO, "OHCI Timed out - enable");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
|
||||
/* Reset bit Connect Status Change */
|
||||
grub_ohci_writereg32 (o, GRUB_OHCI_REG_RHUBPORT + port,
|
||||
@@ -1287,7 +1291,7 @@ grub_ohci_portstatus (grub_usb_controller_t dev,
|
||||
grub_dprintf ("ohci", "end of portstatus=0x%02x\n",
|
||||
grub_ohci_readreg32 (o, GRUB_OHCI_REG_RHUBPORT + port));
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_speed_t
|
||||
@@ -1345,10 +1349,10 @@ grub_ohci_fini_hw (int noreturn __attribute__ ((unused)))
|
||||
/* Set skip in all EDs */
|
||||
if (o->ed_bulk)
|
||||
for (i=0; i < GRUB_OHCI_BULK_EDS; i++)
|
||||
o->ed_bulk[i].target |= grub_cpu_to_le32 (1 << 14); /* skip */
|
||||
o->ed_bulk[i].target |= grub_cpu_to_le32_compile_time (1 << 14); /* skip */
|
||||
if (o->ed_ctrl)
|
||||
for (i=0; i < GRUB_OHCI_CTRL_EDS; i++)
|
||||
o->ed_ctrl[i].target |= grub_cpu_to_le32 (1 << 14); /* skip */
|
||||
o->ed_ctrl[i].target |= grub_cpu_to_le32_compile_time (1 << 14); /* skip */
|
||||
|
||||
/* We should wait for next SOF to be sure that all EDs are
|
||||
* unaccessed by OHCI. But OHCI can be non-functional, so
|
||||
|
||||
@@ -91,11 +91,13 @@ real_config (struct grub_serial_port *port)
|
||||
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
GRUB_FTDI_MODEM_CTRL,
|
||||
GRUB_FTDI_MODEM_CTRL_DTRRTS, 0, 0, 0);
|
||||
port->config.rtscts ? GRUB_FTDI_MODEM_CTRL_DTRRTS : 0,
|
||||
0, 0, 0);
|
||||
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
GRUB_FTDI_FLOW_CTRL,
|
||||
GRUB_FTDI_FLOW_CTRL_DTRRTS, 0, 0, 0);
|
||||
port->config.rtscts ? GRUB_FTDI_FLOW_CTRL_DTRRTS : 0,
|
||||
0, 0, 0);
|
||||
|
||||
divisor = get_divisor (port->config.speed);
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
|
||||
@@ -55,7 +55,7 @@ struct grub_pl2303_config
|
||||
grub_uint8_t stop_bits;
|
||||
grub_uint8_t parity;
|
||||
grub_uint8_t word_len;
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
static void
|
||||
real_config (struct grub_serial_port *port)
|
||||
@@ -125,7 +125,7 @@ real_config (struct grub_serial_port *port)
|
||||
0x22, 3, 0, 0, 0);
|
||||
|
||||
grub_usb_control_msg (port->usbdev, GRUB_USB_REQTYPE_VENDOR_OUT,
|
||||
1, 0, 0x61, 0, 0);
|
||||
1, 0, port->config.rtscts ? 0x61 : 0, 0, 0);
|
||||
port->configured = 1;
|
||||
}
|
||||
|
||||
|
||||
+15
-20
@@ -105,7 +105,7 @@ struct grub_uhci_qh
|
||||
/* Queue heads are aligned on 16 bytes, pad so a queue head is 16
|
||||
bytes so we can store many in a 4K page. */
|
||||
grub_uint8_t pad[8];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
/* UHCI Transfer Descriptor. */
|
||||
struct grub_uhci_td
|
||||
@@ -129,7 +129,7 @@ struct grub_uhci_td
|
||||
|
||||
/* 3 additional 32 bits words reserved for the Host Controller Driver. */
|
||||
grub_uint32_t data[3];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
typedef volatile struct grub_uhci_td *grub_uhci_td_t;
|
||||
typedef volatile struct grub_uhci_qh *grub_uhci_qh_t;
|
||||
@@ -189,11 +189,6 @@ grub_uhci_writereg32 (struct grub_uhci *u,
|
||||
grub_outl (val, u->iobase + reg);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable);
|
||||
|
||||
|
||||
/* Iterate over all PCI devices. Determine if a device is an UHCI
|
||||
controller. If this is the case, initialize it. */
|
||||
static int
|
||||
@@ -222,12 +217,6 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
|
||||
if (class != 0x0c || subclass != 0x03 || interf != 0x00)
|
||||
return 0;
|
||||
|
||||
/* Set bus master - needed for coreboot or broken BIOSes */
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
||||
grub_pci_write_word(addr, GRUB_PCI_COMMAND_IO_ENABLED
|
||||
| GRUB_PCI_COMMAND_BUS_MASTER
|
||||
| grub_pci_read_word (addr));
|
||||
|
||||
/* Determine IO base address. */
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG4);
|
||||
base = grub_pci_read (addr);
|
||||
@@ -238,6 +227,13 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
|
||||
if ((base & GRUB_UHCI_IOMASK) == 0)
|
||||
return 0;
|
||||
|
||||
/* Set bus master - needed for coreboot or broken BIOSes */
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
||||
grub_pci_write_word(addr, GRUB_PCI_COMMAND_IO_ENABLED
|
||||
| GRUB_PCI_COMMAND_BUS_MASTER
|
||||
| GRUB_PCI_COMMAND_MEM_ENABLED
|
||||
| grub_pci_read_word (addr));
|
||||
|
||||
grub_dprintf ("uhci", "base = %x\n", base);
|
||||
|
||||
/* Allocate memory for the controller and register it. */
|
||||
@@ -715,7 +711,7 @@ grub_uhci_iterate (grub_usb_controller_iterate_hook_t hook, void *hook_data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
unsigned int port, unsigned int enable)
|
||||
{
|
||||
@@ -733,8 +729,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
else if (port == 1)
|
||||
reg = GRUB_UHCI_REG_PORTSC2;
|
||||
else
|
||||
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||
"UHCI Root Hub port does not exist");
|
||||
return GRUB_USB_ERR_INTERNAL;
|
||||
|
||||
status = grub_uhci_readreg16 (u, reg);
|
||||
grub_dprintf ("uhci", "detect=0x%02x\n", status);
|
||||
@@ -747,11 +742,11 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while ((grub_uhci_readreg16 (u, reg) & (1 << 2)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO, "UHCI Timed out - disable");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
|
||||
status = grub_uhci_readreg16 (u, reg);
|
||||
grub_dprintf ("uhci", ">3detect=0x%02x\n", status);
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Reset the port. */
|
||||
@@ -782,7 +777,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while (! ((status = grub_uhci_readreg16 (u, reg)) & (1 << 2)))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
return grub_error (GRUB_ERR_IO, "UHCI Timed out - enable");
|
||||
return GRUB_USB_ERR_TIMEOUT;
|
||||
|
||||
/* Reset recovery time */
|
||||
grub_millisleep (10);
|
||||
@@ -792,7 +787,7 @@ grub_uhci_portstatus (grub_usb_controller_t dev,
|
||||
grub_dprintf ("uhci", ">3detect=0x%02x\n", status);
|
||||
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_usb_speed_t
|
||||
|
||||
@@ -195,7 +195,7 @@ grub_usb_add_hub (grub_usb_device_t dev)
|
||||
|
||||
rescan = 1;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
return GRUB_USB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -203,7 +203,7 @@ attach_root_port (struct grub_usb_hub *hub, int portno,
|
||||
grub_usb_speed_t speed)
|
||||
{
|
||||
grub_usb_device_t dev;
|
||||
grub_err_t err;
|
||||
grub_usb_err_t err;
|
||||
|
||||
grub_boot_time ("After detect_dev");
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ grub_usb_bulk_maxpacket (grub_usb_device_t dev,
|
||||
struct grub_usb_desc_endp *endpoint)
|
||||
{
|
||||
/* Use the maximum packet size given in the endpoint descriptor. */
|
||||
if (dev->initialized && endpoint)
|
||||
if (dev->initialized && endpoint && (unsigned int) endpoint->maxpacket)
|
||||
return endpoint->maxpacket;
|
||||
|
||||
return 64;
|
||||
|
||||
@@ -227,7 +227,7 @@ grub_acpi_create_ebda (void)
|
||||
grub_dprintf ("acpi", "Copying rsdpv2 to %p\n", target);
|
||||
v2inebda = target;
|
||||
target += v2->length;
|
||||
target = (grub_uint8_t *) ((((long) target - 1) | 0xf) + 1);
|
||||
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
|
||||
v2 = 0;
|
||||
break;
|
||||
}
|
||||
@@ -246,7 +246,7 @@ grub_acpi_create_ebda (void)
|
||||
grub_dprintf ("acpi", "Copying rsdpv1 to %p\n", target);
|
||||
v1inebda = target;
|
||||
target += sizeof (struct grub_acpi_rsdp_v10);
|
||||
target = (grub_uint8_t *) ((((long) target - 1) | 0xf) + 1);
|
||||
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
|
||||
v1 = 0;
|
||||
break;
|
||||
}
|
||||
@@ -265,7 +265,7 @@ grub_acpi_create_ebda (void)
|
||||
grub_memcpy (target, v2, v2->length);
|
||||
v2inebda = target;
|
||||
target += v2->length;
|
||||
target = (grub_uint8_t *) ((((long) target - 1) | 0xf) + 1);
|
||||
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
|
||||
v2 = 0;
|
||||
break;
|
||||
}
|
||||
@@ -282,7 +282,7 @@ grub_acpi_create_ebda (void)
|
||||
grub_memcpy (target, v1, sizeof (struct grub_acpi_rsdp_v10));
|
||||
v1inebda = target;
|
||||
target += sizeof (struct grub_acpi_rsdp_v10);
|
||||
target = (grub_uint8_t *) ((((long) target - 1) | 0xf) + 1);
|
||||
target = (grub_uint8_t *) ((((grub_addr_t) target - 1) | 0xf) + 1);
|
||||
v1 = 0;
|
||||
break;
|
||||
}
|
||||
@@ -306,7 +306,7 @@ grub_acpi_create_ebda (void)
|
||||
*target = 0;
|
||||
|
||||
grub_dprintf ("acpi", "Switching EBDA\n");
|
||||
(*((grub_uint16_t *) 0x40e)) = ((long)targetebda) >> 4;
|
||||
(*((grub_uint16_t *) 0x40e)) = ((grub_addr_t) targetebda) >> 4;
|
||||
grub_dprintf ("acpi", "EBDA switched\n");
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -135,6 +135,49 @@ skip_data_ref_object (const grub_uint8_t *ptr, const grub_uint8_t *end)
|
||||
}
|
||||
}
|
||||
|
||||
static inline grub_uint32_t
|
||||
skip_term (const grub_uint8_t *ptr, const grub_uint8_t *end)
|
||||
{
|
||||
grub_uint32_t add;
|
||||
const grub_uint8_t *ptr0 = ptr;
|
||||
|
||||
switch(*ptr)
|
||||
{
|
||||
case GRUB_ACPI_OPCODE_ADD:
|
||||
case GRUB_ACPI_OPCODE_AND:
|
||||
case GRUB_ACPI_OPCODE_CONCAT:
|
||||
case GRUB_ACPI_OPCODE_CONCATRES:
|
||||
case GRUB_ACPI_OPCODE_DIVIDE:
|
||||
case GRUB_ACPI_OPCODE_INDEX:
|
||||
case GRUB_ACPI_OPCODE_LSHIFT:
|
||||
case GRUB_ACPI_OPCODE_MOD:
|
||||
case GRUB_ACPI_OPCODE_MULTIPLY:
|
||||
case GRUB_ACPI_OPCODE_NAND:
|
||||
case GRUB_ACPI_OPCODE_NOR:
|
||||
case GRUB_ACPI_OPCODE_OR:
|
||||
case GRUB_ACPI_OPCODE_RSHIFT:
|
||||
case GRUB_ACPI_OPCODE_SUBTRACT:
|
||||
case GRUB_ACPI_OPCODE_TOSTRING:
|
||||
case GRUB_ACPI_OPCODE_XOR:
|
||||
/*
|
||||
* Parameters for these opcodes: TermArg, TermArg Target, see ACPI
|
||||
* spec r5.0, page 828f.
|
||||
*/
|
||||
ptr++;
|
||||
ptr += add = skip_term (ptr, end);
|
||||
if (!add)
|
||||
return 0;
|
||||
ptr += add = skip_term (ptr, end);
|
||||
if (!add)
|
||||
return 0;
|
||||
ptr += skip_name_string (ptr, end);
|
||||
break;
|
||||
default:
|
||||
return skip_data_ref_object (ptr, end);
|
||||
}
|
||||
return ptr - ptr0;
|
||||
}
|
||||
|
||||
static inline grub_uint32_t
|
||||
skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end)
|
||||
{
|
||||
@@ -156,10 +199,10 @@ skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end)
|
||||
ptr++;
|
||||
ptr += skip_name_string (ptr, end);
|
||||
ptr++;
|
||||
ptr += add = skip_data_ref_object (ptr, end);
|
||||
ptr += add = skip_term (ptr, end);
|
||||
if (!add)
|
||||
return 0;
|
||||
ptr += add = skip_data_ref_object (ptr, end);
|
||||
ptr += add = skip_term (ptr, end);
|
||||
if (!add)
|
||||
return 0;
|
||||
break;
|
||||
@@ -180,6 +223,7 @@ skip_ext_op (const grub_uint8_t *ptr, const grub_uint8_t *end)
|
||||
return ptr - ptr0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end,
|
||||
grub_uint8_t *scope, int scope_len)
|
||||
@@ -214,8 +258,8 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end,
|
||||
}
|
||||
case GRUB_ACPI_OPCODE_NAME:
|
||||
ptr++;
|
||||
if ((!scope || memcmp (scope, "\\", scope_len) == 0) &&
|
||||
(memcmp (ptr, "_S5_", 4) == 0 || memcmp (ptr, "\\_S5_", 4) == 0))
|
||||
if ((!scope || grub_memcmp (scope, "\\", scope_len) == 0) &&
|
||||
(grub_memcmp (ptr, "_S5_", 4) == 0 || grub_memcmp (ptr, "\\_S5_", 4) == 0))
|
||||
{
|
||||
int ll;
|
||||
grub_uint8_t *ptr2 = ptr;
|
||||
@@ -250,6 +294,17 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *ptr, grub_uint8_t *end,
|
||||
if (!add)
|
||||
return -1;
|
||||
break;
|
||||
case GRUB_ACPI_OPCODE_ALIAS:
|
||||
ptr++;
|
||||
/* We need to skip two name strings */
|
||||
ptr += add = skip_name_string (ptr, end);
|
||||
if (!add)
|
||||
return -1;
|
||||
ptr += add = skip_name_string (ptr, end);
|
||||
if (!add)
|
||||
return -1;
|
||||
break;
|
||||
|
||||
case GRUB_ACPI_OPCODE_SCOPE:
|
||||
{
|
||||
int scope_sleep_type;
|
||||
|
||||
@@ -62,23 +62,47 @@ read_blocklist (grub_disk_addr_t sector, unsigned offset, unsigned length,
|
||||
if (ctx->num_sectors > 0)
|
||||
{
|
||||
if (ctx->start_sector + ctx->num_sectors == sector
|
||||
&& offset == 0 && length == GRUB_DISK_SECTOR_SIZE)
|
||||
&& offset == 0 && length >= GRUB_DISK_SECTOR_SIZE)
|
||||
{
|
||||
ctx->num_sectors++;
|
||||
return;
|
||||
ctx->num_sectors += length >> GRUB_DISK_SECTOR_BITS;
|
||||
sector += length >> GRUB_DISK_SECTOR_BITS;
|
||||
length &= (GRUB_DISK_SECTOR_SIZE - 1);
|
||||
}
|
||||
|
||||
if (!length)
|
||||
return;
|
||||
print_blocklist (ctx->start_sector, ctx->num_sectors, 0, 0, ctx);
|
||||
ctx->num_sectors = 0;
|
||||
}
|
||||
|
||||
if (offset == 0 && length == GRUB_DISK_SECTOR_SIZE)
|
||||
if (offset)
|
||||
{
|
||||
ctx->start_sector = sector;
|
||||
ctx->num_sectors++;
|
||||
unsigned l = length + offset;
|
||||
l &= (GRUB_DISK_SECTOR_SIZE - 1);
|
||||
l -= offset;
|
||||
print_blocklist (sector, 0, offset, l, ctx);
|
||||
length -= l;
|
||||
sector++;
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
if (!length)
|
||||
return;
|
||||
|
||||
if (length & (GRUB_DISK_SECTOR_SIZE - 1))
|
||||
{
|
||||
if (length >> GRUB_DISK_SECTOR_BITS)
|
||||
{
|
||||
print_blocklist (sector, length >> GRUB_DISK_SECTOR_BITS, 0, 0, ctx);
|
||||
sector += length >> GRUB_DISK_SECTOR_BITS;
|
||||
}
|
||||
print_blocklist (sector, 0, 0, length & (GRUB_DISK_SECTOR_SIZE - 1), ctx);
|
||||
}
|
||||
else
|
||||
print_blocklist (sector, 0, offset, length, ctx);
|
||||
{
|
||||
ctx->start_sector = sector;
|
||||
ctx->num_sectors = length >> GRUB_DISK_SECTOR_BITS;
|
||||
}
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
|
||||
@@ -146,8 +146,7 @@ grub_loader_boot (void)
|
||||
return grub_error (GRUB_ERR_NO_KERNEL,
|
||||
N_("you need to load the kernel first"));
|
||||
|
||||
if (grub_loader_flags & GRUB_LOADER_FLAG_NORETURN)
|
||||
grub_machine_fini ();
|
||||
grub_machine_fini (grub_loader_flags);
|
||||
|
||||
for (cur = preboots_head; cur; cur = cur->next)
|
||||
{
|
||||
|
||||
@@ -56,7 +56,7 @@ GRUB_MOD_INIT(boottime)
|
||||
{
|
||||
cmd_boottime =
|
||||
grub_register_command ("boottime", grub_cmd_boottime,
|
||||
0, N_("Get boot time statistics."));
|
||||
0, N_("Show boot time statistics."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(boottime)
|
||||
|
||||
@@ -26,14 +26,14 @@ struct grub_acpi_rsdp_v10 *
|
||||
grub_machine_acpi_get_rsdpv1 (void)
|
||||
{
|
||||
unsigned i;
|
||||
static grub_efi_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
|
||||
static grub_efi_packed_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
|
||||
|
||||
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
|
||||
{
|
||||
grub_efi_guid_t *guid =
|
||||
grub_efi_packed_guid_t *guid =
|
||||
&grub_efi_system_table->configuration_table[i].vendor_guid;
|
||||
|
||||
if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_guid_t)))
|
||||
if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_efi_packed_guid_t)))
|
||||
return (struct grub_acpi_rsdp_v10 *)
|
||||
grub_efi_system_table->configuration_table[i].vendor_table;
|
||||
}
|
||||
@@ -44,14 +44,14 @@ struct grub_acpi_rsdp_v20 *
|
||||
grub_machine_acpi_get_rsdpv2 (void)
|
||||
{
|
||||
unsigned i;
|
||||
static grub_efi_guid_t acpi20_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
|
||||
static grub_efi_packed_guid_t acpi20_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
|
||||
|
||||
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
|
||||
{
|
||||
grub_efi_guid_t *guid =
|
||||
grub_efi_packed_guid_t *guid =
|
||||
&grub_efi_system_table->configuration_table[i].vendor_guid;
|
||||
|
||||
if (! grub_memcmp (guid, &acpi20_guid, sizeof (grub_efi_guid_t)))
|
||||
if (! grub_memcmp (guid, &acpi20_guid, sizeof (grub_efi_packed_guid_t)))
|
||||
return (struct grub_acpi_rsdp_v20 *)
|
||||
grub_efi_system_table->configuration_table[i].vendor_table;
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ fake_bios_data (int use_rom)
|
||||
smbios = 0;
|
||||
for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
|
||||
{
|
||||
grub_efi_guid_t *guid =
|
||||
grub_efi_packed_guid_t *guid =
|
||||
&grub_efi_system_table->configuration_table[i].vendor_guid;
|
||||
|
||||
if (! grub_memcmp (guid, &acpi2_guid, sizeof (grub_efi_guid_t)))
|
||||
|
||||
@@ -95,7 +95,7 @@ grub_cmd_lsefi (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_efi_handle_t handle = handles[i];
|
||||
grub_efi_status_t status;
|
||||
grub_efi_uintn_t num_protocols;
|
||||
grub_efi_guid_t **protocols;
|
||||
grub_efi_packed_guid_t **protocols;
|
||||
grub_efi_device_path_t *dp;
|
||||
|
||||
grub_printf ("Handle %p\n", handle);
|
||||
|
||||
@@ -52,6 +52,7 @@ grub_cmd_lsefisystab (struct grub_command *cmd __attribute__ ((unused)),
|
||||
grub_efi_configuration_table_t *t;
|
||||
unsigned int i;
|
||||
|
||||
grub_printf ("Address: %p\n", st);
|
||||
grub_printf ("Signature: %016" PRIxGRUB_UINT64_T " revision: %08x\n",
|
||||
st->hdr.signature, st->hdr.revision);
|
||||
{
|
||||
@@ -71,7 +72,7 @@ grub_cmd_lsefisystab (struct grub_command *cmd __attribute__ ((unused)),
|
||||
|
||||
grub_printf (", Version=%x\n", st->firmware_revision);
|
||||
|
||||
grub_printf ("%ld tables:\n", st->num_table_entries);
|
||||
grub_printf ("%lld tables:\n", (long long) st->num_table_entries);
|
||||
t = st->configuration_table;
|
||||
for (i = 0; i < st->num_table_entries; i++)
|
||||
{
|
||||
|
||||
@@ -32,7 +32,7 @@ disp_sal (void *table)
|
||||
{
|
||||
struct grub_efi_sal_system_table *t = table;
|
||||
void *desc;
|
||||
grub_uint32_t len, l;
|
||||
grub_uint32_t len, l, i;
|
||||
|
||||
grub_printf ("SAL rev: %02x, signature: %x, len:%x\n",
|
||||
t->sal_rev, t->signature, t->total_table_len);
|
||||
@@ -44,7 +44,9 @@ disp_sal (void *table)
|
||||
|
||||
desc = t->entries;
|
||||
len = t->total_table_len - sizeof (struct grub_efi_sal_system_table);
|
||||
while (len > 0)
|
||||
if (t->total_table_len <= sizeof (struct grub_efi_sal_system_table))
|
||||
return;
|
||||
for (i = 0; i < t->entry_count; i++)
|
||||
{
|
||||
switch (*(grub_uint8_t *) desc)
|
||||
{
|
||||
@@ -123,6 +125,8 @@ disp_sal (void *table)
|
||||
return;
|
||||
}
|
||||
desc = (grub_uint8_t *)desc + l;
|
||||
if (len <= l)
|
||||
return;
|
||||
len -= l;
|
||||
}
|
||||
}
|
||||
@@ -135,12 +139,12 @@ grub_cmd_lssal (struct grub_command *cmd __attribute__ ((unused)),
|
||||
const grub_efi_system_table_t *st = grub_efi_system_table;
|
||||
grub_efi_configuration_table_t *t = st->configuration_table;
|
||||
unsigned int i;
|
||||
grub_efi_guid_t guid = GRUB_EFI_SAL_TABLE_GUID;
|
||||
grub_efi_packed_guid_t guid = GRUB_EFI_SAL_TABLE_GUID;
|
||||
|
||||
for (i = 0; i < st->num_table_entries; i++)
|
||||
{
|
||||
if (grub_memcmp (&guid, &t->vendor_guid,
|
||||
sizeof (grub_efi_guid_t)) == 0)
|
||||
sizeof (grub_efi_packed_guid_t)) == 0)
|
||||
{
|
||||
disp_sal (t->vendor_table);
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -0,0 +1,678 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 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/misc.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/env.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/extcmd.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/elf.h>
|
||||
#include <grub/xen_file.h>
|
||||
#include <grub/efi/pe32.h>
|
||||
#include <grub/i386/linux.h>
|
||||
#include <grub/xnu.h>
|
||||
#include <grub/machoload.h>
|
||||
#include <grub/fileid.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static const struct grub_arg_option options[] = {
|
||||
{"is-i386-xen-pae-domu", 0, 0,
|
||||
N_("Check if FILE can be booted as i386 PAE Xen unprivileged guest kernel"),
|
||||
0, 0},
|
||||
{"is-x86_64-xen-domu", 0, 0,
|
||||
N_("Check if FILE can be booted as x86_64 Xen unprivileged guest kernel"), 0, 0},
|
||||
{"is-x86-xen-dom0", 0, 0,
|
||||
N_("Check if FILE can be used as Xen x86 privileged guest kernel"), 0, 0},
|
||||
{"is-x86-multiboot", 0, 0,
|
||||
N_("Check if FILE can be used as x86 multiboot kernel"), 0, 0},
|
||||
{"is-x86-multiboot2", 0, 0,
|
||||
N_("Check if FILE can be used as x86 multiboot2 kernel"), 0, 0},
|
||||
{"is-arm-linux", 0, 0,
|
||||
N_("Check if FILE is ARM Linux"), 0, 0},
|
||||
{"is-arm64-linux", 0, 0,
|
||||
N_("Check if FILE is ARM64 Linux"), 0, 0},
|
||||
{"is-ia64-linux", 0, 0,
|
||||
N_("Check if FILE is IA64 Linux"), 0, 0},
|
||||
{"is-mips-linux", 0, 0,
|
||||
N_("Check if FILE is MIPS Linux"), 0, 0},
|
||||
{"is-mipsel-linux", 0, 0,
|
||||
N_("Check if FILE is MIPSEL Linux"), 0, 0},
|
||||
{"is-sparc64-linux", 0, 0,
|
||||
N_("Check if FILE is SPARC64 Linux"), 0, 0},
|
||||
{"is-powerpc-linux", 0, 0,
|
||||
N_("Check if FILE is POWERPC Linux"), 0, 0},
|
||||
{"is-x86-linux", 0, 0,
|
||||
N_("Check if FILE is x86 Linux"), 0, 0},
|
||||
{"is-x86-linux32", 0, 0,
|
||||
N_("Check if FILE is x86 Linux supporting 32-bit protocol"), 0, 0},
|
||||
{"is-x86-kfreebsd", 0, 0,
|
||||
N_("Check if FILE is x86 kFreeBSD"), 0, 0},
|
||||
{"is-i386-kfreebsd", 0, 0,
|
||||
N_("Check if FILE is i386 kFreeBSD"), 0, 0},
|
||||
{"is-x86_64-kfreebsd", 0, 0,
|
||||
N_("Check if FILE is x86_64 kFreeBSD"), 0, 0},
|
||||
|
||||
{"is-x86-knetbsd", 0, 0,
|
||||
N_("Check if FILE is x86 kNetBSD"), 0, 0},
|
||||
{"is-i386-knetbsd", 0, 0,
|
||||
N_("Check if FILE is i386 kNetBSD"), 0, 0},
|
||||
{"is-x86_64-knetbsd", 0, 0,
|
||||
N_("Check if FILE is x86_64 kNetBSD"), 0, 0},
|
||||
|
||||
{"is-i386-efi", 0, 0,
|
||||
N_("Check if FILE is i386 EFI file"), 0, 0},
|
||||
{"is-x86_64-efi", 0, 0,
|
||||
N_("Check if FILE is x86_64 EFI file"), 0, 0},
|
||||
{"is-ia64-efi", 0, 0,
|
||||
N_("Check if FILE is IA64 EFI file"), 0, 0},
|
||||
{"is-arm64-efi", 0, 0,
|
||||
N_("Check if FILE is ARM64 EFI file"), 0, 0},
|
||||
{"is-arm-efi", 0, 0,
|
||||
N_("Check if FILE is ARM EFI file"), 0, 0},
|
||||
{"is-hibernated-hiberfil", 0, 0,
|
||||
N_("Check if FILE is hiberfil.sys in hibernated state"), 0, 0},
|
||||
{"is-x86_64-xnu", 0, 0,
|
||||
N_("Check if FILE is x86_64 XNU (Mac OS X kernel)"), 0, 0},
|
||||
{"is-i386-xnu", 0, 0,
|
||||
N_("Check if FILE is i386 XNU (Mac OS X kernel)"), 0, 0},
|
||||
{"is-xnu-hibr", 0, 0,
|
||||
N_("Check if FILE is XNU (Mac OS X kernel) hibernated image"), 0, 0},
|
||||
{"is-x86-bios-bootsector", 0, 0,
|
||||
N_("Check if FILE is BIOS bootsector"), 0, 0},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
IS_PAE_DOMU,
|
||||
IS_64_DOMU,
|
||||
IS_DOM0,
|
||||
IS_MULTIBOOT,
|
||||
IS_MULTIBOOT2,
|
||||
IS_ARM_LINUX,
|
||||
IS_ARM64_LINUX,
|
||||
IS_IA64_LINUX,
|
||||
IS_MIPS_LINUX,
|
||||
IS_MIPSEL_LINUX,
|
||||
IS_SPARC64_LINUX,
|
||||
IS_POWERPC_LINUX,
|
||||
IS_X86_LINUX,
|
||||
IS_X86_LINUX32,
|
||||
IS_X86_KFREEBSD,
|
||||
IS_X86_KFREEBSD32,
|
||||
IS_X86_KFREEBSD64,
|
||||
IS_X86_KNETBSD,
|
||||
IS_X86_KNETBSD32,
|
||||
IS_X86_KNETBSD64,
|
||||
IS_32_EFI,
|
||||
IS_64_EFI,
|
||||
IS_IA_EFI,
|
||||
IS_ARM64_EFI,
|
||||
IS_ARM_EFI,
|
||||
IS_HIBERNATED,
|
||||
IS_XNU64,
|
||||
IS_XNU32,
|
||||
IS_XNU_HIBR,
|
||||
IS_BIOS_BOOTSECTOR,
|
||||
OPT_TYPE_MIN = IS_PAE_DOMU,
|
||||
OPT_TYPE_MAX = IS_BIOS_BOOTSECTOR
|
||||
};
|
||||
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_file (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_file_t file = 0;
|
||||
grub_elf_t elf = 0;
|
||||
grub_err_t err;
|
||||
int type = -1, i;
|
||||
int ret = 0;
|
||||
grub_macho_t macho = 0;
|
||||
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
for (i = OPT_TYPE_MIN; i <= OPT_TYPE_MAX; i++)
|
||||
if (ctxt->state[i].set)
|
||||
{
|
||||
if (type == -1)
|
||||
{
|
||||
type = i;
|
||||
continue;
|
||||
}
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "multiple types specified");
|
||||
}
|
||||
if (type == -1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no type specified");
|
||||
|
||||
file = grub_file_open (args[0]);
|
||||
if (!file)
|
||||
return grub_errno;
|
||||
switch (type)
|
||||
{
|
||||
case IS_BIOS_BOOTSECTOR:
|
||||
{
|
||||
grub_uint16_t sig;
|
||||
if (grub_file_size (file) != 512)
|
||||
break;
|
||||
if (grub_file_seek (file, 510) == (grub_size_t) -1)
|
||||
break;
|
||||
if (grub_file_read (file, &sig, 2) != 2)
|
||||
break;
|
||||
if (sig != grub_cpu_to_le16_compile_time (0xaa55))
|
||||
break;
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
case IS_IA64_LINUX:
|
||||
{
|
||||
Elf64_Ehdr ehdr;
|
||||
|
||||
if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
|
||||
|| ehdr.e_ident[EI_MAG1] != ELFMAG1
|
||||
|| ehdr.e_ident[EI_MAG2] != ELFMAG2
|
||||
|| ehdr.e_ident[EI_MAG3] != ELFMAG3
|
||||
|| ehdr.e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| ehdr.e_version != EV_CURRENT)
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_CLASS] != ELFCLASS64
|
||||
|| ehdr.e_ident[EI_DATA] != ELFDATA2LSB
|
||||
|| ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_IA_64))
|
||||
break;
|
||||
|
||||
ret = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case IS_SPARC64_LINUX:
|
||||
{
|
||||
Elf64_Ehdr ehdr;
|
||||
|
||||
if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
|
||||
|| ehdr.e_ident[EI_MAG1] != ELFMAG1
|
||||
|| ehdr.e_ident[EI_MAG2] != ELFMAG2
|
||||
|| ehdr.e_ident[EI_MAG3] != ELFMAG3
|
||||
|| ehdr.e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| ehdr.e_version != EV_CURRENT)
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_CLASS] != ELFCLASS64
|
||||
|| ehdr.e_ident[EI_DATA] != ELFDATA2MSB)
|
||||
break;
|
||||
|
||||
if (ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_SPARCV9)
|
||||
|| ehdr.e_type != grub_cpu_to_be16_compile_time (ET_EXEC))
|
||||
break;
|
||||
|
||||
ret = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case IS_POWERPC_LINUX:
|
||||
{
|
||||
Elf32_Ehdr ehdr;
|
||||
|
||||
if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
|
||||
|| ehdr.e_ident[EI_MAG1] != ELFMAG1
|
||||
|| ehdr.e_ident[EI_MAG2] != ELFMAG2
|
||||
|| ehdr.e_ident[EI_MAG3] != ELFMAG3
|
||||
|| ehdr.e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| ehdr.e_version != EV_CURRENT)
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_DATA] != ELFDATA2MSB
|
||||
|| (ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_PPC)
|
||||
&& ehdr.e_machine !=
|
||||
grub_cpu_to_le16_compile_time (EM_PPC64)))
|
||||
break;
|
||||
|
||||
if (ehdr.e_type != grub_cpu_to_be16_compile_time (ET_EXEC)
|
||||
&& ehdr.e_type != grub_cpu_to_be16_compile_time (ET_DYN))
|
||||
break;
|
||||
|
||||
ret = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case IS_MIPS_LINUX:
|
||||
{
|
||||
Elf32_Ehdr ehdr;
|
||||
|
||||
if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
|
||||
|| ehdr.e_ident[EI_MAG1] != ELFMAG1
|
||||
|| ehdr.e_ident[EI_MAG2] != ELFMAG2
|
||||
|| ehdr.e_ident[EI_MAG3] != ELFMAG3
|
||||
|| ehdr.e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| ehdr.e_version != EV_CURRENT)
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_DATA] != ELFDATA2MSB
|
||||
|| ehdr.e_machine != grub_cpu_to_be16_compile_time (EM_MIPS)
|
||||
|| ehdr.e_type != grub_cpu_to_be16_compile_time (ET_EXEC))
|
||||
break;
|
||||
|
||||
ret = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case IS_X86_KNETBSD:
|
||||
case IS_X86_KNETBSD32:
|
||||
case IS_X86_KNETBSD64:
|
||||
{
|
||||
int is32, is64;
|
||||
|
||||
elf = grub_elf_file (file, file->name);
|
||||
|
||||
if (elf->ehdr.ehdr32.e_type != grub_cpu_to_le16_compile_time (ET_EXEC)
|
||||
|| elf->ehdr.ehdr32.e_ident[EI_DATA] != ELFDATA2LSB)
|
||||
break;
|
||||
|
||||
is32 = grub_elf_is_elf32 (elf);
|
||||
is64 = grub_elf_is_elf64 (elf);
|
||||
if (!is32 && !is64)
|
||||
break;
|
||||
if (!is32 && type == IS_X86_KNETBSD32)
|
||||
break;
|
||||
if (!is64 && type == IS_X86_KNETBSD64)
|
||||
break;
|
||||
if (is64)
|
||||
ret = grub_file_check_netbsd64 (elf);
|
||||
if (is32)
|
||||
ret = grub_file_check_netbsd32 (elf);
|
||||
break;
|
||||
}
|
||||
|
||||
case IS_X86_KFREEBSD:
|
||||
case IS_X86_KFREEBSD32:
|
||||
case IS_X86_KFREEBSD64:
|
||||
{
|
||||
Elf32_Ehdr ehdr;
|
||||
int is32, is64;
|
||||
|
||||
if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
|
||||
|| ehdr.e_ident[EI_MAG1] != ELFMAG1
|
||||
|| ehdr.e_ident[EI_MAG2] != ELFMAG2
|
||||
|| ehdr.e_ident[EI_MAG3] != ELFMAG3
|
||||
|| ehdr.e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| ehdr.e_version != EV_CURRENT)
|
||||
break;
|
||||
|
||||
if (ehdr.e_type != grub_cpu_to_le16_compile_time (ET_EXEC)
|
||||
|| ehdr.e_ident[EI_DATA] != ELFDATA2LSB)
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_OSABI] != ELFOSABI_FREEBSD)
|
||||
break;
|
||||
|
||||
is32 = (ehdr.e_machine == grub_cpu_to_le16_compile_time (EM_386)
|
||||
&& ehdr.e_ident[EI_CLASS] == ELFCLASS32);
|
||||
is64 = (ehdr.e_machine == grub_cpu_to_le16_compile_time (EM_X86_64)
|
||||
&& ehdr.e_ident[EI_CLASS] == ELFCLASS64);
|
||||
if (!is32 && !is64)
|
||||
break;
|
||||
if (!is32 && (type == IS_X86_KFREEBSD32 || type == IS_X86_KNETBSD32))
|
||||
break;
|
||||
if (!is64 && (type == IS_X86_KFREEBSD64 || type == IS_X86_KNETBSD64))
|
||||
break;
|
||||
ret = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case IS_MIPSEL_LINUX:
|
||||
{
|
||||
Elf32_Ehdr ehdr;
|
||||
|
||||
if (grub_file_read (file, &ehdr, sizeof (ehdr)) != sizeof (ehdr))
|
||||
break;
|
||||
|
||||
if (ehdr.e_ident[EI_MAG0] != ELFMAG0
|
||||
|| ehdr.e_ident[EI_MAG1] != ELFMAG1
|
||||
|| ehdr.e_ident[EI_MAG2] != ELFMAG2
|
||||
|| ehdr.e_ident[EI_MAG3] != ELFMAG3
|
||||
|| ehdr.e_ident[EI_VERSION] != EV_CURRENT
|
||||
|| ehdr.e_version != EV_CURRENT)
|
||||
break;
|
||||
|
||||
if (ehdr.e_machine != grub_cpu_to_le16_compile_time (EM_MIPS)
|
||||
|| ehdr.e_type != grub_cpu_to_le16_compile_time (ET_EXEC))
|
||||
break;
|
||||
|
||||
ret = 1;
|
||||
|
||||
break;
|
||||
}
|
||||
case IS_ARM_LINUX:
|
||||
{
|
||||
grub_uint32_t sig, sig_pi;
|
||||
if (grub_file_read (file, &sig_pi, 4) != 4)
|
||||
break;
|
||||
/* Raspberry pi. */
|
||||
if (sig_pi == grub_cpu_to_le32_compile_time (0xea000006))
|
||||
{
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (grub_file_seek (file, 0x24) == (grub_size_t) -1)
|
||||
break;
|
||||
if (grub_file_read (file, &sig, 4) != 4)
|
||||
break;
|
||||
if (sig == grub_cpu_to_le32_compile_time (0x016f2818))
|
||||
{
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IS_ARM64_LINUX:
|
||||
{
|
||||
grub_uint32_t sig;
|
||||
|
||||
if (grub_file_seek (file, 0x38) == (grub_size_t) -1)
|
||||
break;
|
||||
if (grub_file_read (file, &sig, 4) != 4)
|
||||
break;
|
||||
if (sig == grub_cpu_to_le32_compile_time (0x644d5241))
|
||||
{
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IS_PAE_DOMU ... IS_DOM0:
|
||||
{
|
||||
struct grub_xen_file_info xen_inf;
|
||||
elf = grub_xen_file (file);
|
||||
if (!elf)
|
||||
break;
|
||||
err = grub_xen_get_info (elf, &xen_inf);
|
||||
if (err)
|
||||
break;
|
||||
/* Unfortuntely no way to check if kernel supports dom0. */
|
||||
if (type == IS_DOM0)
|
||||
ret = 1;
|
||||
if (type == IS_PAE_DOMU)
|
||||
ret = (xen_inf.arch == GRUB_XEN_FILE_I386_PAE
|
||||
|| xen_inf.arch == GRUB_XEN_FILE_I386_PAE_BIMODE);
|
||||
if (type == IS_64_DOMU)
|
||||
ret = (xen_inf.arch == GRUB_XEN_FILE_X86_64);
|
||||
break;
|
||||
}
|
||||
case IS_MULTIBOOT:
|
||||
case IS_MULTIBOOT2:
|
||||
{
|
||||
grub_uint32_t *buffer;
|
||||
grub_ssize_t len;
|
||||
grub_size_t search_size;
|
||||
grub_uint32_t *header;
|
||||
grub_uint32_t magic;
|
||||
grub_size_t step;
|
||||
|
||||
if (type == IS_MULTIBOOT2)
|
||||
{
|
||||
search_size = 32768;
|
||||
magic = grub_cpu_to_le32_compile_time (0xe85250d6);
|
||||
step = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
search_size = 8192;
|
||||
magic = grub_cpu_to_le32_compile_time (0x1BADB002);
|
||||
step = 1;
|
||||
}
|
||||
|
||||
buffer = grub_malloc (search_size);
|
||||
if (!buffer)
|
||||
break;
|
||||
|
||||
len = grub_file_read (file, buffer, search_size);
|
||||
if (len < 32)
|
||||
{
|
||||
grub_free (buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Look for the multiboot header in the buffer. The header should
|
||||
be at least 12 bytes and aligned on a 4-byte boundary. */
|
||||
for (header = buffer;
|
||||
((char *) header <=
|
||||
(char *) buffer + len - (type == IS_MULTIBOOT2 ? 16 : 12))
|
||||
|| (header = 0); header += step)
|
||||
{
|
||||
if (header[0] == magic
|
||||
&& !(grub_le_to_cpu32 (header[0])
|
||||
+ grub_le_to_cpu32 (header[1])
|
||||
+ grub_le_to_cpu32 (header[2])
|
||||
+ (type == IS_MULTIBOOT2
|
||||
? grub_le_to_cpu32 (header[3]) : 0)))
|
||||
break;
|
||||
}
|
||||
|
||||
if (header != 0)
|
||||
ret = 1;
|
||||
grub_free (buffer);
|
||||
break;
|
||||
}
|
||||
case IS_X86_LINUX32:
|
||||
case IS_X86_LINUX:
|
||||
{
|
||||
struct linux_kernel_header lh;
|
||||
if (grub_file_read (file, &lh, sizeof (lh)) != sizeof (lh))
|
||||
break;
|
||||
if (lh.boot_flag != grub_cpu_to_le16_compile_time (0xaa55))
|
||||
break;
|
||||
|
||||
if (lh.setup_sects > GRUB_LINUX_MAX_SETUP_SECTS)
|
||||
break;
|
||||
|
||||
/* FIXME: some really old kernels (< 1.3.73) will fail this. */
|
||||
if (lh.header !=
|
||||
grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|
||||
|| grub_le_to_cpu16 (lh.version) < 0x0200)
|
||||
break;
|
||||
|
||||
if (type == IS_X86_LINUX)
|
||||
{
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
/* FIXME: 2.03 is not always good enough (Linux 2.4 can be 2.03 and
|
||||
still not support 32-bit boot. */
|
||||
if (lh.header !=
|
||||
grub_cpu_to_le32_compile_time (GRUB_LINUX_MAGIC_SIGNATURE)
|
||||
|| grub_le_to_cpu16 (lh.version) < 0x0203)
|
||||
break;
|
||||
|
||||
if (!(lh.loadflags & GRUB_LINUX_FLAG_BIG_KERNEL))
|
||||
break;
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
case IS_HIBERNATED:
|
||||
{
|
||||
grub_uint8_t hibr_file_magic[4];
|
||||
if (grub_file_read (file, &hibr_file_magic, sizeof (hibr_file_magic))
|
||||
!= sizeof (hibr_file_magic))
|
||||
break;
|
||||
if (grub_memcmp ("hibr", hibr_file_magic, sizeof (hibr_file_magic)) ==
|
||||
0
|
||||
|| grub_memcmp ("HIBR", hibr_file_magic,
|
||||
sizeof (hibr_file_magic)) == 0)
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
case IS_XNU64:
|
||||
case IS_XNU32:
|
||||
{
|
||||
macho = grub_macho_open (args[0], (type == IS_XNU64));
|
||||
if (!macho)
|
||||
break;
|
||||
/* FIXME: more checks? */
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
case IS_XNU_HIBR:
|
||||
{
|
||||
struct grub_xnu_hibernate_header hibhead;
|
||||
if (grub_file_read (file, &hibhead, sizeof (hibhead))
|
||||
!= sizeof (hibhead))
|
||||
break;
|
||||
if (hibhead.magic !=
|
||||
grub_cpu_to_le32_compile_time (GRUB_XNU_HIBERNATE_MAGIC))
|
||||
break;
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
case IS_32_EFI:
|
||||
case IS_64_EFI:
|
||||
case IS_IA_EFI:
|
||||
case IS_ARM64_EFI:
|
||||
case IS_ARM_EFI:
|
||||
{
|
||||
char signature[4];
|
||||
grub_uint32_t pe_offset;
|
||||
struct grub_pe32_coff_header coff_head;
|
||||
|
||||
if (grub_file_read (file, signature, 2) != 2)
|
||||
break;
|
||||
if (signature[0] != 'M' || signature[1] != 'Z')
|
||||
break;
|
||||
if ((grub_ssize_t) grub_file_seek (file, 0x3c) == -1)
|
||||
break;
|
||||
if (grub_file_read (file, &pe_offset, 4) != 4)
|
||||
break;
|
||||
if ((grub_ssize_t) grub_file_seek (file, grub_le_to_cpu32 (pe_offset))
|
||||
== -1)
|
||||
break;
|
||||
if (grub_file_read (file, signature, 4) != 4)
|
||||
break;
|
||||
if (signature[0] != 'P' || signature[1] != 'E'
|
||||
|| signature[2] != '\0' || signature[3] != '\0')
|
||||
break;
|
||||
|
||||
if (grub_file_read (file, &coff_head, sizeof (coff_head))
|
||||
!= sizeof (coff_head))
|
||||
break;
|
||||
if (type == IS_32_EFI
|
||||
&& coff_head.machine !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_I386))
|
||||
break;
|
||||
if (type == IS_64_EFI
|
||||
&& coff_head.machine !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_X86_64))
|
||||
break;
|
||||
if (type == IS_IA_EFI
|
||||
&& coff_head.machine !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_IA64))
|
||||
break;
|
||||
if (type == IS_ARM64_EFI
|
||||
&& coff_head.machine !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARM64))
|
||||
break;
|
||||
if (type == IS_ARM_EFI
|
||||
&& coff_head.machine !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_MACHINE_ARMTHUMB_MIXED))
|
||||
break;
|
||||
if (type == IS_IA_EFI || type == IS_64_EFI || type == IS_ARM64_EFI)
|
||||
{
|
||||
struct grub_pe64_optional_header o64;
|
||||
if (grub_file_read (file, &o64, sizeof (o64)) != sizeof (o64))
|
||||
break;
|
||||
if (o64.magic !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_PE64_MAGIC))
|
||||
break;
|
||||
if (o64.subsystem !=
|
||||
grub_cpu_to_le16_compile_time
|
||||
(GRUB_PE32_SUBSYSTEM_EFI_APPLICATION))
|
||||
break;
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
if (type == IS_32_EFI || type == IS_ARM_EFI)
|
||||
{
|
||||
struct grub_pe32_optional_header o32;
|
||||
if (grub_file_read (file, &o32, sizeof (o32)) != sizeof (o32))
|
||||
break;
|
||||
if (o32.magic !=
|
||||
grub_cpu_to_le16_compile_time (GRUB_PE32_PE32_MAGIC))
|
||||
break;
|
||||
if (o32.subsystem !=
|
||||
grub_cpu_to_le16_compile_time
|
||||
(GRUB_PE32_SUBSYSTEM_EFI_APPLICATION))
|
||||
break;
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (elf)
|
||||
grub_elf_close (elf);
|
||||
else if (macho)
|
||||
grub_macho_close (macho);
|
||||
else if (file)
|
||||
grub_file_close (file);
|
||||
|
||||
if (!ret && (grub_errno == GRUB_ERR_BAD_OS || grub_errno == GRUB_ERR_NONE))
|
||||
/* TRANSLATORS: it's a standalone boolean value,
|
||||
opposite of "true". */
|
||||
grub_error (GRUB_ERR_TEST_FAILURE, N_("false"));
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_extcmd_t cmd;
|
||||
|
||||
GRUB_MOD_INIT(file)
|
||||
{
|
||||
cmd = grub_register_extcmd ("file", grub_cmd_file, 0,
|
||||
N_("OPTIONS FILE"),
|
||||
N_("Check if FILE is of specified type."),
|
||||
options);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(file)
|
||||
{
|
||||
grub_unregister_extcmd (cmd);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
#define GRUB_TARGET_WORDSIZE 32
|
||||
#define XX 32
|
||||
#define ehdrXX ehdr32
|
||||
#define grub_file_check_netbsdXX grub_file_check_netbsd32
|
||||
#include "fileXX.c"
|
||||
@@ -0,0 +1,5 @@
|
||||
#define GRUB_TARGET_WORDSIZE 64
|
||||
#define XX 64
|
||||
#define ehdrXX ehdr64
|
||||
#define grub_file_check_netbsdXX grub_file_check_netbsd64
|
||||
#include "fileXX.c"
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 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/fileid.h>
|
||||
#include <grub/elfload.h>
|
||||
#include <grub/misc.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||
|
||||
int
|
||||
grub_file_check_netbsdXX (grub_elf_t elf)
|
||||
{
|
||||
Elf_Shdr *s, *s0;
|
||||
|
||||
grub_size_t shnum = elf->ehdr.ehdrXX.e_shnum;
|
||||
grub_size_t shentsize = elf->ehdr.ehdrXX.e_shentsize;
|
||||
grub_size_t shsize = shnum * shentsize;
|
||||
grub_off_t stroff;
|
||||
|
||||
if (!shnum || !shentsize)
|
||||
return 0;
|
||||
|
||||
s0 = grub_malloc (shsize);
|
||||
if (!s0)
|
||||
return 0;
|
||||
|
||||
if (grub_file_seek (elf->file, elf->ehdr.ehdrXX.e_shoff) == (grub_off_t) -1)
|
||||
return 0;
|
||||
|
||||
if (grub_file_read (elf->file, s0, shsize) != (grub_ssize_t) shsize)
|
||||
return 0;
|
||||
|
||||
s = (Elf_Shdr *) ((char *) s0 + elf->ehdr.ehdrXX.e_shstrndx * shentsize);
|
||||
stroff = s->sh_offset;
|
||||
|
||||
for (s = s0; s < (Elf_Shdr *) ((char *) s0 + shnum * shentsize);
|
||||
s = (Elf_Shdr *) ((char *) s + shentsize))
|
||||
{
|
||||
char name[sizeof(".note.netbsd.ident")];
|
||||
grub_memset (name, 0, sizeof (name));
|
||||
if (grub_file_seek (elf->file, stroff + s->sh_name) == (grub_off_t) -1)
|
||||
return grub_errno;
|
||||
|
||||
if (grub_file_read (elf->file, name, sizeof (name)) != (grub_ssize_t) sizeof (name))
|
||||
{
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
continue;
|
||||
}
|
||||
if (grub_memcmp (name, ".note.netbsd.ident",
|
||||
sizeof(".note.netbsd.ident")) != 0)
|
||||
continue;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -101,7 +101,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
|
||||
}
|
||||
|
||||
/* Check if it is valid. */
|
||||
if (mbr.signature != grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE))
|
||||
if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE))
|
||||
{
|
||||
grub_device_close (dev);
|
||||
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
|
||||
@@ -216,7 +216,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
|
||||
first_sector--;
|
||||
mbr.entries[0].flag = 0;
|
||||
mbr.entries[0].type = GRUB_PC_PARTITION_TYPE_GPT_DISK;
|
||||
mbr.entries[0].start = grub_cpu_to_le32 (1);
|
||||
mbr.entries[0].start = grub_cpu_to_le32_compile_time (1);
|
||||
lba_to_chs (1,
|
||||
&(mbr.entries[0].start_sector),
|
||||
&(mbr.entries[0].start_cylinder),
|
||||
@@ -227,7 +227,7 @@ grub_cmd_gptsync (grub_command_t cmd __attribute__ ((unused)),
|
||||
&(mbr.entries[0].end_head));
|
||||
mbr.entries[0].length = grub_cpu_to_le32 (first_sector);
|
||||
|
||||
mbr.signature = grub_cpu_to_le16 (GRUB_PC_PARTITION_SIGNATURE);
|
||||
mbr.signature = grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE);
|
||||
|
||||
if (grub_disk_write (dev->disk, 0, 0, sizeof (mbr), &mbr))
|
||||
{
|
||||
|
||||
@@ -63,17 +63,23 @@ hextoval (char c)
|
||||
static grub_err_t
|
||||
hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, hash->contextsize);
|
||||
grub_uint8_t readbuf[4096];
|
||||
void *context;
|
||||
grub_uint8_t *readbuf;
|
||||
#define BUF_SIZE 4096
|
||||
readbuf = grub_malloc (BUF_SIZE);
|
||||
if (!readbuf)
|
||||
return grub_errno;
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
if (!readbuf || !context)
|
||||
goto fail;
|
||||
|
||||
grub_memset (context, 0, sizeof (context));
|
||||
hash->init (context);
|
||||
while (1)
|
||||
{
|
||||
grub_ssize_t r;
|
||||
r = grub_file_read (file, readbuf, sizeof (readbuf));
|
||||
r = grub_file_read (file, readbuf, BUF_SIZE);
|
||||
if (r < 0)
|
||||
return grub_errno;
|
||||
goto fail;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -81,7 +87,15 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
|
||||
hash->final (context);
|
||||
grub_memcpy (result, hash->read (context), hash->mdlen);
|
||||
|
||||
grub_free (readbuf);
|
||||
grub_free (context);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
grub_free (readbuf);
|
||||
grub_free (context);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -90,12 +104,15 @@ check_list (const gcry_md_spec_t *hash, const char *hashfilename,
|
||||
{
|
||||
grub_file_t hashlist, file;
|
||||
char *buf = NULL;
|
||||
grub_uint8_t expected[hash->mdlen];
|
||||
grub_uint8_t actual[hash->mdlen];
|
||||
grub_uint8_t expected[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t actual[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_err_t err;
|
||||
unsigned i;
|
||||
unsigned unread = 0, mismatch = 0;
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
hashlist = grub_file_open (hashfilename);
|
||||
if (!hashlist)
|
||||
return grub_errno;
|
||||
@@ -205,6 +222,9 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
if (!hash)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "unknown hash");
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
if (state[2].set)
|
||||
prefix = state[2].arg;
|
||||
|
||||
@@ -218,7 +238,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
|
||||
for (i = 0; i < (unsigned) argc; i++)
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (result, hash->mdlen);
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (result, GRUB_CRYPTO_MAX_MDLEN);
|
||||
grub_file_t file;
|
||||
grub_err_t err;
|
||||
unsigned j;
|
||||
|
||||
@@ -55,7 +55,7 @@ GRUB_MOD_INIT(cmosdump)
|
||||
{
|
||||
cmd = grub_register_command ("cmosdump", grub_cmd_cmosdump,
|
||||
0,
|
||||
N_("Dump CMOS contents."));
|
||||
N_("Show raw dump of the CMOS contents."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(cmosdump)
|
||||
|
||||
@@ -81,7 +81,25 @@ grub_cmd_cmosclean (struct grub_command *cmd __attribute__ ((unused)),
|
||||
return grub_cmos_write (byte, value & (~(1 << bit)));
|
||||
}
|
||||
|
||||
static grub_command_t cmd, cmd_clean;
|
||||
static grub_err_t
|
||||
grub_cmd_cmosset (struct grub_command *cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int byte, bit;
|
||||
grub_err_t err;
|
||||
grub_uint8_t value;
|
||||
|
||||
err = parse_args (argc, argv, &byte, &bit);
|
||||
if (err)
|
||||
return err;
|
||||
err = grub_cmos_read (byte, &value);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return grub_cmos_write (byte, value | (1 << bit));
|
||||
}
|
||||
|
||||
static grub_command_t cmd, cmd_clean, cmd_set;
|
||||
|
||||
|
||||
GRUB_MOD_INIT(cmostest)
|
||||
@@ -91,11 +109,16 @@ GRUB_MOD_INIT(cmostest)
|
||||
N_("Test bit at BYTE:BIT in CMOS."));
|
||||
cmd_clean = grub_register_command ("cmosclean", grub_cmd_cmosclean,
|
||||
N_("BYTE:BIT"),
|
||||
N_("Clean bit at BYTE:BIT in CMOS."));
|
||||
N_("Clear bit at BYTE:BIT in CMOS."));
|
||||
cmd_set = grub_register_command ("cmosset", grub_cmd_cmosset,
|
||||
N_("BYTE:BIT"),
|
||||
/* TRANSLATORS: A bit may be either set (1) or clear (0). */
|
||||
N_("Set bit at BYTE:BIT in CMOS."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(cmostest)
|
||||
{
|
||||
grub_unregister_command (cmd);
|
||||
grub_unregister_command (cmd_clean);
|
||||
grub_unregister_command (cmd_set);
|
||||
}
|
||||
@@ -109,7 +109,7 @@ GRUB_MOD_INIT(cbtime)
|
||||
{
|
||||
cmd_boottime =
|
||||
grub_register_command ("coreboot_boottime", grub_cmd_coreboot_boottime,
|
||||
0, N_("Get coreboot boot time statistics."));
|
||||
0, N_("Show coreboot boot time statistics."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(cbtime)
|
||||
|
||||
@@ -29,29 +29,43 @@
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
#define cpuid(num,a,b,c,d) \
|
||||
asm volatile ("xchgl %%ebx, %1; cpuid; xchgl %%ebx, %1" \
|
||||
: "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
|
||||
: "0" (num))
|
||||
|
||||
static const struct grub_arg_option options[] =
|
||||
{
|
||||
/* TRANSLATORS: "(default)" at the end means that this option is used if
|
||||
no argument is specified. */
|
||||
{"long-mode", 'l', 0, N_("Check if CPU supports 64-bit (long) mode (default)."), 0, 0},
|
||||
{"pae", 'p', 0, N_("Check if CPU supports Physical Address Extension."), 0, 0},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
#define bit_LM (1 << 29)
|
||||
enum
|
||||
{
|
||||
MODE_LM = 0,
|
||||
MODE_PAE = 1
|
||||
};
|
||||
|
||||
unsigned char grub_cpuid_has_longmode = 0;
|
||||
enum
|
||||
{
|
||||
bit_PAE = (1 << 6),
|
||||
};
|
||||
enum
|
||||
{
|
||||
bit_LM = (1 << 29)
|
||||
};
|
||||
|
||||
unsigned char grub_cpuid_has_longmode = 0, grub_cpuid_has_pae = 0;
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_cpuid (grub_extcmd_context_t ctxt __attribute__ ((unused)),
|
||||
grub_cmd_cpuid (grub_extcmd_context_t ctxt,
|
||||
int argc __attribute__ ((unused)),
|
||||
char **args __attribute__ ((unused)))
|
||||
{
|
||||
return grub_cpuid_has_longmode ? GRUB_ERR_NONE
|
||||
int val = 0;
|
||||
if (ctxt->state[MODE_PAE].set)
|
||||
val = grub_cpuid_has_pae;
|
||||
else
|
||||
val = grub_cpuid_has_longmode;
|
||||
return val ? GRUB_ERR_NONE
|
||||
/* TRANSLATORS: it's a standalone boolean value,
|
||||
opposite of "true". */
|
||||
: grub_error (GRUB_ERR_TEST_FAILURE, N_("false"));
|
||||
@@ -64,6 +78,7 @@ GRUB_MOD_INIT(cpuid)
|
||||
#ifdef __x86_64__
|
||||
/* grub-emu */
|
||||
grub_cpuid_has_longmode = 1;
|
||||
grub_cpuid_has_pae = 1;
|
||||
#else
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
unsigned int max_level;
|
||||
@@ -78,18 +93,24 @@ GRUB_MOD_INIT(cpuid)
|
||||
goto done;
|
||||
|
||||
/* Check the highest input value for eax. */
|
||||
cpuid (0, eax, ebx, ecx, edx);
|
||||
grub_cpuid (0, eax, ebx, ecx, edx);
|
||||
/* We only look at the first four characters. */
|
||||
max_level = eax;
|
||||
if (max_level == 0)
|
||||
goto done;
|
||||
|
||||
cpuid (0x80000000, eax, ebx, ecx, edx);
|
||||
if (max_level >= 1)
|
||||
{
|
||||
grub_cpuid (1, eax, ebx, ecx, edx);
|
||||
grub_cpuid_has_pae = !!(edx & bit_PAE);
|
||||
}
|
||||
|
||||
grub_cpuid (0x80000000, eax, ebx, ecx, edx);
|
||||
ext_level = eax;
|
||||
if (ext_level < 0x80000000)
|
||||
goto done;
|
||||
|
||||
cpuid (0x80000001, eax, ebx, ecx, edx);
|
||||
grub_cpuid (0x80000001, eax, ebx, ecx, edx);
|
||||
grub_cpuid_has_longmode = !!(edx & bit_LM);
|
||||
done:
|
||||
#endif
|
||||
|
||||
@@ -74,7 +74,7 @@ typedef struct drivemap_node
|
||||
grub_uint8_t redirto;
|
||||
} drivemap_node_t;
|
||||
|
||||
typedef struct __attribute__ ((packed)) int13map_node
|
||||
typedef struct GRUB_PACKED int13map_node
|
||||
{
|
||||
grub_uint8_t disknum;
|
||||
grub_uint8_t mapto;
|
||||
|
||||
@@ -107,6 +107,14 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
if (!tempo)
|
||||
{
|
||||
grub_file_close (file);
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid tempo in %s"),
|
||||
args[0]);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
tempo = grub_le_to_cpu32 (tempo);
|
||||
grub_dprintf ("play","tempo = %d\n", tempo);
|
||||
|
||||
@@ -131,6 +139,13 @@ grub_cmd_play (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
tempo = grub_strtoul (args[0], &end, 0);
|
||||
|
||||
if (!tempo)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, N_("Invalid tempo in %s"),
|
||||
args[0]);
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
if (*end)
|
||||
/* Was not a number either, assume it was supposed to be a file name. */
|
||||
return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"), args[0]);
|
||||
|
||||
@@ -292,7 +292,7 @@ find_key_code (char *key)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < sizeof (keysym_table) / sizeof (keysym_table[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(keysym_table); i++)
|
||||
{
|
||||
if (keysym_table[i].unshifted_name
|
||||
&& grub_strcmp (key, keysym_table[i].unshifted_name) == 0)
|
||||
@@ -311,7 +311,7 @@ find_ascii_code (char *key)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < sizeof (keysym_table) / sizeof (keysym_table[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(keysym_table); i++)
|
||||
{
|
||||
if (keysym_table[i].unshifted_name
|
||||
&& grub_strcmp (key, keysym_table[i].unshifted_name) == 0)
|
||||
@@ -352,15 +352,13 @@ grub_cmd_sendkey (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i < sizeof (simple_flag_offsets)
|
||||
/ sizeof (simple_flag_offsets[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(simple_flag_offsets); i++)
|
||||
grub_sendkey_set_simple_flag (simple_flag_offsets[i],
|
||||
grub_sendkey_parse_op(state[i]));
|
||||
}
|
||||
|
||||
/* Set noled. */
|
||||
noled = (state[sizeof (simple_flag_offsets)
|
||||
/ sizeof (simple_flag_offsets[0])].set);
|
||||
noled = (state[ARRAY_SIZE(simple_flag_offsets)].set);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
@@ -173,8 +173,10 @@ grub_term_map_key (grub_keyboard_key_t code, int status)
|
||||
|
||||
key = map_key_core (code, status, &alt_gr_consumed);
|
||||
|
||||
if (key == 0 || key == GRUB_TERM_SHIFT)
|
||||
if (key == 0 || key == GRUB_TERM_SHIFT) {
|
||||
grub_printf ("Unknown key 0x%x detected\n", code);
|
||||
return GRUB_TERM_NO_KEY;
|
||||
}
|
||||
|
||||
if (status & GRUB_TERM_STATUS_CAPS)
|
||||
{
|
||||
|
||||
@@ -314,7 +314,11 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
/* First try Linux. */
|
||||
if (kernel_type == GUESS_IT || kernel_type == LINUX)
|
||||
{
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
cmd = grub_command_find ("linux16");
|
||||
#else
|
||||
cmd = grub_command_find ("linux");
|
||||
#endif
|
||||
if (cmd)
|
||||
{
|
||||
if (!(cmd->func) (cmd, cutargc, cutargs))
|
||||
@@ -358,7 +362,7 @@ grub_cmd_legacy_kernel (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
dev = grub_device_open (0);
|
||||
if (dev && dev->disk
|
||||
&& dev->disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID
|
||||
&& dev->disk->dev->id >= 0x80 && dev->disk->dev->id <= 0x90)
|
||||
&& dev->disk->id >= 0x80 && dev->disk->id <= 0x90)
|
||||
{
|
||||
struct grub_partition *part = dev->disk->partition;
|
||||
bsd_device = dev->disk->id - 0x80 - hdbias;
|
||||
@@ -469,10 +473,19 @@ grub_cmd_legacy_initrd (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
|
||||
if (kernel_type == LINUX)
|
||||
{
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
cmd = grub_command_find ("initrd16");
|
||||
#else
|
||||
cmd = grub_command_find ("initrd");
|
||||
#endif
|
||||
if (!cmd)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("can't find command `%s'"),
|
||||
"initrd16");
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
"initrd16"
|
||||
#else
|
||||
"initrd"
|
||||
#endif
|
||||
);
|
||||
|
||||
return cmd->func (cmd, argc, args);
|
||||
}
|
||||
@@ -546,8 +559,6 @@ struct legacy_md5_password
|
||||
grub_uint8_t hash[MD5_HASHLEN];
|
||||
};
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
|
||||
|
||||
static int
|
||||
check_password_md5_real (const char *entered,
|
||||
struct legacy_md5_password *pw)
|
||||
@@ -555,8 +566,13 @@ check_password_md5_real (const char *entered,
|
||||
grub_size_t enteredlen = grub_strlen (entered);
|
||||
unsigned char alt_result[MD5_HASHLEN];
|
||||
unsigned char *digest;
|
||||
grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
|
||||
grub_uint8_t *ctx;
|
||||
grub_size_t i;
|
||||
int ret;
|
||||
|
||||
ctx = grub_zalloc (GRUB_MD_MD5->contextsize);
|
||||
if (!ctx)
|
||||
return 0;
|
||||
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, entered, enteredlen);
|
||||
@@ -564,7 +580,7 @@ check_password_md5_real (const char *entered,
|
||||
GRUB_MD_MD5->write (ctx, entered, enteredlen);
|
||||
digest = GRUB_MD_MD5->read (ctx);
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
memcpy (alt_result, digest, MD5_HASHLEN);
|
||||
grub_memcpy (alt_result, digest, MD5_HASHLEN);
|
||||
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, entered, enteredlen);
|
||||
@@ -580,7 +596,7 @@ check_password_md5_real (const char *entered,
|
||||
|
||||
for (i = 0; i < 1000; i++)
|
||||
{
|
||||
memcpy (alt_result, digest, 16);
|
||||
grub_memcpy (alt_result, digest, 16);
|
||||
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
if ((i & 1) != 0)
|
||||
@@ -602,7 +618,9 @@ check_password_md5_real (const char *entered,
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
}
|
||||
|
||||
return (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0);
|
||||
ret = (grub_crypto_memcmp (digest, pw->hash, MD5_HASHLEN) == 0);
|
||||
grub_free (ctx);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -725,18 +743,12 @@ grub_cmd_legacy_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
NULL);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
int
|
||||
grub_legacy_check_md5_password (int argc, char **args,
|
||||
char *entered)
|
||||
{
|
||||
struct legacy_md5_password *pw = NULL;
|
||||
char entered[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
grub_puts_ (N_("Enter password: "));
|
||||
if (!grub_password_get (entered, GRUB_AUTH_MAX_PASSLEN))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
int ret;
|
||||
|
||||
if (args[0][0] != '-' || args[0][1] != '-')
|
||||
{
|
||||
@@ -745,17 +757,33 @@ grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unuse
|
||||
grub_memset (correct, 0, sizeof (correct));
|
||||
grub_strncpy (correct, args[0], sizeof (correct));
|
||||
|
||||
if (grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) != 0)
|
||||
return GRUB_ACCESS_DENIED;
|
||||
return GRUB_ERR_NONE;
|
||||
return grub_crypto_memcmp (entered, correct, GRUB_AUTH_MAX_PASSLEN) == 0;
|
||||
}
|
||||
|
||||
pw = parse_legacy_md5 (argc, args);
|
||||
|
||||
if (!pw)
|
||||
return 0;
|
||||
|
||||
ret = check_password_md5_real (entered, pw);
|
||||
grub_free (pw);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_legacy_check_password (struct grub_command *mycmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
char entered[GRUB_AUTH_MAX_PASSLEN];
|
||||
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
grub_puts_ (N_("Enter password: "));
|
||||
if (!grub_password_get (entered, GRUB_AUTH_MAX_PASSLEN))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
if (!check_password_md5_real (entered, pw))
|
||||
if (!grub_legacy_check_md5_password (argc, args,
|
||||
entered))
|
||||
return GRUB_ACCESS_DENIED;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -259,10 +259,19 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists,
|
||||
for (p = blocklists; p; p = p->next)
|
||||
{
|
||||
struct blocklist *q;
|
||||
/* Check if any pair of blocks overlap. */
|
||||
for (q = p->next; q; q = q->next)
|
||||
{
|
||||
/* Check if any pair of blocks overlap. */
|
||||
if (p->sector == q->sector)
|
||||
grub_disk_addr_t s1, s2;
|
||||
grub_disk_addr_t e1, e2;
|
||||
|
||||
s1 = p->sector;
|
||||
e1 = s1 + ((p->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
s2 = q->sector;
|
||||
e2 = s2 + ((q->length + GRUB_DISK_SECTOR_SIZE - 1) >> GRUB_DISK_SECTOR_BITS);
|
||||
|
||||
if (s1 < e2 && s2 < e1)
|
||||
{
|
||||
/* This might be actually valid, but it is unbelievable that
|
||||
any filesystem makes such a silly allocation. */
|
||||
@@ -286,9 +295,18 @@ check_blocklists (grub_envblk_t envblk, struct blocklist *blocklists,
|
||||
part_start = grub_partition_get_start (disk->partition);
|
||||
|
||||
buf = grub_envblk_buffer (envblk);
|
||||
char *blockbuf = NULL;
|
||||
grub_size_t blockbuf_len = 0;
|
||||
for (p = blocklists, index = 0; p; index += p->length, p = p->next)
|
||||
{
|
||||
char blockbuf[GRUB_DISK_SECTOR_SIZE];
|
||||
if (p->length > blockbuf_len)
|
||||
{
|
||||
grub_free (blockbuf);
|
||||
blockbuf_len = 2 * p->length;
|
||||
blockbuf = grub_malloc (blockbuf_len);
|
||||
if (!blockbuf)
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
if (grub_disk_read (disk, p->sector - part_start,
|
||||
p->offset, p->length, blockbuf))
|
||||
@@ -340,10 +358,6 @@ save_env_read_hook (grub_disk_addr_t sector, unsigned offset, unsigned length,
|
||||
struct grub_cmd_save_env_ctx *ctx = data;
|
||||
struct blocklist *block;
|
||||
|
||||
if (offset + length > GRUB_DISK_SECTOR_SIZE)
|
||||
/* Seemingly a bug. */
|
||||
return;
|
||||
|
||||
block = grub_malloc (sizeof (*block));
|
||||
if (! block)
|
||||
return;
|
||||
@@ -409,6 +423,8 @@ grub_cmd_save_env (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
else
|
||||
grub_envblk_delete (envblk, args[0]);
|
||||
|
||||
argc--;
|
||||
args++;
|
||||
@@ -430,7 +446,7 @@ GRUB_MOD_INIT(loadenv)
|
||||
{
|
||||
cmd_load =
|
||||
grub_register_extcmd ("load_env", grub_cmd_load_env, 0,
|
||||
N_("[-f FILE] [-s|--skip-sig] [whitelisted_variable_name] [...]"),
|
||||
N_("[-f FILE] [-s|--skip-sig] [variable_name_to_whitelist] [...]"),
|
||||
N_("Load variables from environment block file."),
|
||||
options);
|
||||
cmd_list =
|
||||
|
||||
@@ -0,0 +1,236 @@
|
||||
/* hfspbless.c - set the hfs+ boot directory. */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2003,2005,2007,2008,2009,2012,2013 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/command.h>
|
||||
#include <grub/fs.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/device.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/hfsplus.h>
|
||||
#include <grub/hfs.h>
|
||||
#include <grub/partition.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/err.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
struct find_node_context
|
||||
{
|
||||
grub_uint64_t inode_found;
|
||||
char *dirname;
|
||||
enum
|
||||
{ FOUND_NONE, FOUND_FILE, FOUND_DIR } found;
|
||||
};
|
||||
|
||||
static int
|
||||
find_inode (const char *filename,
|
||||
const struct grub_dirhook_info *info, void *data)
|
||||
{
|
||||
struct find_node_context *ctx = data;
|
||||
if (!info->inodeset)
|
||||
return 0;
|
||||
|
||||
if ((grub_strcmp (ctx->dirname, filename) == 0
|
||||
|| (info->case_insensitive
|
||||
&& grub_strcasecmp (ctx->dirname, filename) == 0)))
|
||||
{
|
||||
ctx->inode_found = info->inode;
|
||||
ctx->found = info->dir ? FOUND_DIR : FOUND_FILE;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_mac_bless_inode (grub_device_t dev, grub_uint32_t inode, int is_dir,
|
||||
int intel)
|
||||
{
|
||||
grub_err_t err;
|
||||
union
|
||||
{
|
||||
struct grub_hfs_sblock hfs;
|
||||
struct grub_hfsplus_volheader hfsplus;
|
||||
} volheader;
|
||||
grub_disk_addr_t embedded_offset;
|
||||
|
||||
if (intel && is_dir)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
"can't bless a directory for mactel");
|
||||
if (!intel && !is_dir)
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"can't bless a file for mac PPC");
|
||||
|
||||
/* Read the bootblock. */
|
||||
err = grub_disk_read (dev->disk, GRUB_HFSPLUS_SBLOCK, 0, sizeof (volheader),
|
||||
(char *) &volheader);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
embedded_offset = 0;
|
||||
if (grub_be_to_cpu16 (volheader.hfs.magic) == GRUB_HFS_MAGIC)
|
||||
{
|
||||
int extent_start;
|
||||
int ablk_size;
|
||||
int ablk_start;
|
||||
|
||||
/* See if there's an embedded HFS+ filesystem. */
|
||||
if (grub_be_to_cpu16 (volheader.hfs.embed_sig) != GRUB_HFSPLUS_MAGIC)
|
||||
{
|
||||
if (intel)
|
||||
volheader.hfs.intel_bootfile = grub_be_to_cpu32 (inode);
|
||||
else
|
||||
volheader.hfs.ppc_bootdir = grub_be_to_cpu32 (inode);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Calculate the offset needed to translate HFS+ sector numbers. */
|
||||
extent_start =
|
||||
grub_be_to_cpu16 (volheader.hfs.embed_extent.first_block);
|
||||
ablk_size = grub_be_to_cpu32 (volheader.hfs.blksz);
|
||||
ablk_start = grub_be_to_cpu16 (volheader.hfs.first_block);
|
||||
embedded_offset = (ablk_start
|
||||
+ extent_start
|
||||
* (ablk_size >> GRUB_DISK_SECTOR_BITS));
|
||||
|
||||
err =
|
||||
grub_disk_read (dev->disk, embedded_offset + GRUB_HFSPLUS_SBLOCK, 0,
|
||||
sizeof (volheader), (char *) &volheader);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUS_MAGIC)
|
||||
&& (grub_be_to_cpu16 (volheader.hfsplus.magic) != GRUB_HFSPLUSX_MAGIC))
|
||||
return grub_error (GRUB_ERR_BAD_FS, "not a HFS+ filesystem");
|
||||
if (intel)
|
||||
volheader.hfsplus.intel_bootfile = grub_be_to_cpu32 (inode);
|
||||
else
|
||||
volheader.hfsplus.ppc_bootdir = grub_be_to_cpu32 (inode);
|
||||
|
||||
return grub_disk_write (dev->disk, embedded_offset + GRUB_HFSPLUS_SBLOCK, 0,
|
||||
sizeof (volheader), (char *) &volheader);
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_mac_bless_file (grub_device_t dev, const char *path_in, int intel)
|
||||
{
|
||||
grub_fs_t fs;
|
||||
|
||||
char *path, *tail;
|
||||
struct find_node_context ctx;
|
||||
|
||||
fs = grub_fs_probe (dev);
|
||||
if (!fs || (grub_strcmp (fs->name, "hfsplus") != 0
|
||||
&& grub_strcmp (fs->name, "hfs") != 0))
|
||||
return grub_error (GRUB_ERR_BAD_FS, "no suitable FS found");
|
||||
|
||||
path = grub_strdup (path_in);
|
||||
if (!path)
|
||||
return grub_errno;
|
||||
|
||||
tail = path + grub_strlen (path) - 1;
|
||||
|
||||
/* Remove trailing '/'. */
|
||||
while (tail != path && *tail == '/')
|
||||
*(tail--) = 0;
|
||||
|
||||
tail = grub_strrchr (path, '/');
|
||||
ctx.found = 0;
|
||||
|
||||
if (tail)
|
||||
{
|
||||
*tail = 0;
|
||||
ctx.dirname = tail + 1;
|
||||
|
||||
(fs->dir) (dev, *path == 0 ? "/" : path, find_inode, &ctx);
|
||||
}
|
||||
else
|
||||
{
|
||||
ctx.dirname = path + 1;
|
||||
(fs->dir) (dev, "/", find_inode, &ctx);
|
||||
}
|
||||
if (!ctx.found)
|
||||
{
|
||||
grub_free (path);
|
||||
return grub_error (GRUB_ERR_FILE_NOT_FOUND, N_("file `%s' not found"),
|
||||
path_in);
|
||||
}
|
||||
grub_free (path);
|
||||
|
||||
return grub_mac_bless_inode (dev, (grub_uint32_t) ctx.inode_found,
|
||||
(ctx.found == FOUND_DIR), intel);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_macbless (grub_command_t cmd, int argc, char **args)
|
||||
{
|
||||
char *device_name;
|
||||
char *path = 0;
|
||||
grub_device_t dev;
|
||||
grub_err_t err;
|
||||
|
||||
if (argc != 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
|
||||
device_name = grub_file_get_device_name (args[0]);
|
||||
dev = grub_device_open (device_name);
|
||||
|
||||
path = grub_strchr (args[0], ')');
|
||||
if (!path)
|
||||
path = args[0];
|
||||
else
|
||||
path = path + 1;
|
||||
|
||||
if (!path || *path == 0 || !device_name)
|
||||
{
|
||||
if (dev)
|
||||
grub_device_close (dev);
|
||||
|
||||
grub_free (device_name);
|
||||
grub_free (path);
|
||||
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid argument");
|
||||
}
|
||||
|
||||
err = grub_mac_bless_file (dev, path, cmd->name[3] == 't');
|
||||
|
||||
grub_device_close (dev);
|
||||
grub_free (device_name);
|
||||
return err;
|
||||
}
|
||||
|
||||
static grub_command_t cmd, cmd_ppc;
|
||||
|
||||
GRUB_MOD_INIT(macbless)
|
||||
{
|
||||
cmd = grub_register_command ("mactelbless", grub_cmd_macbless,
|
||||
N_("FILE"),
|
||||
N_
|
||||
("Bless FILE of HFS or HFS+ partition for intel macs."));
|
||||
cmd_ppc =
|
||||
grub_register_command ("macppcbless", grub_cmd_macbless, N_("DIR"),
|
||||
N_
|
||||
("Bless DIR of HFS or HFS+ partition for PPC macs."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(macbless)
|
||||
{
|
||||
grub_unregister_command (cmd);
|
||||
grub_unregister_command (cmd_ppc);
|
||||
}
|
||||
@@ -101,12 +101,18 @@ grub_mini_cmd_dump (struct grub_command *cmd __attribute__ ((unused)),
|
||||
if (argc == 0)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "no address specified");
|
||||
|
||||
addr = (grub_uint8_t *) grub_strtoul (argv[0], 0, 0);
|
||||
#if GRUB_CPU_SIZEOF_VOID_P == GRUB_CPU_SIZEOF_LONG
|
||||
#define grub_strtoaddr grub_strtoul
|
||||
#else
|
||||
#define grub_strtoaddr grub_strtoull
|
||||
#endif
|
||||
|
||||
addr = (grub_uint8_t *) grub_strtoaddr (argv[0], 0, 0);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
if (argc > 1)
|
||||
size = (grub_size_t) grub_strtoul (argv[1], 0, 0);
|
||||
size = (grub_size_t) grub_strtoaddr (argv[1], 0, 0);
|
||||
|
||||
while (size--)
|
||||
{
|
||||
|
||||
@@ -75,6 +75,7 @@ get_uuid (const char *name, char **uuid, int getnative)
|
||||
/* Native disks. */
|
||||
case GRUB_DISK_DEVICE_ATA_ID:
|
||||
case GRUB_DISK_DEVICE_SCSI_ID:
|
||||
case GRUB_DISK_DEVICE_XEN:
|
||||
if (getnative)
|
||||
break;
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ show_help (grub_device_t dev)
|
||||
}
|
||||
}
|
||||
if (! found)
|
||||
grub_printf_ (N_("Sorry no parttool is available for %s\n"),
|
||||
grub_printf_ (N_("Sorry, no parttool is available for %s\n"),
|
||||
dev->disk->partition->partmap->name);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ GRUB_MOD_INIT(pcidump)
|
||||
{
|
||||
cmd = grub_register_extcmd ("pcidump", grub_cmd_pcidump, 0,
|
||||
N_("[-s POSITION] [-d DEVICE]"),
|
||||
N_("Dump PCI configuration space."), options);
|
||||
N_("Show raw dump of the PCI configuration space."), options);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(pcidump)
|
||||
|
||||
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 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/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/extcmd.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/file.h>
|
||||
#include <grub/normal.h>
|
||||
#include <grub/script_sh.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/syslinux_parse.h>
|
||||
#include <grub/crypto.h>
|
||||
#include <grub/auth.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/partition.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
/* Helper for syslinux_file. */
|
||||
static grub_err_t
|
||||
syslinux_file_getline (char **line, int cont __attribute__ ((unused)),
|
||||
void *data __attribute__ ((unused)))
|
||||
{
|
||||
*line = 0;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static const struct grub_arg_option options[] =
|
||||
{
|
||||
{"root", 'r', 0,
|
||||
N_("root directory of the syslinux disk [default=/]."),
|
||||
N_("DIR"), ARG_TYPE_STRING},
|
||||
{"cwd", 'c', 0,
|
||||
N_("current directory of syslinux [default is parent directory of input file]."),
|
||||
N_("DIR"), ARG_TYPE_STRING},
|
||||
{"isolinux", 'i', 0, N_("assume input is an isolinux configuration file."), 0, 0},
|
||||
{"pxelinux", 'p', 0, N_("assume input is a pxelinux configuration file."), 0, 0},
|
||||
{"syslinux", 's', 0, N_("assume input is a syslinux configuration file."), 0, 0},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
OPTION_ROOT,
|
||||
OPTION_CWD,
|
||||
OPTION_ISOLINUX,
|
||||
OPTION_PXELINUX,
|
||||
OPTION_SYSLINUX
|
||||
};
|
||||
|
||||
static grub_err_t
|
||||
syslinux_file (grub_extcmd_context_t ctxt, const char *filename)
|
||||
{
|
||||
char *result;
|
||||
const char *root = ctxt->state[OPTION_ROOT].set ? ctxt->state[OPTION_ROOT].arg : "/";
|
||||
const char *cwd = ctxt->state[OPTION_CWD].set ? ctxt->state[OPTION_CWD].arg : NULL;
|
||||
grub_syslinux_flavour_t flav = GRUB_SYSLINUX_UNKNOWN;
|
||||
char *cwdf = NULL;
|
||||
grub_menu_t menu;
|
||||
|
||||
if (ctxt->state[OPTION_ISOLINUX].set)
|
||||
flav = GRUB_SYSLINUX_ISOLINUX;
|
||||
if (ctxt->state[OPTION_PXELINUX].set)
|
||||
flav = GRUB_SYSLINUX_PXELINUX;
|
||||
if (ctxt->state[OPTION_SYSLINUX].set)
|
||||
flav = GRUB_SYSLINUX_SYSLINUX;
|
||||
|
||||
if (!cwd)
|
||||
{
|
||||
char *p;
|
||||
cwdf = grub_strdup (filename);
|
||||
if (!cwdf)
|
||||
return grub_errno;
|
||||
p = grub_strrchr (cwdf, '/');
|
||||
if (!p)
|
||||
{
|
||||
grub_free (cwdf);
|
||||
cwd = "/";
|
||||
cwdf = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
*p = '\0';
|
||||
cwd = cwdf;
|
||||
}
|
||||
}
|
||||
|
||||
grub_dprintf ("syslinux",
|
||||
"transforming syslinux config %s, root = %s, cwd = %s\n",
|
||||
filename, root, cwd);
|
||||
|
||||
result = grub_syslinux_config_file (root, root, cwd, cwd, filename, flav);
|
||||
if (!result)
|
||||
return grub_errno;
|
||||
|
||||
grub_dprintf ("syslinux", "syslinux config transformed\n");
|
||||
|
||||
menu = grub_env_get_menu ();
|
||||
if (! menu)
|
||||
{
|
||||
menu = grub_zalloc (sizeof (*menu));
|
||||
if (! menu)
|
||||
return grub_errno;
|
||||
|
||||
grub_env_set_menu (menu);
|
||||
}
|
||||
|
||||
grub_normal_parse_line (result, syslinux_file_getline, NULL);
|
||||
grub_print_error ();
|
||||
grub_free (result);
|
||||
grub_free (cwdf);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_syslinux_source (grub_extcmd_context_t ctxt,
|
||||
int argc, char **args)
|
||||
{
|
||||
int new_env, extractor;
|
||||
grub_err_t ret;
|
||||
|
||||
if (argc != 1)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
|
||||
|
||||
extractor = (ctxt->extcmd->cmd->name[0] == 'e');
|
||||
new_env = (ctxt->extcmd->cmd->name[extractor ? (sizeof ("extract_syslinux_entries_") - 1)
|
||||
: (sizeof ("syslinux_") - 1)] == 'c');
|
||||
|
||||
if (new_env)
|
||||
grub_cls ();
|
||||
|
||||
if (new_env && !extractor)
|
||||
grub_env_context_open ();
|
||||
if (extractor)
|
||||
grub_env_extractor_open (!new_env);
|
||||
|
||||
ret = syslinux_file (ctxt, args[0]);
|
||||
|
||||
if (new_env)
|
||||
{
|
||||
grub_menu_t menu;
|
||||
menu = grub_env_get_menu ();
|
||||
if (menu && menu->size)
|
||||
grub_show_menu (menu, 1, 0);
|
||||
if (!extractor)
|
||||
grub_env_context_close ();
|
||||
}
|
||||
if (extractor)
|
||||
grub_env_extractor_close (!new_env);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static grub_extcmd_t cmd_source, cmd_configfile;
|
||||
static grub_extcmd_t cmd_source_extract, cmd_configfile_extract;
|
||||
|
||||
GRUB_MOD_INIT(syslinuxcfg)
|
||||
{
|
||||
cmd_source
|
||||
= grub_register_extcmd ("syslinux_source",
|
||||
grub_cmd_syslinux_source, 0,
|
||||
N_("FILE"),
|
||||
/* TRANSLATORS: "syslinux config" means
|
||||
"config as used by syslinux". */
|
||||
N_("Execute syslinux config in same context"),
|
||||
options);
|
||||
cmd_configfile
|
||||
= grub_register_extcmd ("syslinux_configfile",
|
||||
grub_cmd_syslinux_source, 0,
|
||||
N_("FILE"),
|
||||
N_("Execute syslinux config in new context"),
|
||||
options);
|
||||
cmd_source_extract
|
||||
= grub_register_extcmd ("extract_syslinux_entries_source",
|
||||
grub_cmd_syslinux_source, 0,
|
||||
N_("FILE"),
|
||||
N_("Execute syslinux config in same context taking only menu entries"),
|
||||
options);
|
||||
cmd_configfile_extract
|
||||
= grub_register_extcmd ("extract_syslinux_entries_configfile",
|
||||
grub_cmd_syslinux_source, 0,
|
||||
N_("FILE"),
|
||||
N_("Execute syslinux config in new context taking only menu entries"),
|
||||
options);
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(syslinuxcfg)
|
||||
{
|
||||
grub_unregister_extcmd (cmd_source);
|
||||
grub_unregister_extcmd (cmd_configfile);
|
||||
grub_unregister_extcmd (cmd_source_extract);
|
||||
grub_unregister_extcmd (cmd_configfile_extract);
|
||||
}
|
||||
@@ -35,10 +35,13 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
static void
|
||||
read_progress (grub_disk_addr_t sector __attribute__ ((unused)),
|
||||
unsigned offset __attribute__ ((unused)),
|
||||
unsigned len __attribute__ ((unused)),
|
||||
unsigned len,
|
||||
void *data __attribute__ ((unused)))
|
||||
{
|
||||
grub_xputs (".");
|
||||
for (; len >= GRUB_DISK_SECTOR_SIZE; len -= GRUB_DISK_SECTOR_SIZE)
|
||||
grub_xputs (".");
|
||||
if (len)
|
||||
grub_xputs (".");
|
||||
grub_refresh ();
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static const struct grub_arg_option options[] =
|
||||
{
|
||||
{ "set", 's', 0, N_("Variable name to update."), N_("VARNAME"), ARG_TYPE_STRING },
|
||||
{ "set", 's', 0, N_("Set a variable to return value."), N_("VARNAME"), ARG_TYPE_STRING },
|
||||
{ "upcase", 'U', 0, N_("Translate to upper case."), 0, 0 },
|
||||
{ "downcase", 'D', 0, N_("Translate to lower case."), 0, 0 },
|
||||
{ 0, 0, 0, 0, 0, 0 }
|
||||
|
||||
+233
-76
@@ -33,6 +33,13 @@
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
struct grub_verified
|
||||
{
|
||||
grub_file_t file;
|
||||
void *buf;
|
||||
};
|
||||
typedef struct grub_verified *grub_verified_t;
|
||||
|
||||
enum
|
||||
{
|
||||
OPTION_SKIP_SIG = 0
|
||||
@@ -41,7 +48,7 @@ enum
|
||||
static const struct grub_arg_option options[] =
|
||||
{
|
||||
{"skip-sig", 's', 0,
|
||||
N_("Skip signature-checking of the signature file."), 0, ARG_TYPE_NONE},
|
||||
N_("Skip signature-checking of the public key file."), 0, ARG_TYPE_NONE},
|
||||
{0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
@@ -133,7 +140,7 @@ struct signature_v4_header
|
||||
grub_uint8_t pkeyalgo;
|
||||
grub_uint8_t hash;
|
||||
grub_uint16_t hashed_sub;
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
const char *hashes[] = {
|
||||
[0x01] = "md5",
|
||||
@@ -145,16 +152,31 @@ const char *hashes[] = {
|
||||
[0x0b] = "sha224"
|
||||
};
|
||||
|
||||
struct gcry_pk_spec *grub_crypto_pk_dsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_ecdsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_rsa;
|
||||
|
||||
static int
|
||||
dsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk);
|
||||
static int
|
||||
rsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk);
|
||||
|
||||
struct
|
||||
{
|
||||
const char *name;
|
||||
grub_size_t nmpisig;
|
||||
grub_size_t nmpipub;
|
||||
struct gcry_pk_spec **algo;
|
||||
int (*pad) (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk);
|
||||
const char *module;
|
||||
} pkalgos[] =
|
||||
{
|
||||
[1] = { "rsa", 1, 2 },
|
||||
[3] = { "rsa", 1, 2 },
|
||||
[17] = { "dsa", 2, 4 },
|
||||
[1] = { "rsa", 1, 2, &grub_crypto_pk_rsa, rsa_pad, "gcry_rsa" },
|
||||
[3] = { "rsa", 1, 2, &grub_crypto_pk_rsa, rsa_pad, "gcry_rsa" },
|
||||
[17] = { "dsa", 2, 4, &grub_crypto_pk_dsa, dsa_pad, "gcry_dsa" },
|
||||
};
|
||||
|
||||
struct grub_public_key
|
||||
@@ -177,22 +199,39 @@ free_pk (struct grub_public_key *pk)
|
||||
struct grub_public_subkey *nsk, *sk;
|
||||
for (sk = pk->subkeys; sk; sk = nsk)
|
||||
{
|
||||
grub_size_t i;
|
||||
for (i = 0; i < ARRAY_SIZE (sk->mpis); i++)
|
||||
if (sk->mpis[i])
|
||||
gcry_mpi_release (sk->mpis[i]);
|
||||
nsk = sk->next;
|
||||
grub_free (sk);
|
||||
}
|
||||
grub_free (pk);
|
||||
}
|
||||
|
||||
#define READBUF_SIZE 4096
|
||||
|
||||
struct grub_public_key *
|
||||
grub_load_public_key (grub_file_t f)
|
||||
{
|
||||
grub_err_t err;
|
||||
struct grub_public_key *ret;
|
||||
struct grub_public_subkey **last = 0;
|
||||
void *fingerprint_context = NULL;
|
||||
grub_uint8_t *buffer = NULL;
|
||||
|
||||
ret = grub_zalloc (sizeof (*ret));
|
||||
if (!ret)
|
||||
return NULL;
|
||||
{
|
||||
grub_free (fingerprint_context);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer = grub_zalloc (READBUF_SIZE);
|
||||
fingerprint_context = grub_zalloc (GRUB_MD_SHA1->contextsize);
|
||||
|
||||
if (!buffer || !fingerprint_context)
|
||||
goto fail;
|
||||
|
||||
last = &ret->subkeys;
|
||||
|
||||
@@ -206,7 +245,6 @@ grub_load_public_key (grub_file_t f)
|
||||
struct grub_public_subkey *sk;
|
||||
grub_size_t i;
|
||||
grub_uint16_t len_be;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (fingerprint_context, GRUB_MD_SHA1->contextsize);
|
||||
|
||||
err = read_packet_header (f, &type, &len);
|
||||
|
||||
@@ -215,7 +253,11 @@ grub_load_public_key (grub_file_t f)
|
||||
if (type == 0xfe)
|
||||
continue;
|
||||
if (type == 0xff)
|
||||
return ret;
|
||||
{
|
||||
grub_free (fingerprint_context);
|
||||
grub_free (buffer);
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_dprintf ("crypt", "len = %x\n", (int) len);
|
||||
|
||||
@@ -279,7 +321,6 @@ grub_load_public_key (grub_file_t f)
|
||||
{
|
||||
grub_uint16_t l;
|
||||
grub_size_t lb;
|
||||
grub_uint8_t buffer[4096];
|
||||
if (grub_file_read (f, &l, sizeof (l)) != sizeof (l))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
@@ -287,7 +328,7 @@ grub_load_public_key (grub_file_t f)
|
||||
}
|
||||
|
||||
lb = (grub_be_to_cpu16 (l) + GRUB_CHAR_BIT - 1) / GRUB_CHAR_BIT;
|
||||
if (lb > sizeof (buffer) - sizeof (grub_uint16_t))
|
||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
@@ -322,6 +363,8 @@ grub_load_public_key (grub_file_t f)
|
||||
}
|
||||
fail:
|
||||
free_pk (ret);
|
||||
grub_free (fingerprint_context);
|
||||
grub_free (buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -351,6 +394,51 @@ grub_crypto_pk_locate_subkey_in_trustdb (grub_uint64_t keyid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
dsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk)
|
||||
{
|
||||
unsigned nbits = gcry_mpi_get_nbits (sk->mpis[1]);
|
||||
grub_dprintf ("crypt", "must be %u bits got %d bits\n", nbits,
|
||||
(int)(8 * hash->mdlen));
|
||||
return gcry_mpi_scan (hmpi, GCRYMPI_FMT_USG, hval,
|
||||
nbits / 8 < (unsigned) hash->mdlen ? nbits / 8
|
||||
: (unsigned) hash->mdlen, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
rsa_pad (gcry_mpi_t *hmpi, grub_uint8_t *hval,
|
||||
const gcry_md_spec_t *hash, struct grub_public_subkey *sk)
|
||||
{
|
||||
grub_size_t tlen, emlen, fflen;
|
||||
grub_uint8_t *em, *emptr;
|
||||
unsigned nbits = gcry_mpi_get_nbits (sk->mpis[0]);
|
||||
int ret;
|
||||
tlen = hash->mdlen + hash->asnlen;
|
||||
emlen = (nbits + 7) / 8;
|
||||
if (emlen < tlen + 11)
|
||||
return 1;
|
||||
|
||||
em = grub_malloc (emlen);
|
||||
if (!em)
|
||||
return 1;
|
||||
|
||||
em[0] = 0x00;
|
||||
em[1] = 0x01;
|
||||
fflen = emlen - tlen - 3;
|
||||
for (emptr = em + 2; emptr < em + 2 + fflen; emptr++)
|
||||
*emptr = 0xff;
|
||||
*emptr++ = 0x00;
|
||||
grub_memcpy (emptr, hash->asnoid, hash->asnlen);
|
||||
emptr += hash->asnlen;
|
||||
grub_memcpy (emptr, hval, hash->mdlen);
|
||||
|
||||
ret = gcry_mpi_scan (hmpi, GCRYMPI_FMT_USG, em, emlen, 0);
|
||||
grub_free (em);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
grub_file_t f, grub_file_t sig,
|
||||
@@ -404,7 +492,7 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
{
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (context, hash->contextsize);
|
||||
void *context = NULL;
|
||||
unsigned char *hval;
|
||||
grub_ssize_t rem = grub_be_to_cpu16 (v4.hashed_sub);
|
||||
grub_uint32_t headlen = grub_cpu_to_be32 (rem + 6);
|
||||
@@ -415,18 +503,22 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
gcry_mpi_t hmpi;
|
||||
grub_uint64_t keyid = 0;
|
||||
struct grub_public_subkey *sk;
|
||||
grub_uint8_t *readbuf = NULL;
|
||||
|
||||
context = grub_zalloc (hash->contextsize);
|
||||
readbuf = grub_zalloc (READBUF_SIZE);
|
||||
if (!context || !readbuf)
|
||||
goto fail;
|
||||
|
||||
grub_memset (context, 0, sizeof (context));
|
||||
hash->init (context);
|
||||
if (buf)
|
||||
hash->write (context, buf, size);
|
||||
else
|
||||
while (1)
|
||||
{
|
||||
grub_uint8_t readbuf[4096];
|
||||
r = grub_file_read (f, readbuf, sizeof (readbuf));
|
||||
r = grub_file_read (f, readbuf, READBUF_SIZE);
|
||||
if (r < 0)
|
||||
return grub_errno;
|
||||
goto fail;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -436,10 +528,10 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hash->write (context, &v4, sizeof (v4));
|
||||
while (rem)
|
||||
{
|
||||
grub_uint8_t readbuf[4096];
|
||||
r = grub_file_read (sig, readbuf, rem < (grub_ssize_t) sizeof (readbuf) ? rem : (grub_ssize_t) sizeof (readbuf));
|
||||
r = grub_file_read (sig, readbuf,
|
||||
rem < READBUF_SIZE ? rem : READBUF_SIZE);
|
||||
if (r < 0)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
if (r == 0)
|
||||
break;
|
||||
hash->write (context, readbuf, r);
|
||||
@@ -451,17 +543,16 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hash->write (context, &headlen, sizeof (headlen));
|
||||
r = grub_file_read (sig, &unhashed_sub, sizeof (unhashed_sub));
|
||||
if (r != sizeof (unhashed_sub))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
{
|
||||
grub_uint8_t readbuf[4096];
|
||||
grub_uint8_t *ptr;
|
||||
grub_uint32_t l;
|
||||
rem = grub_be_to_cpu16 (unhashed_sub);
|
||||
if (rem > (int) sizeof (readbuf))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (rem > READBUF_SIZE)
|
||||
goto fail;
|
||||
r = grub_file_read (sig, readbuf, rem);
|
||||
if (r != rem)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
for (ptr = readbuf; ptr < readbuf + rem; ptr += l)
|
||||
{
|
||||
if (*ptr < 192)
|
||||
@@ -492,9 +583,9 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
hval = hash->read (context);
|
||||
|
||||
if (grub_file_read (sig, hash_start, sizeof (hash_start)) != sizeof (hash_start))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
if (grub_memcmp (hval, hash_start, sizeof (hash_start)) != 0)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
goto fail;
|
||||
|
||||
grub_dprintf ("crypt", "@ %x\n", (int)grub_file_tell (sig));
|
||||
|
||||
@@ -502,25 +593,24 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
{
|
||||
grub_uint16_t l;
|
||||
grub_size_t lb;
|
||||
grub_uint8_t buffer[4096];
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
if (grub_file_read (sig, &l, sizeof (l)) != sizeof (l))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
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 > sizeof (buffer) - sizeof (grub_uint16_t))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (lb > READBUF_SIZE - sizeof (grub_uint16_t))
|
||||
goto fail;
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
if (grub_file_read (sig, buffer + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (grub_file_read (sig, readbuf + sizeof (grub_uint16_t), lb) != (grub_ssize_t) lb)
|
||||
goto fail;
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
grub_memcpy (buffer, &l, sizeof (l));
|
||||
grub_memcpy (readbuf, &l, sizeof (l));
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
|
||||
if (gcry_mpi_scan (&mpis[i], GCRYMPI_FMT_PGP,
|
||||
buffer, lb + sizeof (grub_uint16_t), 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
readbuf, lb + sizeof (grub_uint16_t), 0))
|
||||
goto fail;
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
}
|
||||
|
||||
@@ -529,24 +619,42 @@ grub_verify_signature_real (char *buf, grub_size_t size,
|
||||
else
|
||||
sk = grub_crypto_pk_locate_subkey_in_trustdb (keyid);
|
||||
if (!sk)
|
||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"), keyid);
|
||||
{
|
||||
/* TRANSLATORS: %08x is 32-bit key id. */
|
||||
grub_error (GRUB_ERR_BAD_SIGNATURE, N_("public key %08x not found"),
|
||||
keyid);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
unsigned nbits = gcry_mpi_get_nbits (sk->mpis[1]);
|
||||
grub_dprintf ("crypt", "must be %u bits got %d bits\n", nbits,
|
||||
(int)(8 * hash->mdlen));
|
||||
if (pkalgos[pk].pad (&hmpi, hval, hash, sk))
|
||||
goto fail;
|
||||
if (!*pkalgos[pk].algo)
|
||||
{
|
||||
grub_dl_load (pkalgos[pk].module);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
if (gcry_mpi_scan (&hmpi, GCRYMPI_FMT_USG, hval,
|
||||
nbits / 8 < (unsigned) hash->mdlen ? nbits / 8
|
||||
: (unsigned) hash->mdlen, 0))
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("bad signature"));
|
||||
if (!grub_crypto_pk_dsa)
|
||||
return grub_error (GRUB_ERR_BAD_SIGNATURE, N_("module `%s' isn't loaded"), "gcry_dsa");
|
||||
if (grub_crypto_pk_dsa->verify (0, hmpi, mpis, sk->mpis, 0, 0))
|
||||
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;
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
@@ -643,8 +751,8 @@ static grub_err_t
|
||||
grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
int argc, char **args)
|
||||
{
|
||||
grub_file_t f, sig;
|
||||
grub_err_t err;
|
||||
grub_file_t f = NULL, sig = NULL;
|
||||
grub_err_t err = GRUB_ERR_NONE;
|
||||
struct grub_public_key *pk = NULL;
|
||||
|
||||
grub_dprintf ("crypt", "alive\n");
|
||||
@@ -675,37 +783,65 @@ grub_cmd_verify_signature (grub_extcmd_context_t ctxt,
|
||||
grub_file_filter_disable_all ();
|
||||
f = grub_file_open (args[0]);
|
||||
if (!f)
|
||||
return grub_errno;
|
||||
{
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
grub_file_filter_disable_all ();
|
||||
sig = grub_file_open (args[1]);
|
||||
if (!sig)
|
||||
{
|
||||
grub_file_close (f);
|
||||
return grub_errno;
|
||||
err = grub_errno;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
err = grub_verify_signature (f, sig, pk);
|
||||
grub_file_close (f);
|
||||
grub_file_close (sig);
|
||||
fail:
|
||||
if (sig)
|
||||
grub_file_close (sig);
|
||||
if (f)
|
||||
grub_file_close (f);
|
||||
if (pk)
|
||||
free_pk (pk);
|
||||
return err;
|
||||
}
|
||||
|
||||
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_memcpy (buf, (char *) file->data + file->offset, 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_free (file->data);
|
||||
grub_verified_t verified = file->data;
|
||||
|
||||
grub_file_close (verified->file);
|
||||
verified_free (verified);
|
||||
file->data = 0;
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
/* device and name are freed by parent */
|
||||
file->device = 0;
|
||||
file->name = 0;
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
struct grub_fs verified_fs =
|
||||
@@ -723,10 +859,13 @@ grub_pubkey_open (grub_file_t io, const char *filename)
|
||||
grub_err_t err;
|
||||
grub_file_filter_t curfilt[GRUB_FILE_FILTER_MAX];
|
||||
grub_file_t ret;
|
||||
grub_verified_t verified;
|
||||
|
||||
if (!sec)
|
||||
return io;
|
||||
if (io->device->disk && io->device->disk->id == GRUB_DISK_DEVICE_MEMDISK_ID)
|
||||
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;
|
||||
fsuf = grub_malloc (grub_strlen (filename) + sizeof (".sig"));
|
||||
if (!fsuf)
|
||||
@@ -746,7 +885,10 @@ grub_pubkey_open (grub_file_t io, const char *filename)
|
||||
|
||||
ret = grub_malloc (sizeof (*ret));
|
||||
if (!ret)
|
||||
return NULL;
|
||||
{
|
||||
grub_file_close (sig);
|
||||
return NULL;
|
||||
}
|
||||
*ret = *io;
|
||||
|
||||
ret->fs = &verified_fs;
|
||||
@@ -755,28 +897,46 @@ grub_pubkey_open (grub_file_t io, const char *filename)
|
||||
{
|
||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"big file signature isn't implemented yet");
|
||||
return NULL;
|
||||
}
|
||||
ret->data = grub_malloc (ret->size);
|
||||
if (!ret->data)
|
||||
{
|
||||
grub_file_close (sig);
|
||||
grub_free (ret);
|
||||
return NULL;
|
||||
}
|
||||
if (grub_file_read (io, ret->data, ret->size) != (grub_ssize_t) ret->size)
|
||||
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 (ret->data, ret->size, 0, sig, NULL);
|
||||
err = grub_verify_signature_real (verified->buf, ret->size, 0, sig, NULL);
|
||||
grub_file_close (sig);
|
||||
if (err)
|
||||
return NULL;
|
||||
io->device = 0;
|
||||
grub_file_close (io);
|
||||
{
|
||||
verified_free (verified);
|
||||
grub_free (ret);
|
||||
return NULL;
|
||||
}
|
||||
verified->file = io;
|
||||
ret->data = verified;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -803,9 +963,6 @@ struct grub_fs pseudo_fs =
|
||||
.read = pseudo_read
|
||||
};
|
||||
|
||||
struct gcry_pk_spec *grub_crypto_pk_dsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_ecdsa;
|
||||
struct gcry_pk_spec *grub_crypto_pk_rsa;
|
||||
|
||||
static grub_extcmd_t cmd, cmd_trust;
|
||||
static grub_command_t cmd_distrust, cmd_list;
|
||||
@@ -859,14 +1016,14 @@ GRUB_MOD_INIT(verify)
|
||||
options);
|
||||
cmd_trust = grub_register_extcmd ("trust", grub_cmd_trust, 0,
|
||||
N_("[-s|--skip-sig] PUBKEY_FILE"),
|
||||
N_("Add PKFILE to trusted keys."),
|
||||
N_("Add PUBKEY_FILE to trusted keys."),
|
||||
options);
|
||||
cmd_list = grub_register_command ("list_trusted", grub_cmd_list,
|
||||
0,
|
||||
N_("List trusted keys."));
|
||||
N_("Show the list of trusted keys."));
|
||||
cmd_distrust = grub_register_command ("distrust", grub_cmd_distrust,
|
||||
N_("PUBKEY_ID"),
|
||||
N_("Remove KEYID from trusted keys."));
|
||||
N_("Remove PUBKEY_ID from trusted keys."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI(verify)
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* 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/dl.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/command.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/xen.h>
|
||||
#include <grub/term.h>
|
||||
|
||||
GRUB_MOD_LICENSE ("GPLv3+");
|
||||
|
||||
static int
|
||||
hook (const char *dir, void *hook_data __attribute__ ((unused)))
|
||||
{
|
||||
grub_printf ("%s\n", dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_lsxen (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
char *dir;
|
||||
grub_err_t err;
|
||||
char *buf;
|
||||
|
||||
if (argc >= 1)
|
||||
return grub_xenstore_dir (args[0], hook, NULL);
|
||||
|
||||
buf = grub_xenstore_get_file ("domid", NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
dir = grub_xasprintf ("/local/domain/%s", buf);
|
||||
grub_free (buf);
|
||||
err = grub_xenstore_dir (dir, hook, NULL);
|
||||
grub_free (dir);
|
||||
return err;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_catxen (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char **args)
|
||||
{
|
||||
const char *dir = "domid";
|
||||
char *buf;
|
||||
|
||||
if (argc >= 1)
|
||||
dir = args[0];
|
||||
|
||||
buf = grub_xenstore_get_file (dir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
grub_xputs (buf);
|
||||
grub_xputs ("\n");
|
||||
grub_free (buf);
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
}
|
||||
|
||||
static grub_command_t cmd_ls, cmd_cat;
|
||||
|
||||
GRUB_MOD_INIT (lsxen)
|
||||
{
|
||||
cmd_ls = grub_register_command ("xen_ls", grub_cmd_lsxen, N_("[DIR]"),
|
||||
N_("List Xen storage."));
|
||||
cmd_cat = grub_register_command ("xen_cat", grub_cmd_catxen, N_("[DIR]"),
|
||||
N_("List Xen storage."));
|
||||
}
|
||||
|
||||
GRUB_MOD_FINI (lsxen)
|
||||
{
|
||||
grub_unregister_command (cmd_ls);
|
||||
grub_unregister_command (cmd_cat);
|
||||
}
|
||||
@@ -50,7 +50,7 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
grub_uint8_t *xnu_uuid;
|
||||
char uuid_string[sizeof ("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")];
|
||||
char *ptr;
|
||||
grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
|
||||
void *ctx;
|
||||
int low = 0;
|
||||
|
||||
if (argc < 1)
|
||||
@@ -65,11 +65,14 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
|
||||
serial = grub_cpu_to_be64 (grub_strtoull (args[0], 0, 16));
|
||||
|
||||
GRUB_MD_MD5->init (&ctx);
|
||||
GRUB_MD_MD5->write (&ctx, hash_prefix, sizeof (hash_prefix));
|
||||
GRUB_MD_MD5->write (&ctx, &serial, sizeof (serial));
|
||||
GRUB_MD_MD5->final (&ctx);
|
||||
xnu_uuid = GRUB_MD_MD5->read (&ctx);
|
||||
ctx = grub_zalloc (GRUB_MD_MD5->contextsize);
|
||||
if (!ctx)
|
||||
return grub_errno;
|
||||
GRUB_MD_MD5->init (ctx);
|
||||
GRUB_MD_MD5->write (ctx, hash_prefix, sizeof (hash_prefix));
|
||||
GRUB_MD_MD5->write (ctx, &serial, sizeof (serial));
|
||||
GRUB_MD_MD5->final (ctx);
|
||||
xnu_uuid = GRUB_MD_MD5->read (ctx);
|
||||
|
||||
grub_snprintf (uuid_string, sizeof (uuid_string),
|
||||
"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
@@ -91,6 +94,8 @@ grub_cmd_xnu_uuid (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (argc > 1)
|
||||
grub_env_set (args[1], uuid_string);
|
||||
|
||||
grub_free (ctx);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -37,8 +37,8 @@ diffuse (const gcry_md_spec_t * hash, grub_uint8_t * src,
|
||||
|
||||
grub_size_t fullblocks = size / hash->mdlen;
|
||||
int padding = size % hash->mdlen;
|
||||
grub_uint8_t final[hash->mdlen];
|
||||
grub_uint8_t temp[sizeof (IV) + hash->mdlen];
|
||||
grub_uint8_t final[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t temp[sizeof (IV) + GRUB_CRYPTO_MAX_MDLEN];
|
||||
|
||||
/* hash block the whole data set with different IVs to produce
|
||||
* more than just a single data block
|
||||
@@ -76,6 +76,9 @@ AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src, grub_uint8_t * dst,
|
||||
if (bufblock == NULL)
|
||||
return GPG_ERR_OUT_OF_MEMORY;
|
||||
|
||||
if (hash->mdlen > GRUB_CRYPTO_MAX_MDLEN || hash->mdlen == 0)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
grub_memset (bufblock, 0, blocksize);
|
||||
for (i = 0; i < blocknumbers - 1; i++)
|
||||
{
|
||||
|
||||
+36
-9
@@ -133,6 +133,7 @@ struct grub_ahci_device
|
||||
volatile struct grub_ahci_cmd_table *command_table;
|
||||
struct grub_pci_dma_chunk *rfis;
|
||||
int present;
|
||||
int atapi;
|
||||
};
|
||||
|
||||
static grub_err_t
|
||||
@@ -193,10 +194,8 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
return 0;
|
||||
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
||||
grub_pci_write_word (addr, grub_pci_read_word (addr) |
|
||||
GRUB_PCI_COMMAND_IO_ENABLED
|
||||
| GRUB_PCI_COMMAND_MEM_ENABLED
|
||||
| GRUB_PCI_COMMAND_BUS_MASTER);
|
||||
grub_pci_write_word (addr, grub_pci_read_word (addr)
|
||||
| GRUB_PCI_COMMAND_MEM_ENABLED);
|
||||
|
||||
hba = grub_pci_device_map_range (dev, bar & GRUB_PCI_ADDR_MEM_MASK,
|
||||
sizeof (hba));
|
||||
@@ -323,7 +322,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
|
||||
grub_dprintf ("ahci", "GLC:%x\n", hba->global_control);
|
||||
|
||||
nports = (hba->cap & GRUB_AHCI_HBA_CAP_NPORTS_MASK) + 1;
|
||||
nports = (GRUB_AHCI_HBA_CAP_NPORTS_MASK) + 1;
|
||||
|
||||
grub_dprintf ("ahci", "%d AHCI ports, PI = 0x%x\n", nports,
|
||||
hba->ports_implemented);
|
||||
@@ -359,7 +358,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
grub_dprintf ("ahci", "err: %x\n",
|
||||
adevs[i]->hba->ports[adevs[i]->port].sata_error);
|
||||
|
||||
adevs[i]->command_list_chunk = grub_memalign_dma32 (1024, sizeof (struct grub_ahci_cmd_head));
|
||||
adevs[i]->command_list_chunk = grub_memalign_dma32 (1024, sizeof (struct grub_ahci_cmd_head) * 32);
|
||||
if (!adevs[i]->command_list_chunk)
|
||||
{
|
||||
adevs[i] = 0;
|
||||
@@ -377,6 +376,12 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
|
||||
adevs[i]->command_list = grub_dma_get_virt (adevs[i]->command_list_chunk);
|
||||
adevs[i]->command_table = grub_dma_get_virt (adevs[i]->command_table_chunk);
|
||||
|
||||
grub_memset ((void *) adevs[i]->command_list, 0,
|
||||
sizeof (struct grub_ahci_cmd_table));
|
||||
grub_memset ((void *) adevs[i]->command_table, 0,
|
||||
sizeof (struct grub_ahci_cmd_head) * 32);
|
||||
|
||||
adevs[i]->command_list->command_table_base
|
||||
= grub_dma_get_phys (adevs[i]->command_table_chunk);
|
||||
|
||||
@@ -449,6 +454,7 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
adevs[i]->hba->ports[adevs[i]->port].fis_base = grub_dma_get_phys (adevs[i]->rfis);
|
||||
adevs[i]->hba->ports[adevs[i]->port].command_list_base
|
||||
= grub_dma_get_phys (adevs[i]->command_list_chunk);
|
||||
adevs[i]->hba->ports[adevs[i]->port].command_issue = 0;
|
||||
adevs[i]->hba->ports[adevs[i]->port].command |= GRUB_AHCI_HBA_PORT_CMD_FRE;
|
||||
}
|
||||
|
||||
@@ -595,6 +601,9 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
failed_adevs[i] = adevs[i];
|
||||
adevs[i] = 0;
|
||||
}
|
||||
|
||||
grub_dprintf ("ahci", "cleaning up failed devs\n");
|
||||
|
||||
for (i = 0; i < nports; i++)
|
||||
if (failed_adevs[i] && (fr_running & (1 << i)))
|
||||
failed_adevs[i]->hba->ports[failed_adevs[i]->port].command &= ~GRUB_AHCI_HBA_PORT_CMD_FRE;
|
||||
@@ -616,6 +625,14 @@ grub_ahci_pciinit (grub_pci_device_t dev,
|
||||
grub_dma_free (failed_adevs[i]->rfis);
|
||||
}
|
||||
|
||||
for (i = 0; i < nports; i++)
|
||||
if (adevs[i] && (adevs[i]->hba->ports[adevs[i]->port].sig >> 16) == 0xeb14)
|
||||
adevs[i]->atapi = 1;
|
||||
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
||||
grub_pci_write_word (addr, grub_pci_read_word (addr)
|
||||
| GRUB_PCI_COMMAND_BUS_MASTER);
|
||||
|
||||
for (i = 0; i < nports; i++)
|
||||
if (adevs[i])
|
||||
{
|
||||
@@ -842,6 +859,12 @@ grub_ahci_reset_port (struct grub_ahci_device *dev, int force)
|
||||
{
|
||||
struct grub_disk_ata_pass_through_parms parms2;
|
||||
dev->hba->ports[dev->port].command &= ~GRUB_AHCI_HBA_PORT_CMD_ST;
|
||||
dev->hba->ports[dev->port].command_issue = 0;
|
||||
dev->command_list[0].config = 0;
|
||||
dev->command_table[0].prdt[0].unused = 0;
|
||||
dev->command_table[0].prdt[0].size = 0;
|
||||
dev->command_table[0].prdt[0].data_base = 0;
|
||||
|
||||
endtime = grub_get_time_ms () + 1000;
|
||||
while ((dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_PORT_CMD_CR))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
@@ -909,7 +932,10 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
|
||||
if (parms->size > GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH)
|
||||
return grub_error (GRUB_ERR_BUG, "too big data buffer");
|
||||
|
||||
bufc = grub_memalign_dma32 (1024, parms->size + (parms->size & 1));
|
||||
if (parms->size)
|
||||
bufc = grub_memalign_dma32 (1024, parms->size + (parms->size & 1));
|
||||
else
|
||||
bufc = grub_memalign_dma32 (1024, 512);
|
||||
|
||||
grub_dprintf ("ahci", "AHCI tfd = %x, CL=%p\n",
|
||||
dev->hba->ports[dev->port].task_file_data,
|
||||
@@ -919,7 +945,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
|
||||
= (5 << GRUB_AHCI_CONFIG_CFIS_LENGTH_SHIFT)
|
||||
// | GRUB_AHCI_CONFIG_CLEAR_R_OK
|
||||
| (0 << GRUB_AHCI_CONFIG_PMP_SHIFT)
|
||||
| (1 << GRUB_AHCI_CONFIG_PRDT_LENGTH_SHIFT)
|
||||
| ((parms->size ? 1 : 0) << GRUB_AHCI_CONFIG_PRDT_LENGTH_SHIFT)
|
||||
| (parms->cmdsize ? GRUB_AHCI_CONFIG_ATAPI : 0)
|
||||
| (parms->write ? GRUB_AHCI_CONFIG_WRITE : GRUB_AHCI_CONFIG_READ)
|
||||
| (parms->taskfile.cmd == 8 ? (1 << 8) : 0);
|
||||
@@ -996,7 +1022,7 @@ grub_ahci_readwrite_real (struct grub_ahci_device *dev,
|
||||
grub_dprintf ("ahci", "AHCI tfd = %x\n",
|
||||
dev->hba->ports[dev->port].task_file_data);
|
||||
|
||||
endtime = grub_get_time_ms () + (spinup ? 10000 : 5000);
|
||||
endtime = grub_get_time_ms () + (spinup ? 20000 : 20000);
|
||||
while ((dev->hba->ports[dev->port].command_issue & 1))
|
||||
if (grub_get_time_ms () > endtime)
|
||||
{
|
||||
@@ -1075,6 +1101,7 @@ grub_ahci_open (int id, int devnum, struct grub_ata *ata)
|
||||
|
||||
ata->data = dev;
|
||||
ata->dma = 1;
|
||||
ata->atapi = dev->atapi;
|
||||
ata->maxbuffer = GRUB_AHCI_PRDT_MAX_CHUNK_LENGTH;
|
||||
ata->present = &dev->present;
|
||||
|
||||
|
||||
+19
-9
@@ -108,6 +108,9 @@ grub_ata_identify (struct grub_ata *dev)
|
||||
grub_uint16_t *info16;
|
||||
grub_err_t err;
|
||||
|
||||
if (dev->atapi)
|
||||
return grub_atapi_identify (dev);
|
||||
|
||||
info64 = grub_malloc (GRUB_DISK_SECTOR_SIZE);
|
||||
info32 = (grub_uint32_t *) info64;
|
||||
info16 = (grub_uint16_t *) info64;
|
||||
@@ -129,7 +132,7 @@ grub_ata_identify (struct grub_ata *dev)
|
||||
grub_free (info16);
|
||||
grub_errno = GRUB_ERR_NONE;
|
||||
if ((sts & (GRUB_ATA_STATUS_BUSY | GRUB_ATA_STATUS_DRQ
|
||||
| GRUB_ATA_STATUS_ERR)) == GRUB_ATA_STATUS_ERR
|
||||
| GRUB_ATA_STATUS_ERR)) == GRUB_ATA_STATUS_ERR
|
||||
&& (parms.taskfile.error & 0x04 /* ABRT */))
|
||||
/* Device without ATA IDENTIFY, try ATAPI. */
|
||||
return grub_atapi_identify (dev);
|
||||
@@ -213,6 +216,12 @@ grub_ata_setaddress (struct grub_ata *dev,
|
||||
unsigned int head;
|
||||
unsigned int sect;
|
||||
|
||||
if (dev->sectors_per_track == 0
|
||||
|| dev->heads == 0)
|
||||
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||
"sector %d cannot be addressed "
|
||||
"using CHS addressing", sector);
|
||||
|
||||
/* Calculate the sector, cylinder and head to use. */
|
||||
sect = ((grub_uint32_t) sector % dev->sectors_per_track) + 1;
|
||||
cylinder = (((grub_uint32_t) sector / dev->sectors_per_track)
|
||||
@@ -285,7 +294,6 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
|
||||
if (addressing == GRUB_ATA_LBA48 && ((sector + size) >> 28) != 0)
|
||||
{
|
||||
batch = 65536;
|
||||
if (ata->dma)
|
||||
{
|
||||
cmd = GRUB_ATA_CMD_READ_SECTORS_DMA_EXT;
|
||||
@@ -301,10 +309,6 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
{
|
||||
if (addressing == GRUB_ATA_LBA48)
|
||||
addressing = GRUB_ATA_LBA;
|
||||
if (addressing != GRUB_ATA_CHS)
|
||||
batch = 256;
|
||||
else
|
||||
batch = 1;
|
||||
if (ata->dma)
|
||||
{
|
||||
cmd = GRUB_ATA_CMD_READ_SECTORS_DMA;
|
||||
@@ -317,8 +321,10 @@ grub_ata_readwrite (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
}
|
||||
}
|
||||
|
||||
if (batch > (ata->maxbuffer >> ata->log_sector_size))
|
||||
batch = (ata->maxbuffer >> ata->log_sector_size);
|
||||
if (addressing != GRUB_ATA_CHS)
|
||||
batch = 256;
|
||||
else
|
||||
batch = 1;
|
||||
|
||||
while (nsectors < size)
|
||||
{
|
||||
@@ -366,7 +372,7 @@ grub_ata_real_open (int id, int bus)
|
||||
struct grub_ata *ata;
|
||||
grub_ata_dev_t p;
|
||||
|
||||
ata = grub_malloc (sizeof (*ata));
|
||||
ata = grub_zalloc (sizeof (*ata));
|
||||
if (!ata)
|
||||
return NULL;
|
||||
for (p = grub_ata_dev_list; p; p = p->next)
|
||||
@@ -464,6 +470,10 @@ grub_ata_open (const char *name, grub_disk_t disk)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not an ATA harddisk");
|
||||
|
||||
disk->total_sectors = ata->size;
|
||||
disk->max_agglomerate = (ata->maxbuffer >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS));
|
||||
if (disk->max_agglomerate > (256U >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS - ata->log_sector_size)))
|
||||
disk->max_agglomerate = (256U >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS - ata->log_sector_size));
|
||||
|
||||
disk->log_sector_size = ata->log_sector_size;
|
||||
|
||||
disk->id = grub_make_scsi_id (id, bus, 0);
|
||||
|
||||
+47
-24
@@ -51,7 +51,7 @@ static inline int GF_PER_SECTOR (const struct grub_cryptodisk *dev)
|
||||
}
|
||||
|
||||
static grub_cryptodisk_t cryptodisk_list = NULL;
|
||||
static grub_uint8_t n = 0;
|
||||
static grub_uint8_t last_cryptodisk_id = 0;
|
||||
|
||||
static void
|
||||
gf_mul_x (grub_uint8_t *g)
|
||||
@@ -109,7 +109,9 @@ grub_crypto_pcbc_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||
void *iv)
|
||||
{
|
||||
grub_uint8_t *inptr, *outptr, *end;
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
@@ -132,7 +134,9 @@ grub_crypto_pcbc_encrypt (grub_crypto_cipher_handle_t cipher,
|
||||
void *iv)
|
||||
{
|
||||
grub_uint8_t *inptr, *outptr, *end;
|
||||
grub_uint8_t ivt[cipher->cipher->blocksize];
|
||||
grub_uint8_t ivt[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
if (cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
if (!cipher->cipher->decrypt)
|
||||
return GPG_ERR_NOT_SUPPORTED;
|
||||
if (size % cipher->cipher->blocksize != 0)
|
||||
@@ -218,6 +222,9 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
grub_size_t i;
|
||||
gcry_err_code_t err;
|
||||
|
||||
if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
/* The only mode without IV. */
|
||||
if (dev->mode == GRUB_CRYPTODISK_MODE_ECB && !dev->rekey)
|
||||
return (do_encrypt ? grub_crypto_ecb_encrypt (dev->cipher, data, data, len)
|
||||
@@ -228,7 +235,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
grub_size_t sz = ((dev->cipher->cipher->blocksize
|
||||
+ sizeof (grub_uint32_t) - 1)
|
||||
/ sizeof (grub_uint32_t));
|
||||
grub_uint32_t iv[sz];
|
||||
grub_uint32_t iv[(GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE + 3) / 4];
|
||||
|
||||
if (dev->rekey)
|
||||
{
|
||||
@@ -242,7 +249,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
}
|
||||
}
|
||||
|
||||
grub_memset (iv, 0, sz * sizeof (iv[0]));
|
||||
grub_memset (iv, 0, sizeof (iv));
|
||||
switch (dev->mode_iv)
|
||||
{
|
||||
case GRUB_CRYPTODISK_MODE_IV_NULL:
|
||||
@@ -250,9 +257,11 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64_HASH:
|
||||
{
|
||||
grub_uint64_t tmp;
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (ctx, dev->iv_hash->contextsize);
|
||||
void *ctx;
|
||||
|
||||
grub_memset (ctx, 0, sizeof (ctx));
|
||||
ctx = grub_zalloc (dev->iv_hash->contextsize);
|
||||
if (!ctx)
|
||||
return GPG_ERR_OUT_OF_MEMORY;
|
||||
|
||||
tmp = grub_cpu_to_le64 (sector << dev->log_sector_size);
|
||||
dev->iv_hash->init (ctx);
|
||||
@@ -261,6 +270,7 @@ grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev,
|
||||
dev->iv_hash->final (ctx);
|
||||
|
||||
grub_memcpy (iv, dev->iv_hash->read (ctx), sizeof (iv));
|
||||
grub_free (ctx);
|
||||
}
|
||||
break;
|
||||
case GRUB_CRYPTODISK_MODE_IV_PLAIN64:
|
||||
@@ -407,7 +417,9 @@ grub_cryptodisk_setkey (grub_cryptodisk_t dev, grub_uint8_t *key, grub_size_t ke
|
||||
if (dev->mode_iv == GRUB_CRYPTODISK_MODE_IV_ESSIV)
|
||||
{
|
||||
grub_size_t essiv_keysize = dev->essiv_hash->mdlen;
|
||||
grub_uint8_t hashed_key[essiv_keysize];
|
||||
grub_uint8_t hashed_key[GRUB_CRYPTO_MAX_MDLEN];
|
||||
if (essiv_keysize > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
grub_crypto_hash (dev->essiv_hash, hashed_key, key, keysize);
|
||||
err = grub_crypto_cipher_set_key (dev->essiv_cipher,
|
||||
@@ -517,6 +529,7 @@ grub_cryptodisk_open (const char *name, grub_disk_t disk)
|
||||
|
||||
disk->data = dev;
|
||||
disk->total_sectors = dev->total_length;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
disk->id = dev->id;
|
||||
dev->ref++;
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -631,10 +644,16 @@ grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
}
|
||||
|
||||
err = grub_disk_write (dev->source_disk,
|
||||
(sector << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS)) + dev->offset,
|
||||
0, size << disk->log_sector_size, tmp);
|
||||
/* Since ->write was called so disk.mod is loaded but be paranoid */
|
||||
|
||||
if (grub_disk_write_weak)
|
||||
err = grub_disk_write_weak (dev->source_disk,
|
||||
(sector << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))
|
||||
+ dev->offset,
|
||||
0, size << disk->log_sector_size, tmp);
|
||||
else
|
||||
err = grub_error (GRUB_ERR_BUG, "disk.mod not loaded");
|
||||
grub_free (tmp);
|
||||
return err;
|
||||
}
|
||||
@@ -688,7 +707,7 @@ grub_cryptodisk_insert (grub_cryptodisk_t newdev, const char *name,
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
newdev->id = n++;
|
||||
newdev->id = last_cryptodisk_id++;
|
||||
newdev->source_id = source->id;
|
||||
newdev->source_dev_id = source->dev->id;
|
||||
newdev->next = cryptodisk_list;
|
||||
@@ -734,7 +753,7 @@ grub_cryptodisk_cheat_insert (grub_cryptodisk_t newdev, const char *name,
|
||||
newdev->cheat_fd = GRUB_UTIL_FD_INVALID;
|
||||
newdev->source_id = source->id;
|
||||
newdev->source_dev_id = source->dev->id;
|
||||
newdev->id = n++;
|
||||
newdev->id = last_cryptodisk_id++;
|
||||
newdev->next = cryptodisk_list;
|
||||
cryptodisk_list = newdev;
|
||||
|
||||
@@ -743,25 +762,26 @@ grub_cryptodisk_cheat_insert (grub_cryptodisk_t newdev, const char *name,
|
||||
|
||||
void
|
||||
grub_util_cryptodisk_get_abstraction (grub_disk_t disk,
|
||||
void (*cb) (const char *val))
|
||||
void (*cb) (const char *val, void *data),
|
||||
void *data)
|
||||
{
|
||||
grub_cryptodisk_t dev = (grub_cryptodisk_t) disk->data;
|
||||
|
||||
cb ("cryptodisk");
|
||||
cb (dev->modname);
|
||||
cb ("cryptodisk", data);
|
||||
cb (dev->modname, data);
|
||||
|
||||
if (dev->cipher)
|
||||
cb (dev->cipher->cipher->modname);
|
||||
cb (dev->cipher->cipher->modname, data);
|
||||
if (dev->secondary_cipher)
|
||||
cb (dev->secondary_cipher->cipher->modname);
|
||||
cb (dev->secondary_cipher->cipher->modname, data);
|
||||
if (dev->essiv_cipher)
|
||||
cb (dev->essiv_cipher->cipher->modname);
|
||||
cb (dev->essiv_cipher->cipher->modname, data);
|
||||
if (dev->hash)
|
||||
cb (dev->hash->modname);
|
||||
cb (dev->hash->modname, data);
|
||||
if (dev->essiv_hash)
|
||||
cb (dev->essiv_hash->modname);
|
||||
cb (dev->essiv_hash->modname, data);
|
||||
if (dev->iv_hash)
|
||||
cb (dev->iv_hash->modname);
|
||||
cb (dev->iv_hash->modname, data);
|
||||
}
|
||||
|
||||
const char *
|
||||
@@ -992,12 +1012,14 @@ hex (grub_uint8_t val)
|
||||
|
||||
/* Open a file named NAME and initialize FILE. */
|
||||
static char *
|
||||
luks_script_get (void)
|
||||
luks_script_get (grub_size_t *sz)
|
||||
{
|
||||
grub_cryptodisk_t i;
|
||||
grub_size_t size = 0;
|
||||
char *ptr, *ret;
|
||||
|
||||
*sz = 0;
|
||||
|
||||
for (i = cryptodisk_list; i != NULL; i = i->next)
|
||||
if (grub_strcmp (i->modname, "luks") == 0)
|
||||
{
|
||||
@@ -1079,6 +1101,7 @@ luks_script_get (void)
|
||||
*ptr++ = '\n';
|
||||
}
|
||||
*ptr = '\0';
|
||||
*sz = ptr - ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
+125
-9
@@ -354,7 +354,8 @@ grub_diskfilter_memberlist (grub_disk_t disk)
|
||||
|
||||
void
|
||||
grub_diskfilter_get_partmap (grub_disk_t disk,
|
||||
void (*cb) (const char *pm))
|
||||
void (*cb) (const char *pm, void *data),
|
||||
void *data)
|
||||
{
|
||||
struct grub_diskfilter_lv *lv = disk->data;
|
||||
struct grub_diskfilter_pv *pv;
|
||||
@@ -376,7 +377,7 @@ grub_diskfilter_get_partmap (grub_disk_t disk,
|
||||
continue;
|
||||
}
|
||||
for (s = 0; pv->partmaps[s]; s++)
|
||||
cb (pv->partmaps[s]);
|
||||
cb (pv->partmaps[s], data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,6 +446,7 @@ grub_diskfilter_open (const char *name, grub_disk_t disk)
|
||||
disk->data = lv;
|
||||
|
||||
disk->total_sectors = lv->size;
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -481,6 +483,96 @@ grub_diskfilter_read_node (const struct grub_diskfilter_node *node,
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown node '%s'", node->name);
|
||||
}
|
||||
|
||||
|
||||
static grub_err_t
|
||||
validate_segment (struct grub_diskfilter_segment *seg);
|
||||
|
||||
static grub_err_t
|
||||
validate_lv (struct grub_diskfilter_lv *lv)
|
||||
{
|
||||
unsigned int i;
|
||||
if (!lv)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown volume");
|
||||
|
||||
if (lv->vg->extent_size == 0)
|
||||
return grub_error (GRUB_ERR_READ_ERROR, "invalid volume");
|
||||
|
||||
for (i = 0; i < lv->segment_count; i++)
|
||||
{
|
||||
grub_err_t err;
|
||||
err = validate_segment (&lv->segments[1]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
static grub_err_t
|
||||
validate_node (const struct grub_diskfilter_node *node)
|
||||
{
|
||||
/* Check whether we actually know the physical volume we want to
|
||||
read from. */
|
||||
if (node->pv)
|
||||
return GRUB_ERR_NONE;
|
||||
if (node->lv)
|
||||
return validate_lv (node->lv);
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "unknown node '%s'", node->name);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
validate_segment (struct grub_diskfilter_segment *seg)
|
||||
{
|
||||
grub_err_t err;
|
||||
|
||||
if (seg->stripe_size == 0 || seg->node_count == 0)
|
||||
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
|
||||
|
||||
switch (seg->type)
|
||||
{
|
||||
case GRUB_DISKFILTER_RAID10:
|
||||
{
|
||||
grub_uint8_t near, far;
|
||||
near = seg->layout & 0xFF;
|
||||
far = (seg->layout >> 8) & 0xFF;
|
||||
if ((seg->layout >> 16) == 0 && far == 0)
|
||||
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
|
||||
if (near > seg->node_count)
|
||||
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
|
||||
break;
|
||||
}
|
||||
|
||||
case GRUB_DISKFILTER_STRIPED:
|
||||
case GRUB_DISKFILTER_MIRROR:
|
||||
break;
|
||||
|
||||
case GRUB_DISKFILTER_RAID4:
|
||||
case GRUB_DISKFILTER_RAID5:
|
||||
if (seg->node_count <= 1)
|
||||
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
|
||||
break;
|
||||
|
||||
case GRUB_DISKFILTER_RAID6:
|
||||
if (seg->node_count <= 2)
|
||||
return grub_error(GRUB_ERR_BAD_FS, "invalid segment");
|
||||
break;
|
||||
|
||||
default:
|
||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"unsupported RAID level %d", seg->type);
|
||||
}
|
||||
|
||||
unsigned i;
|
||||
for (i = 0; i < seg->node_count; i++)
|
||||
{
|
||||
err = validate_node (&seg->nodes[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
read_segment (struct grub_diskfilter_segment *seg, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf)
|
||||
@@ -846,6 +938,32 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
|
||||
|
||||
for (lv = vg->lvs; lv; lv = lv->next)
|
||||
{
|
||||
/* RAID 1 and single-disk RAID 0 don't use a chunksize but code assumes one so set
|
||||
one. */
|
||||
for (i = 0; i < lv->segment_count; i++)
|
||||
{
|
||||
if (lv->segments[i].type == 1)
|
||||
lv->segments[i].stripe_size = 64;
|
||||
if (lv->segments[i].type == GRUB_DISKFILTER_STRIPED
|
||||
&& lv->segments[i].node_count == 1
|
||||
&& lv->segments[i].stripe_size == 0)
|
||||
lv->segments[i].stripe_size = 64;
|
||||
}
|
||||
}
|
||||
|
||||
for (lv = vg->lvs; lv; lv = lv->next)
|
||||
{
|
||||
grub_err_t err;
|
||||
|
||||
/* RAID 1 doesn't use a chunksize but code assumes one so set
|
||||
one. */
|
||||
for (i = 0; i < lv->segment_count; i++)
|
||||
if (lv->segments[i].type == 1)
|
||||
lv->segments[i].stripe_size = 64;
|
||||
|
||||
err = validate_lv(lv);
|
||||
if (err)
|
||||
return err;
|
||||
lv->number = lv_num++;
|
||||
|
||||
if (lv->fullname)
|
||||
@@ -886,11 +1004,6 @@ grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg)
|
||||
lv->fullname = tmp;
|
||||
}
|
||||
}
|
||||
/* RAID 1 doesn't use a chunksize but code assumes one so set
|
||||
one. */
|
||||
for (i = 0; i < lv->segment_count; i++)
|
||||
if (lv->segments[i].type == 1)
|
||||
lv->segments[i].stripe_size = 64;
|
||||
lv->vg = vg;
|
||||
}
|
||||
/* Add our new array to the list. */
|
||||
@@ -924,6 +1037,8 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
|
||||
n = layout & 0xFF;
|
||||
if (n == 1)
|
||||
n = (layout >> 8) & 0xFF;
|
||||
if (n == 0)
|
||||
return NULL;
|
||||
|
||||
totsize = grub_divmod64 (nmemb * disk_size, n, 0);
|
||||
}
|
||||
@@ -933,7 +1048,7 @@ grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
totsize = (nmemb - level / 3) * disk_size;
|
||||
totsize = (nmemb - ((unsigned) level / 3U)) * disk_size;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1056,7 +1171,8 @@ insert_array (grub_disk_t disk, const struct grub_diskfilter_pv_id *id,
|
||||
(unsigned long long) grub_disk_get_size (disk),
|
||||
array->name, diskfilter->name);
|
||||
#ifdef GRUB_UTIL
|
||||
grub_util_info ("Inserting %s (+%lld,%lld) into %s (%s)\n", disk->name,
|
||||
grub_util_info ("Inserting %s (+%" GRUB_HOST_PRIuLONG_LONG ",%"
|
||||
GRUB_HOST_PRIuLONG_LONG ") into %s (%s)\n", disk->name,
|
||||
(unsigned long long) grub_partition_get_start (disk->partition),
|
||||
(unsigned long long) grub_disk_get_size (disk),
|
||||
array->name, diskfilter->name);
|
||||
|
||||
@@ -88,7 +88,7 @@ struct grub_nv_super
|
||||
char prodrev[NV_PRODREV_LEN]; /* 0x2C - 0x2F Array product revision */
|
||||
grub_uint32_t unit_flags; /* 0x30 - 0x33 Flags for this disk */
|
||||
struct grub_nv_array array; /* Array information */
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
static struct grub_diskfilter_vg *
|
||||
grub_dmraid_nv_detect (grub_disk_t disk,
|
||||
@@ -129,6 +129,9 @@ grub_dmraid_nv_detect (grub_disk_t disk,
|
||||
case NV_LEVEL_0:
|
||||
level = 0;
|
||||
disk_size = sb.capacity / sb.array.total_volumes;
|
||||
if (sb.array.total_volumes == 0)
|
||||
/* Not RAID. */
|
||||
return NULL;
|
||||
break;
|
||||
|
||||
case NV_LEVEL_1:
|
||||
@@ -139,6 +142,9 @@ grub_dmraid_nv_detect (grub_disk_t disk,
|
||||
case NV_LEVEL_5:
|
||||
level = 5;
|
||||
disk_size = sb.capacity / (sb.array.total_volumes - 1);
|
||||
if (sb.array.total_volumes == 0 || sb.array.total_volumes == 1)
|
||||
/* Not RAID. */
|
||||
return NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -157,8 +157,7 @@ find_parent_device (struct grub_efidisk_data *devices,
|
||||
ldp = find_last_device_path (dp);
|
||||
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||
ldp->length[0] = sizeof (*ldp);
|
||||
ldp->length[1] = 0;
|
||||
ldp->length = sizeof (*ldp);
|
||||
|
||||
for (parent = devices; parent; parent = parent->next)
|
||||
{
|
||||
@@ -188,8 +187,7 @@ is_child (struct grub_efidisk_data *child,
|
||||
ldp = find_last_device_path (dp);
|
||||
ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||
ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||
ldp->length[0] = sizeof (*ldp);
|
||||
ldp->length[1] = 0;
|
||||
ldp->length = sizeof (*ldp);
|
||||
|
||||
ret = (grub_efi_compare_device_paths (dp, parent->device_path) == 0);
|
||||
grub_free (dp);
|
||||
@@ -335,6 +333,21 @@ name_devices (struct grub_efidisk_data *devices)
|
||||
if (! dp)
|
||||
continue;
|
||||
|
||||
/* Ghosts proudly presented by Apple. */
|
||||
if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
|
||||
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (dp)
|
||||
== GRUB_EFI_VENDOR_MEDIA_DEVICE_PATH_SUBTYPE)
|
||||
{
|
||||
grub_efi_vendor_device_path_t *vendor = (grub_efi_vendor_device_path_t *) dp;
|
||||
const struct grub_efi_guid apple = GRUB_EFI_VENDOR_APPLE_GUID;
|
||||
|
||||
if (vendor->header.length == sizeof (*vendor)
|
||||
&& grub_memcmp (&vendor->vendor_guid, &apple,
|
||||
sizeof (vendor->vendor_guid)) == 0
|
||||
&& find_parent_device (devices, d))
|
||||
continue;
|
||||
}
|
||||
|
||||
m = d->block_io->media;
|
||||
if (GRUB_EFI_DEVICE_PATH_TYPE (dp) == GRUB_EFI_ACPI_DEVICE_PATH_TYPE
|
||||
&& GRUB_EFI_DEVICE_PATH_SUBTYPE (dp)
|
||||
@@ -518,6 +531,8 @@ grub_efidisk_open (const char *name, struct grub_disk *disk)
|
||||
grub_dprintf ("efidisk", "m = %p, last block = %llx, block size = %x\n",
|
||||
m, (unsigned long long) m->last_block, m->block_size);
|
||||
disk->total_sectors = m->last_block + 1;
|
||||
/* Don't increase this value due to bug in some EFI. */
|
||||
disk->max_agglomerate = 0xa0000 >> (GRUB_DISK_CACHE_BITS + GRUB_DISK_SECTOR_BITS);
|
||||
if (m->block_size & (m->block_size - 1) || !m->block_size)
|
||||
return grub_error (GRUB_ERR_IO, "invalid sector size %d",
|
||||
m->block_size);
|
||||
@@ -542,32 +557,17 @@ static grub_efi_status_t
|
||||
grub_efidisk_readwrite (struct grub_disk *disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf, int wr)
|
||||
{
|
||||
/* For now, use the disk io interface rather than the block io's. */
|
||||
struct grub_efidisk_data *d;
|
||||
grub_efi_block_io_t *bio;
|
||||
grub_efi_status_t status;
|
||||
|
||||
d = disk->data;
|
||||
bio = d->block_io;
|
||||
|
||||
while (size > 0)
|
||||
{
|
||||
grub_size_t len;
|
||||
len = 0x500;
|
||||
if (len > size)
|
||||
len = size;
|
||||
status = efi_call_5 ((wr ? bio->write_blocks : bio->read_blocks), bio,
|
||||
bio->media->media_id,
|
||||
(grub_efi_uint64_t) sector,
|
||||
(grub_efi_uintn_t) len << disk->log_sector_size,
|
||||
buf);
|
||||
size -= len;
|
||||
buf += len << disk->log_sector_size;
|
||||
sector += len;
|
||||
if (status != GRUB_EFI_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
return GRUB_EFI_SUCCESS;
|
||||
return efi_call_5 ((wr ? bio->write_blocks : bio->read_blocks), bio,
|
||||
bio->media->media_id,
|
||||
(grub_efi_uint64_t) sector,
|
||||
(grub_efi_uintn_t) size << disk->log_sector_size,
|
||||
buf);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
@@ -681,20 +681,20 @@ grub_efidisk_get_device_handle (grub_disk_t disk)
|
||||
devices = make_devices ();
|
||||
FOR_CHILDREN (c, devices)
|
||||
{
|
||||
grub_efi_hard_drive_device_path_t hd;
|
||||
grub_efi_hard_drive_device_path_t *hd;
|
||||
|
||||
grub_memcpy (&hd, c->last_device_path, sizeof (hd));
|
||||
hd = (grub_efi_hard_drive_device_path_t *) c->last_device_path;
|
||||
|
||||
if ((GRUB_EFI_DEVICE_PATH_TYPE (c->last_device_path)
|
||||
== GRUB_EFI_MEDIA_DEVICE_PATH_TYPE)
|
||||
&& (GRUB_EFI_DEVICE_PATH_SUBTYPE (c->last_device_path)
|
||||
== GRUB_EFI_HARD_DRIVE_DEVICE_PATH_SUBTYPE)
|
||||
&& (grub_partition_get_start (disk->partition)
|
||||
== (hd.partition_start << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS)))
|
||||
== (hd->partition_start << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS)))
|
||||
&& (grub_partition_get_len (disk->partition)
|
||||
== (hd.partition_size << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))))
|
||||
== (hd->partition_size << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))))
|
||||
{
|
||||
handle = c->handle;
|
||||
break;
|
||||
@@ -760,7 +760,7 @@ get_diskname_from_path (const grub_efi_device_path_t *path,
|
||||
struct grub_efidisk_get_device_name_ctx
|
||||
{
|
||||
char *partition_name;
|
||||
grub_efi_hard_drive_device_path_t hd;
|
||||
grub_efi_hard_drive_device_path_t *hd;
|
||||
};
|
||||
|
||||
/* Helper for grub_efidisk_get_device_name.
|
||||
@@ -772,11 +772,11 @@ grub_efidisk_get_device_name_iter (grub_disk_t disk,
|
||||
struct grub_efidisk_get_device_name_ctx *ctx = data;
|
||||
|
||||
if (grub_partition_get_start (part)
|
||||
== (ctx->hd.partition_start << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))
|
||||
== (ctx->hd->partition_start << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))
|
||||
&& grub_partition_get_len (part)
|
||||
== (ctx->hd.partition_size << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS)))
|
||||
== (ctx->hd->partition_size << (disk->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS)))
|
||||
{
|
||||
ctx->partition_name = grub_partition_get_name (part);
|
||||
return 1;
|
||||
@@ -829,8 +829,7 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
|
||||
|
||||
dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
|
||||
dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
|
||||
dup_ldp->length[0] = sizeof (*dup_ldp);
|
||||
dup_ldp->length[1] = 0;
|
||||
dup_ldp->length = sizeof (*dup_ldp);
|
||||
}
|
||||
|
||||
if (!get_diskname_from_path (dup_dp, device_name))
|
||||
@@ -847,10 +846,10 @@ grub_efidisk_get_device_name (grub_efi_handle_t *handle)
|
||||
|
||||
/* Find a partition which matches the hard drive device path. */
|
||||
ctx.partition_name = NULL;
|
||||
grub_memcpy (&ctx.hd, ldp, sizeof (ctx.hd));
|
||||
if (ctx.hd.partition_start == 0
|
||||
&& (ctx.hd.partition_size << (parent->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))
|
||||
ctx.hd = (grub_efi_hard_drive_device_path_t *) ldp;
|
||||
if (ctx.hd->partition_start == 0
|
||||
&& (ctx.hd->partition_size << (parent->log_sector_size
|
||||
- GRUB_DISK_SECTOR_BITS))
|
||||
== grub_disk_get_size (parent))
|
||||
{
|
||||
dev_name = grub_strdup (parent->name);
|
||||
|
||||
+62
-36
@@ -95,7 +95,7 @@ struct grub_geli_key
|
||||
grub_uint8_t iv_key[64];
|
||||
grub_uint8_t cipher_key[64];
|
||||
grub_uint8_t hmac[64];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
struct grub_geli_phdr
|
||||
{
|
||||
@@ -111,7 +111,7 @@ struct grub_geli_phdr
|
||||
grub_uint32_t niter;
|
||||
grub_uint8_t salt[64];
|
||||
struct grub_geli_key keys[2];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
enum
|
||||
{
|
||||
@@ -144,42 +144,35 @@ geli_rekey (struct grub_cryptodisk *dev, grub_uint64_t zoneno)
|
||||
const struct {
|
||||
char magic[4];
|
||||
grub_uint64_t zone;
|
||||
} __attribute__ ((packed)) tohash
|
||||
} GRUB_PACKED tohash
|
||||
= { {'e', 'k', 'e', 'y'}, grub_cpu_to_le64 (zoneno) };
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (key, dev->hash->mdlen);
|
||||
GRUB_PROPERLY_ALIGNED_ARRAY (key, GRUB_CRYPTO_MAX_MDLEN);
|
||||
|
||||
if (dev->hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return GPG_ERR_INV_ARG;
|
||||
|
||||
grub_dprintf ("geli", "rekeying %" PRIuGRUB_UINT64_T " keysize=%d\n",
|
||||
zoneno, dev->rekey_derived_size);
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, dev->rekey_key, 64,
|
||||
&tohash, sizeof (tohash), key);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
return gcry_err;
|
||||
|
||||
return grub_cryptodisk_setkey (dev, (grub_uint8_t *) key,
|
||||
dev->rekey_derived_size);
|
||||
}
|
||||
|
||||
static inline int
|
||||
ascii2hex (char c)
|
||||
{
|
||||
if (c >= '0' && c <= '9')
|
||||
return c - '0';
|
||||
if (c >= 'a' && c <= 'f')
|
||||
return c - 'a' + 10;
|
||||
if (c >= 'A' && c <= 'F')
|
||||
return c - 'A' + 10;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline gcry_err_code_t
|
||||
make_uuid (const struct grub_geli_phdr *header,
|
||||
char *uuid)
|
||||
{
|
||||
grub_uint8_t uuidbin[GRUB_MD_SHA256->mdlen];
|
||||
grub_uint8_t uuidbin[GRUB_CRYPTODISK_MAX_UUID_LENGTH];
|
||||
gcry_err_code_t err;
|
||||
grub_uint8_t *iptr;
|
||||
char *optr;
|
||||
|
||||
if (2 * GRUB_MD_SHA256->mdlen + 1 > GRUB_CRYPTODISK_MAX_UUID_LENGTH)
|
||||
return GPG_ERR_TOO_LARGE;
|
||||
err = grub_crypto_hmac_buffer (GRUB_MD_SHA256,
|
||||
header->salt, sizeof (header->salt),
|
||||
"uuid", sizeof ("uuid") - 1, uuidbin);
|
||||
@@ -187,7 +180,7 @@ make_uuid (const struct grub_geli_phdr *header,
|
||||
return err;
|
||||
|
||||
optr = uuid;
|
||||
for (iptr = uuidbin; iptr < &uuidbin[ARRAY_SIZE (uuidbin)]; iptr++)
|
||||
for (iptr = uuidbin; iptr < &uuidbin[GRUB_MD_SHA256->mdlen]; iptr++)
|
||||
{
|
||||
grub_snprintf (optr, 3, "%02x", *iptr);
|
||||
optr += 2;
|
||||
@@ -232,7 +225,7 @@ grub_util_get_geli_uuid (const char *dev)
|
||||
|
||||
/* Look for GELI magic sequence. */
|
||||
if (grub_memcmp (header->magic, GELI_MAGIC, sizeof (GELI_MAGIC))
|
||||
|| grub_le_to_cpu32 (header->version) > 5
|
||||
|| grub_le_to_cpu32 (header->version) > 7
|
||||
|| grub_le_to_cpu32 (header->version) < 1)
|
||||
grub_util_error ("%s", _("wrong ELI magic or version"));
|
||||
|
||||
@@ -254,10 +247,13 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
const struct gcry_cipher_spec *ciph;
|
||||
const char *ciphername = NULL;
|
||||
gcry_err_code_t gcry_err;
|
||||
char uuid[GRUB_MD_SHA256->mdlen * 2 + 1];
|
||||
char uuid[GRUB_CRYPTODISK_MAX_UUID_LENGTH];
|
||||
grub_disk_addr_t sector;
|
||||
grub_err_t err;
|
||||
|
||||
if (2 * GRUB_MD_SHA256->mdlen + 1 > GRUB_CRYPTODISK_MAX_UUID_LENGTH)
|
||||
return NULL;
|
||||
|
||||
sector = grub_disk_get_size (disk);
|
||||
if (sector == GRUB_DISK_SIZE_UNKNOWN || sector == 0)
|
||||
return NULL;
|
||||
@@ -269,7 +265,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
|
||||
/* Look for GELI magic sequence. */
|
||||
if (grub_memcmp (header.magic, GELI_MAGIC, sizeof (GELI_MAGIC))
|
||||
|| grub_le_to_cpu32 (header.version) > 5
|
||||
|| grub_le_to_cpu32 (header.version) > 7
|
||||
|| grub_le_to_cpu32 (header.version) < 1)
|
||||
{
|
||||
grub_dprintf ("geli", "wrong magic %02x\n", header.magic[0]);
|
||||
@@ -336,19 +332,29 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
{
|
||||
secondary_cipher = grub_crypto_cipher_open (ciph);
|
||||
if (!secondary_cipher)
|
||||
return NULL;
|
||||
{
|
||||
grub_crypto_cipher_close (cipher);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (grub_le_to_cpu16 (header.keylen) > 1024)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d",
|
||||
grub_le_to_cpu16 (header.keylen));
|
||||
grub_crypto_cipher_close (cipher);
|
||||
grub_crypto_cipher_close (secondary_cipher);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
newdev = grub_zalloc (sizeof (struct grub_cryptodisk));
|
||||
if (!newdev)
|
||||
return NULL;
|
||||
{
|
||||
grub_crypto_cipher_close (cipher);
|
||||
grub_crypto_cipher_close (secondary_cipher);
|
||||
return NULL;
|
||||
}
|
||||
newdev->cipher = cipher;
|
||||
newdev->secondary_cipher = secondary_cipher;
|
||||
newdev->offset = 0;
|
||||
@@ -391,10 +397,11 @@ static grub_err_t
|
||||
recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
{
|
||||
grub_size_t keysize;
|
||||
grub_uint8_t digest[dev->hash->mdlen];
|
||||
grub_uint8_t geomkey[dev->hash->mdlen];
|
||||
grub_uint8_t verify_key[dev->hash->mdlen];
|
||||
grub_uint8_t zero[dev->cipher->cipher->blocksize];
|
||||
grub_uint8_t digest[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t geomkey[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t verify_key[GRUB_CRYPTO_MAX_MDLEN];
|
||||
grub_uint8_t zero[GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE];
|
||||
grub_uint8_t geli_cipher_key[64];
|
||||
char passphrase[MAX_PASSPHRASE] = "";
|
||||
unsigned i;
|
||||
gcry_err_code_t gcry_err;
|
||||
@@ -403,6 +410,12 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
grub_disk_addr_t sector;
|
||||
grub_err_t err;
|
||||
|
||||
if (dev->cipher->cipher->blocksize > GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE)
|
||||
return grub_error (GRUB_ERR_BUG, "cipher block is too long");
|
||||
|
||||
if (dev->hash->mdlen > GRUB_CRYPTO_MAX_MDLEN)
|
||||
return grub_error (GRUB_ERR_BUG, "mdlen is too long");
|
||||
|
||||
sector = grub_disk_get_size (source);
|
||||
if (sector == GRUB_DISK_SIZE_UNKNOWN || sector == 0)
|
||||
return grub_error (GRUB_ERR_BUG, "not a geli");
|
||||
@@ -464,12 +477,12 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
}
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, geomkey,
|
||||
sizeof (geomkey), "\1", 1, digest);
|
||||
dev->hash->mdlen, "\1", 1, digest);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, geomkey,
|
||||
sizeof (geomkey), "\0", 1, verify_key);
|
||||
dev->hash->mdlen, "\0", 1, verify_key);
|
||||
if (gcry_err)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
@@ -479,7 +492,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
for (i = 0; i < ARRAY_SIZE (header.keys); i++)
|
||||
{
|
||||
struct grub_geli_key candidate_key;
|
||||
grub_uint8_t key_hmac[dev->hash->mdlen];
|
||||
grub_uint8_t key_hmac[GRUB_CRYPTO_MAX_MDLEN];
|
||||
|
||||
/* Check if keyslot is enabled. */
|
||||
if (! (header.keys_used & (1 << i)))
|
||||
@@ -500,7 +513,7 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
return grub_crypto_gcry_error (gcry_err);
|
||||
|
||||
gcry_err = grub_crypto_hmac_buffer (dev->hash, verify_key,
|
||||
sizeof (verify_key),
|
||||
dev->hash->mdlen,
|
||||
&candidate_key,
|
||||
(sizeof (candidate_key)
|
||||
- sizeof (candidate_key.hmac)),
|
||||
@@ -512,6 +525,19 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
continue;
|
||||
grub_printf_ (N_("Slot %d opened\n"), i);
|
||||
|
||||
if (grub_le_to_cpu32 (header.version) >= 7)
|
||||
{
|
||||
/* GELI >=7 uses the cipher_key */
|
||||
grub_memcpy (geli_cipher_key, candidate_key.cipher_key,
|
||||
sizeof (candidate_key.cipher_key));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* GELI <=6 uses the iv_key */
|
||||
grub_memcpy (geli_cipher_key, candidate_key.iv_key,
|
||||
sizeof (candidate_key.iv_key));
|
||||
}
|
||||
|
||||
/* Set the master key. */
|
||||
if (!dev->rekey)
|
||||
{
|
||||
@@ -528,13 +554,13 @@ recover_key (grub_disk_t source, grub_cryptodisk_t dev)
|
||||
grub_size_t real_keysize = keysize;
|
||||
if (grub_le_to_cpu16 (header.alg) == 0x16)
|
||||
real_keysize *= 2;
|
||||
/* For a reason I don't know, the IV key is used in rekeying. */
|
||||
grub_memcpy (dev->rekey_key, candidate_key.iv_key,
|
||||
sizeof (candidate_key.iv_key));
|
||||
|
||||
grub_memcpy (dev->rekey_key, geli_cipher_key,
|
||||
sizeof (geli_cipher_key));
|
||||
dev->rekey_derived_size = real_keysize;
|
||||
dev->last_rekey = -1;
|
||||
COMPILE_TIME_ASSERT (sizeof (dev->rekey_key)
|
||||
>= sizeof (candidate_key.iv_key));
|
||||
>= sizeof (geli_cipher_key));
|
||||
}
|
||||
|
||||
dev->iv_prefix_len = sizeof (candidate_key.iv_key);
|
||||
|
||||
@@ -20,9 +20,13 @@
|
||||
/* When using the disk, make a reference to this module. Otherwise
|
||||
the user will end up with a useless module :-). */
|
||||
|
||||
#include <config.h>
|
||||
#include <config-util.h>
|
||||
|
||||
#include <grub/dl.h>
|
||||
#include <grub/disk.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/emu/hostdisk.h>
|
||||
|
||||
int grub_disk_host_i_want_a_reference;
|
||||
|
||||
@@ -45,7 +49,7 @@ grub_host_open (const char *name, grub_disk_t disk)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a host disk");
|
||||
|
||||
disk->total_sectors = 0;
|
||||
disk->id = (unsigned long) "host";
|
||||
disk->id = 0;
|
||||
|
||||
disk->data = 0;
|
||||
|
||||
|
||||
@@ -419,11 +419,23 @@ grub_biosdisk_open (const char *name, grub_disk_t disk)
|
||||
}
|
||||
}
|
||||
|
||||
if (data->sectors == 0)
|
||||
data->sectors = 63;
|
||||
if (data->heads == 0)
|
||||
data->heads = 255;
|
||||
|
||||
if (! total_sectors)
|
||||
total_sectors = data->cylinders * data->heads * data->sectors;
|
||||
}
|
||||
|
||||
disk->total_sectors = total_sectors;
|
||||
/* Limit the max to 0x7f because of Phoenix EDD. */
|
||||
disk->max_agglomerate = 0x7f >> GRUB_DISK_CACHE_BITS;
|
||||
COMPILE_TIME_ASSERT ((0x7f >> GRUB_DISK_CACHE_BITS
|
||||
<< (GRUB_DISK_SECTOR_BITS + GRUB_DISK_CACHE_BITS))
|
||||
+ sizeof (struct grub_biosdisk_dap)
|
||||
< GRUB_MEMORY_MACHINE_SCRATCH_SIZE);
|
||||
|
||||
disk->data = data;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -448,6 +460,14 @@ grub_biosdisk_rw (int cmd, grub_disk_t disk,
|
||||
{
|
||||
struct grub_biosdisk_data *data = disk->data;
|
||||
|
||||
/* VirtualBox fails with sectors above 2T on CDs.
|
||||
Since even BD-ROMS are never that big anyway, return error. */
|
||||
if ((data->flags & GRUB_BIOSDISK_FLAG_CDROM)
|
||||
&& (sector >> 32))
|
||||
return grub_error (GRUB_ERR_OUT_OF_RANGE,
|
||||
N_("attempt to read or write outside of disk `%s'"),
|
||||
disk->name);
|
||||
|
||||
if (data->flags & GRUB_BIOSDISK_FLAG_LBA)
|
||||
{
|
||||
struct grub_biosdisk_dap *dap;
|
||||
@@ -548,10 +568,6 @@ get_safe_sectors (grub_disk_t disk, grub_disk_addr_t sector)
|
||||
|
||||
size = sectors - offset;
|
||||
|
||||
/* Limit the max to 0x7f because of Phoenix EDD. */
|
||||
if (size > ((0x7fU << GRUB_DISK_SECTOR_BITS) >> disk->log_sector_size))
|
||||
size = ((0x7fU << GRUB_DISK_SECTOR_BITS) >> disk->log_sector_size);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
@@ -113,6 +113,11 @@ grub_nand_open (const char *name, grub_disk_t disk)
|
||||
}
|
||||
|
||||
data->block_size = (args.size1 >> GRUB_DISK_SECTOR_BITS);
|
||||
if (!data->block_size)
|
||||
{
|
||||
grub_error (GRUB_ERR_UNKNOWN_DEVICE, "invalid block size");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
INIT_IEEE1275_COMMON (&args.common, "call-method", 2, 3);
|
||||
args.method = (grub_ieee1275_cell_t) "size";
|
||||
|
||||
@@ -31,11 +31,14 @@ static grub_ieee1275_ihandle_t last_ihandle;
|
||||
struct ofdisk_hash_ent
|
||||
{
|
||||
char *devpath;
|
||||
char *open_path;
|
||||
char *grub_devpath;
|
||||
int is_boot;
|
||||
int is_cdrom;
|
||||
/* Pointer to shortest available name on nodes representing canonical names,
|
||||
otherwise NULL. */
|
||||
const char *shortest;
|
||||
const char *grub_shortest;
|
||||
struct ofdisk_hash_ent *next;
|
||||
};
|
||||
|
||||
@@ -70,12 +73,50 @@ ofdisk_hash_add_real (char *devpath)
|
||||
{
|
||||
struct ofdisk_hash_ent *p;
|
||||
struct ofdisk_hash_ent **head = &ofdisk_hash[ofdisk_hash_fn(devpath)];
|
||||
const char *iptr;
|
||||
char *optr;
|
||||
|
||||
p = grub_zalloc (sizeof (*p));
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
p->devpath = devpath;
|
||||
|
||||
p->grub_devpath = grub_malloc (sizeof ("ieee1275/")
|
||||
+ 2 * grub_strlen (p->devpath));
|
||||
|
||||
if (!p->grub_devpath)
|
||||
{
|
||||
grub_free (p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0))
|
||||
{
|
||||
p->open_path = grub_malloc (grub_strlen (p->devpath) + 3);
|
||||
if (!p->open_path)
|
||||
{
|
||||
grub_free (p->grub_devpath);
|
||||
grub_free (p);
|
||||
return NULL;
|
||||
}
|
||||
optr = grub_stpcpy (p->open_path, p->devpath);
|
||||
*optr++ = ':';
|
||||
*optr++ = '0';
|
||||
*optr = '\0';
|
||||
}
|
||||
else
|
||||
p->open_path = p->devpath;
|
||||
|
||||
optr = grub_stpcpy (p->grub_devpath, "ieee1275/");
|
||||
for (iptr = p->devpath; *iptr; )
|
||||
{
|
||||
if (*iptr == ',')
|
||||
*optr++ = '\\';
|
||||
*optr++ = *iptr++;
|
||||
}
|
||||
*optr = 0;
|
||||
|
||||
p->next = *head;
|
||||
*head = p;
|
||||
return p;
|
||||
@@ -104,7 +145,8 @@ ofdisk_hash_add (char *devpath, char *curcan)
|
||||
|
||||
if (!curcan)
|
||||
{
|
||||
p->shortest = devpath;
|
||||
p->shortest = p->devpath;
|
||||
p->grub_shortest = p->grub_devpath;
|
||||
if (check_string_cdrom (devpath))
|
||||
p->is_cdrom = 1;
|
||||
return p;
|
||||
@@ -125,7 +167,10 @@ ofdisk_hash_add (char *devpath, char *curcan)
|
||||
{
|
||||
if (!pcan->shortest
|
||||
|| grub_strlen (pcan->shortest) > grub_strlen (devpath))
|
||||
pcan->shortest = devpath;
|
||||
{
|
||||
pcan->shortest = p->devpath;
|
||||
pcan->grub_shortest = p->grub_devpath;
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
@@ -288,21 +333,8 @@ grub_ofdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
if (!ent->is_boot && ent->is_cdrom)
|
||||
continue;
|
||||
|
||||
{
|
||||
char buffer[sizeof ("ieee1275/") + 2 * grub_strlen (ent->shortest)];
|
||||
const char *iptr;
|
||||
char *optr;
|
||||
optr = grub_stpcpy (buffer, "ieee1275/");
|
||||
for (iptr = ent->shortest; *iptr; )
|
||||
{
|
||||
if (*iptr == ',')
|
||||
*optr++ = '\\';
|
||||
*optr++ = *iptr++;
|
||||
}
|
||||
*optr = 0;
|
||||
if (hook (buffer, hook_data))
|
||||
return 1;
|
||||
}
|
||||
if (hook (ent->grub_shortest, hook_data))
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -396,7 +428,7 @@ grub_ofdisk_open (const char *name, grub_disk_t disk)
|
||||
if (!op)
|
||||
return grub_errno;
|
||||
disk->id = (unsigned long) op;
|
||||
disk->data = op->devpath;
|
||||
disk->data = op->open_path;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -428,20 +460,7 @@ grub_ofdisk_prepare (grub_disk_t disk, grub_disk_addr_t sector)
|
||||
last_ihandle = 0;
|
||||
last_devpath = NULL;
|
||||
|
||||
if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_PARTITION_0))
|
||||
{
|
||||
char name2[grub_strlen (disk->data) + 3];
|
||||
char *p;
|
||||
|
||||
grub_strcpy (name2, disk->data);
|
||||
p = name2 + grub_strlen (name2);
|
||||
*p++ = ':';
|
||||
*p++ = '0';
|
||||
*p = 0;
|
||||
grub_ieee1275_open (name2, &last_ihandle);
|
||||
}
|
||||
else
|
||||
grub_ieee1275_open (disk->data, &last_ihandle);
|
||||
grub_ieee1275_open (disk->data, &last_ihandle);
|
||||
if (! last_ihandle)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
|
||||
last_devpath = disk->data;
|
||||
|
||||
@@ -49,7 +49,7 @@ struct grub_ldm_vblk {
|
||||
grub_uint8_t type;
|
||||
grub_uint32_t unused2;
|
||||
grub_uint8_t dynamic[104];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
#define LDM_VBLK_MAGIC "VBLK"
|
||||
|
||||
enum
|
||||
@@ -83,7 +83,7 @@ struct grub_ldm_label
|
||||
grub_uint64_t pv_size;
|
||||
grub_uint64_t config_start;
|
||||
grub_uint64_t config_size;
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
|
||||
#define LDM_MAGIC "PRIVHEAD"
|
||||
@@ -1012,7 +1012,7 @@ grub_util_ldm_embed (struct grub_disk *disk, unsigned int *nsectors,
|
||||
usable for bootloaders (called generically
|
||||
"embedding zone") and this operation is
|
||||
called "embedding". */
|
||||
N_("your LDM embedding Partition is too small;"
|
||||
N_("your LDM Embedding Partition is too small;"
|
||||
" embedding won't be possible"));
|
||||
*nsectors = lv->size;
|
||||
if (*nsectors > max_nsectors)
|
||||
|
||||
@@ -32,9 +32,11 @@ struct grub_loopback
|
||||
char *devname;
|
||||
grub_file_t file;
|
||||
struct grub_loopback *next;
|
||||
unsigned long id;
|
||||
};
|
||||
|
||||
static struct grub_loopback *loopback_list;
|
||||
static unsigned long last_id = 0;
|
||||
|
||||
static const struct grub_arg_option options[] =
|
||||
{
|
||||
@@ -120,6 +122,7 @@ grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
}
|
||||
|
||||
newdev->file = file;
|
||||
newdev->id = last_id++;
|
||||
|
||||
/* Add the new entry to the list. */
|
||||
newdev->next = loopback_list;
|
||||
@@ -167,7 +170,11 @@ grub_loopback_open (const char *name, grub_disk_t disk)
|
||||
/ GRUB_DISK_SECTOR_SIZE);
|
||||
else
|
||||
disk->total_sectors = GRUB_DISK_SIZE_UNKNOWN;
|
||||
disk->id = (unsigned long) dev;
|
||||
/* Avoid reading more than 512M. */
|
||||
disk->max_agglomerate = 1 << (29 - GRUB_DISK_SECTOR_BITS
|
||||
- GRUB_DISK_CACHE_BITS);
|
||||
|
||||
disk->id = dev->id;
|
||||
|
||||
disk->data = dev;
|
||||
|
||||
|
||||
+21
-6
@@ -56,7 +56,7 @@ struct grub_luks_phdr
|
||||
grub_uint32_t keyMaterialOffset;
|
||||
grub_uint32_t stripes;
|
||||
} keyblock[8];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
typedef struct grub_luks_phdr *grub_luks_phdr_t;
|
||||
|
||||
@@ -143,6 +143,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "invalid keysize %d",
|
||||
grub_be_to_cpu32 (header.keyBytes));
|
||||
grub_crypto_cipher_close (cipher);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -181,9 +182,10 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
}
|
||||
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
||||
{
|
||||
grub_crypto_cipher_close (cipher);
|
||||
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)
|
||||
@@ -191,6 +193,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -200,9 +203,9 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
cipheriv = ciphermode + sizeof ("lrw-") - 1;
|
||||
if (cipher->cipher->blocksize != GRUB_CRYPTODISK_GF_BYTES)
|
||||
{
|
||||
grub_crypto_cipher_close (cipher);
|
||||
grub_error (GRUB_ERR_BAD_ARGUMENT, "Unsupported LRW block size: %d",
|
||||
cipher->cipher->blocksize);
|
||||
grub_crypto_cipher_close (cipher);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -225,6 +228,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
|| 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++);
|
||||
@@ -243,6 +247,7 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
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;
|
||||
@@ -251,12 +256,14 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
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;
|
||||
@@ -276,7 +283,12 @@ configure_ciphers (grub_disk_t disk, const char *check_uuid,
|
||||
|
||||
newdev = grub_zalloc (sizeof (struct grub_cryptodisk));
|
||||
if (!newdev)
|
||||
return NULL;
|
||||
{
|
||||
grub_crypto_cipher_close (cipher);
|
||||
grub_crypto_cipher_close (essiv_cipher);
|
||||
grub_crypto_cipher_close (secondary_cipher);
|
||||
return NULL;
|
||||
}
|
||||
newdev->cipher = cipher;
|
||||
newdev->offset = grub_be_to_cpu32 (header.payloadOffset);
|
||||
newdev->source_disk = NULL;
|
||||
@@ -316,6 +328,8 @@ luks_recover_key (grub_disk_t source,
|
||||
|
||||
grub_puts_ (N_("Attempting to decrypt master key..."));
|
||||
keysize = grub_be_to_cpu32 (header.keyBytes);
|
||||
if (keysize > GRUB_CRYPTODISK_MAX_KEYLEN)
|
||||
return grub_error (GRUB_ERR_BAD_FS, "key is too long");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE (header.keyblock); i++)
|
||||
if (grub_be_to_cpu32 (header.keyblock[i].active) == LUKS_KEY_ENABLED
|
||||
@@ -344,8 +358,8 @@ luks_recover_key (grub_disk_t source,
|
||||
for (i = 0; i < ARRAY_SIZE (header.keyblock); i++)
|
||||
{
|
||||
gcry_err_code_t gcry_err;
|
||||
grub_uint8_t candidate_key[keysize];
|
||||
grub_uint8_t digest[keysize];
|
||||
grub_uint8_t candidate_key[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||
grub_uint8_t digest[GRUB_CRYPTODISK_MAX_KEYLEN];
|
||||
|
||||
/* Check if keyslot is enabled. */
|
||||
if (grub_be_to_cpu32 (header.keyblock[i].active) != LUKS_KEY_ENABLED)
|
||||
@@ -449,6 +463,7 @@ luks_recover_key (grub_disk_t source,
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_free (split_key);
|
||||
return GRUB_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ grub_lvm_checkvalue (char **p, char *str, char *tmpl)
|
||||
static int
|
||||
grub_lvm_check_flag (char *p, const char *str, const char *flag)
|
||||
{
|
||||
int len_str = grub_strlen (str), len_flag = grub_strlen (flag);
|
||||
grub_size_t len_str = grub_strlen (str), len_flag = grub_strlen (flag);
|
||||
while (1)
|
||||
{
|
||||
char *q;
|
||||
@@ -111,7 +111,8 @@ grub_lvm_detect (grub_disk_t disk,
|
||||
struct grub_lvm_disk_locn *dlocn;
|
||||
struct grub_lvm_mda_header *mdah;
|
||||
struct grub_lvm_raw_locn *rlocn;
|
||||
unsigned int i, j, vgname_len;
|
||||
unsigned int i, j;
|
||||
grub_size_t vgname_len;
|
||||
struct grub_diskfilter_vg *vg;
|
||||
struct grub_diskfilter_pv *pv;
|
||||
|
||||
@@ -273,7 +274,7 @@ grub_lvm_detect (grub_disk_t disk,
|
||||
/* Add all the pvs to the volume group. */
|
||||
while (1)
|
||||
{
|
||||
int s;
|
||||
grub_ssize_t s;
|
||||
while (grub_isspace (*p))
|
||||
p++;
|
||||
|
||||
@@ -332,15 +333,15 @@ grub_lvm_detect (grub_disk_t disk,
|
||||
}
|
||||
}
|
||||
|
||||
p = grub_strstr (p, "logical_volumes");
|
||||
p = grub_strstr (p, "logical_volumes {");
|
||||
if (p)
|
||||
{
|
||||
p += sizeof ("logical_volumes = ") - 1;
|
||||
p += sizeof ("logical_volumes {") - 1;
|
||||
|
||||
/* And add all the lvs to the volume group. */
|
||||
while (1)
|
||||
{
|
||||
int s;
|
||||
grub_ssize_t s;
|
||||
int skip_lv = 0;
|
||||
struct grub_diskfilter_lv *lv;
|
||||
struct grub_diskfilter_segment *seg;
|
||||
|
||||
@@ -97,7 +97,7 @@ struct grub_raid_super_1x
|
||||
*/
|
||||
grub_uint16_t dev_roles[0]; /* Role in array, or 0xffff for a spare, or 0xfffe for faulty. */
|
||||
};
|
||||
/* Could be __attribute__ ((packed)), but since all members in this struct
|
||||
/* Could be GRUB_PACKED, but since all members in this struct
|
||||
are already appropriately aligned, we can omit this and avoid suboptimal
|
||||
assembly in some cases. */
|
||||
|
||||
|
||||
@@ -33,16 +33,16 @@ GRUB_MOD_LICENSE ("GPLv3+");
|
||||
#define grub_md_to_cpu64 grub_be_to_cpu64
|
||||
#define grub_md_to_cpu32 grub_be_to_cpu32
|
||||
#define grub_md_to_cpu16 grub_be_to_cpu16
|
||||
#define grub_cpu_to_md64_compile_time grub_cpu_to_be64
|
||||
#define grub_cpu_to_md32_compile_time grub_cpu_to_be32
|
||||
#define grub_cpu_to_md16_compile_time grub_cpu_to_be16
|
||||
#define grub_cpu_to_md64_compile_time grub_cpu_to_be64_compile_time
|
||||
#define grub_cpu_to_md32_compile_time grub_cpu_to_be32_compile_time
|
||||
#define grub_cpu_to_md16_compile_time grub_cpu_to_be16_compile_time
|
||||
#else
|
||||
#define grub_md_to_cpu64 grub_le_to_cpu64
|
||||
#define grub_md_to_cpu32 grub_le_to_cpu32
|
||||
#define grub_md_to_cpu16 grub_le_to_cpu16
|
||||
#define grub_cpu_to_md64_compile_time grub_cpu_to_le64
|
||||
#define grub_cpu_to_md32_compile_time grub_cpu_to_le32
|
||||
#define grub_cpu_to_md16_compile_time grub_cpu_to_le16
|
||||
#define grub_cpu_to_md64_compile_time grub_cpu_to_le64_compile_time
|
||||
#define grub_cpu_to_md32_compile_time grub_cpu_to_le32_compile_time
|
||||
#define grub_cpu_to_md16_compile_time grub_cpu_to_le16_compile_time
|
||||
#endif
|
||||
|
||||
#define RESERVED_BYTES (64 * 1024)
|
||||
@@ -175,7 +175,7 @@ struct grub_raid_super_09
|
||||
* Active descriptor
|
||||
*/
|
||||
struct grub_raid_disk_09 this_disk;
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
static struct grub_diskfilter_vg *
|
||||
grub_mdraid_detect (grub_disk_t disk,
|
||||
@@ -184,9 +184,10 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
{
|
||||
grub_disk_addr_t sector;
|
||||
grub_uint64_t size;
|
||||
struct grub_raid_super_09 sb;
|
||||
struct grub_raid_super_09 *sb = NULL;
|
||||
grub_uint32_t *uuid;
|
||||
grub_uint32_t level;
|
||||
struct grub_diskfilter_vg *ret;
|
||||
|
||||
/* The sector where the mdraid 0.90 superblock is stored, if available. */
|
||||
size = grub_disk_get_size (disk);
|
||||
@@ -195,27 +196,31 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
return NULL;
|
||||
sector = NEW_SIZE_SECTORS (size);
|
||||
|
||||
if (grub_disk_read (disk, sector, 0, SB_BYTES, &sb))
|
||||
sb = grub_malloc (sizeof (*sb));
|
||||
if (!sb)
|
||||
return NULL;
|
||||
|
||||
if (grub_disk_read (disk, sector, 0, SB_BYTES, sb))
|
||||
goto fail;
|
||||
|
||||
/* Look whether there is a mdraid 0.90 superblock. */
|
||||
if (sb.md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC))
|
||||
if (sb->md_magic != grub_cpu_to_md32_compile_time (SB_MAGIC))
|
||||
/* not 0.9x raid. */
|
||||
return NULL;
|
||||
goto fail;
|
||||
|
||||
if (sb.major_version != grub_cpu_to_md32_compile_time (0)
|
||||
|| sb.minor_version != grub_cpu_to_md32_compile_time (90))
|
||||
if (sb->major_version != grub_cpu_to_md32_compile_time (0)
|
||||
|| sb->minor_version != grub_cpu_to_md32_compile_time (90))
|
||||
/* Unsupported version. */
|
||||
return NULL;
|
||||
goto fail;
|
||||
|
||||
/* No need for explicit check that sb.size is 0 (unspecified) since
|
||||
/* No need for explicit check that sb->size is 0 (unspecified) since
|
||||
0 >= non-0 is false. */
|
||||
if (((grub_disk_addr_t) grub_md_to_cpu32 (sb.size)) * 2 >= size)
|
||||
return NULL;
|
||||
if (((grub_disk_addr_t) grub_md_to_cpu32 (sb->size)) * 2 >= size)
|
||||
goto fail;
|
||||
|
||||
/* FIXME: Check the checksum. */
|
||||
|
||||
level = grub_md_to_cpu32 (sb.level);
|
||||
level = grub_md_to_cpu32 (sb->level);
|
||||
/* Multipath. */
|
||||
if ((int) level == -4)
|
||||
level = 1;
|
||||
@@ -225,37 +230,43 @@ grub_mdraid_detect (grub_disk_t disk,
|
||||
{
|
||||
grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
|
||||
"unsupported RAID level: %d", level);
|
||||
return NULL;
|
||||
goto fail;
|
||||
}
|
||||
if (grub_md_to_cpu32 (sb.this_disk.number) == 0xffff
|
||||
|| grub_md_to_cpu32 (sb.this_disk.number) == 0xfffe)
|
||||
if (grub_md_to_cpu32 (sb->this_disk.number) == 0xffff
|
||||
|| grub_md_to_cpu32 (sb->this_disk.number) == 0xfffe)
|
||||
/* Spares aren't implemented. */
|
||||
return NULL;
|
||||
goto fail;
|
||||
|
||||
uuid = grub_malloc (16);
|
||||
if (!uuid)
|
||||
return NULL;
|
||||
goto fail;
|
||||
|
||||
uuid[0] = grub_swap_bytes32 (sb.set_uuid0);
|
||||
uuid[1] = grub_swap_bytes32 (sb.set_uuid1);
|
||||
uuid[2] = grub_swap_bytes32 (sb.set_uuid2);
|
||||
uuid[3] = grub_swap_bytes32 (sb.set_uuid3);
|
||||
uuid[0] = grub_swap_bytes32 (sb->set_uuid0);
|
||||
uuid[1] = grub_swap_bytes32 (sb->set_uuid1);
|
||||
uuid[2] = grub_swap_bytes32 (sb->set_uuid2);
|
||||
uuid[3] = grub_swap_bytes32 (sb->set_uuid3);
|
||||
|
||||
*start_sector = 0;
|
||||
|
||||
id->uuidlen = 0;
|
||||
id->id = grub_md_to_cpu32 (sb.this_disk.number);
|
||||
id->id = grub_md_to_cpu32 (sb->this_disk.number);
|
||||
|
||||
char buf[32];
|
||||
grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb.md_minor));
|
||||
return grub_diskfilter_make_raid (16, (char *) uuid,
|
||||
grub_md_to_cpu32 (sb.raid_disks), buf,
|
||||
(sb.size) ? ((grub_disk_addr_t)
|
||||
grub_md_to_cpu32 (sb.size)) * 2
|
||||
: sector,
|
||||
grub_md_to_cpu32 (sb.chunk_size) >> 9,
|
||||
grub_md_to_cpu32 (sb.layout),
|
||||
level);
|
||||
grub_snprintf (buf, sizeof (buf), "md%d", grub_md_to_cpu32 (sb->md_minor));
|
||||
ret = grub_diskfilter_make_raid (16, (char *) uuid,
|
||||
grub_md_to_cpu32 (sb->raid_disks), buf,
|
||||
(sb->size) ? ((grub_disk_addr_t)
|
||||
grub_md_to_cpu32 (sb->size)) * 2
|
||||
: sector,
|
||||
grub_md_to_cpu32 (sb->chunk_size) >> 9,
|
||||
grub_md_to_cpu32 (sb->layout),
|
||||
level);
|
||||
grub_free (sb);
|
||||
return ret;
|
||||
|
||||
fail:
|
||||
grub_free (sb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct grub_diskfilter grub_mdraid_dev = {
|
||||
|
||||
@@ -46,7 +46,8 @@ grub_memdisk_open (const char *name, grub_disk_t disk)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a memdisk");
|
||||
|
||||
disk->total_sectors = memdisk_size / GRUB_DISK_SECTOR_SIZE;
|
||||
disk->id = (unsigned long) "mdsk";
|
||||
disk->max_agglomerate = GRUB_DISK_MAX_MAX_AGGLOMERATE;
|
||||
disk->id = 0;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
@@ -402,9 +402,15 @@ grub_pata_pciinit (grub_pci_device_t dev,
|
||||
bar2 = grub_pci_read (addr);
|
||||
|
||||
/* Check if the BARs describe an IO region. */
|
||||
if ((bar1 & 1) && (bar2 & 1))
|
||||
if ((bar1 & 1) && (bar2 & 1) && (bar1 & ~3))
|
||||
{
|
||||
rega = bar1 & ~3;
|
||||
addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
|
||||
grub_pci_write_word (addr, grub_pci_read_word (addr)
|
||||
| GRUB_PCI_COMMAND_IO_ENABLED
|
||||
| GRUB_PCI_COMMAND_MEM_ENABLED
|
||||
| GRUB_PCI_COMMAND_BUS_MASTER);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,9 +34,9 @@ static unsigned powx_inv[256];
|
||||
static const grub_uint8_t poly = 0x1d;
|
||||
|
||||
static void
|
||||
grub_raid_block_mulx (unsigned mul, char *buf, int size)
|
||||
grub_raid_block_mulx (unsigned mul, char *buf, grub_size_t size)
|
||||
{
|
||||
int i;
|
||||
grub_size_t i;
|
||||
grub_uint8_t *p;
|
||||
|
||||
p = (grub_uint8_t *) buf;
|
||||
|
||||
+42
-61
@@ -201,7 +201,7 @@ grub_scsi_read_capacity16 (grub_scsi_t scsi)
|
||||
rc.opcode = grub_scsi_cmd_read_capacity16;
|
||||
rc.lun = (scsi->lun << GRUB_SCSI_LUN_SHIFT) | 0x10;
|
||||
rc.logical_block_addr = 0;
|
||||
rc.alloc_len = grub_cpu_to_be32 (sizeof (rcd));
|
||||
rc.alloc_len = grub_cpu_to_be32_compile_time (sizeof (rcd));
|
||||
rc.PMI = 0;
|
||||
rc.control = 0;
|
||||
|
||||
@@ -606,6 +606,13 @@ grub_scsi_open (const char *name, grub_disk_t disk)
|
||||
}
|
||||
|
||||
disk->total_sectors = scsi->last_block + 1;
|
||||
/* PATA doesn't support more than 32K reads.
|
||||
Not sure about AHCI and USB. If it's confirmed that either of
|
||||
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||
structure. */
|
||||
disk->max_agglomerate = 32768 >> (GRUB_DISK_SECTOR_BITS
|
||||
+ GRUB_DISK_CACHE_BITS);
|
||||
|
||||
if (scsi->blocksize & (scsi->blocksize - 1) || !scsi->blocksize)
|
||||
{
|
||||
grub_free (scsi);
|
||||
@@ -647,40 +654,27 @@ grub_scsi_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
|
||||
scsi = disk->data;
|
||||
|
||||
while (size)
|
||||
grub_err_t err;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
{
|
||||
/* PATA doesn't support more than 32K reads.
|
||||
Not sure about AHCI and USB. If it's confirmed that either of
|
||||
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||
structure. */
|
||||
grub_size_t len = 32768 >> disk->log_sector_size;
|
||||
grub_err_t err;
|
||||
if (len > size)
|
||||
len = size;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
{
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, len, buf);
|
||||
else
|
||||
err = grub_scsi_read10 (disk, sector, len, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, size, buf);
|
||||
else
|
||||
err = grub_scsi_read10 (disk, sector, size, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
|
||||
case grub_scsi_devtype_cdrom:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, len, buf);
|
||||
else
|
||||
err = grub_scsi_read12 (disk, sector, len, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
size -= len;
|
||||
sector += len;
|
||||
buf += len << disk->log_sector_size;
|
||||
case grub_scsi_devtype_cdrom:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_read16 (disk, sector, size, buf);
|
||||
else
|
||||
err = grub_scsi_read12 (disk, sector, size, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
@@ -718,10 +712,10 @@ grub_scsi_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_scsi_write (grub_disk_t disk __attribute((unused)),
|
||||
grub_disk_addr_t sector __attribute((unused)),
|
||||
grub_size_t size __attribute((unused)),
|
||||
const char *buf __attribute((unused)))
|
||||
grub_scsi_write (grub_disk_t disk,
|
||||
grub_disk_addr_t sector,
|
||||
grub_size_t size,
|
||||
const char *buf)
|
||||
{
|
||||
grub_scsi_t scsi;
|
||||
|
||||
@@ -730,31 +724,18 @@ grub_scsi_write (grub_disk_t disk __attribute((unused)),
|
||||
if (scsi->devtype == grub_scsi_devtype_cdrom)
|
||||
return grub_error (GRUB_ERR_IO, N_("cannot write to CD-ROM"));
|
||||
|
||||
while (size)
|
||||
grub_err_t err;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
{
|
||||
/* PATA doesn't support more than 32K reads.
|
||||
Not sure about AHCI and USB. If it's confirmed that either of
|
||||
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||
structure. */
|
||||
grub_size_t len = 32768 >> disk->log_sector_size;
|
||||
grub_err_t err;
|
||||
if (len > size)
|
||||
len = size;
|
||||
/* Depending on the type, select a read function. */
|
||||
switch (scsi->devtype)
|
||||
{
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_write16 (disk, sector, len, buf);
|
||||
else
|
||||
err = grub_scsi_write10 (disk, sector, len, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
size -= len;
|
||||
sector += len;
|
||||
buf += len << disk->log_sector_size;
|
||||
case grub_scsi_devtype_direct:
|
||||
if (sector >> 32)
|
||||
err = grub_scsi_write16 (disk, sector, size, buf);
|
||||
else
|
||||
err = grub_scsi_write10 (disk, sector, size, buf);
|
||||
if (err)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
@@ -47,6 +47,7 @@ grub_ubootdisk_register (struct device_info *newdev)
|
||||
{
|
||||
case DT_STOR_IDE:
|
||||
case DT_STOR_SATA:
|
||||
case DT_STOR_SCSI:
|
||||
case DT_STOR_MMC:
|
||||
case DT_STOR_USB:
|
||||
/* hd */
|
||||
|
||||
+18
-17
@@ -44,7 +44,7 @@ struct grub_usbms_cbw
|
||||
grub_uint8_t lun;
|
||||
grub_uint8_t length;
|
||||
grub_uint8_t cbwcb[16];
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
struct grub_usbms_csw
|
||||
{
|
||||
@@ -52,7 +52,7 @@ struct grub_usbms_csw
|
||||
grub_uint32_t tag;
|
||||
grub_uint32_t residue;
|
||||
grub_uint8_t status;
|
||||
} __attribute__ ((packed));
|
||||
} GRUB_PACKED;
|
||||
|
||||
struct grub_usbms_dev
|
||||
{
|
||||
@@ -76,7 +76,7 @@ typedef struct grub_usbms_dev *grub_usbms_dev_t;
|
||||
static grub_usbms_dev_t grub_usbms_devices[MAX_USBMS_DEVICES];
|
||||
static int first_available_slot = 0;
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_usbms_cbi_cmd (grub_usb_device_t dev, int interface,
|
||||
grub_uint8_t *cbicb)
|
||||
{
|
||||
@@ -86,7 +86,7 @@ grub_usbms_cbi_cmd (grub_usb_device_t dev, int interface,
|
||||
GRUB_USBMS_CBI_CMD_SIZE, (char*)cbicb);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_usbms_cbi_reset (grub_usb_device_t dev, int interface)
|
||||
{
|
||||
/* Prepare array with Command Block Reset (=CBR) */
|
||||
@@ -108,17 +108,13 @@ grub_usbms_cbi_reset (grub_usb_device_t dev, int interface)
|
||||
return grub_usbms_cbi_cmd (dev, interface, (grub_uint8_t *)&cbicb);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_usbms_bo_reset (grub_usb_device_t dev, int interface)
|
||||
{
|
||||
grub_usb_err_t u;
|
||||
u = grub_usb_control_msg (dev, 0x21, 255, 0, interface, 0, 0);
|
||||
if (u)
|
||||
return grub_error (GRUB_ERR_IO, "USB error %d", u);
|
||||
return GRUB_ERR_NONE;
|
||||
return grub_usb_control_msg (dev, 0x21, 255, 0, interface, 0, 0);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
static grub_usb_err_t
|
||||
grub_usbms_reset (grub_usbms_dev_t dev)
|
||||
{
|
||||
if (dev->protocol == GRUB_USBMS_PROTOCOL_BULK)
|
||||
@@ -149,7 +145,7 @@ grub_usbms_attach (grub_usb_device_t usbdev, int configno, int interfno)
|
||||
int j;
|
||||
grub_uint8_t luns = 0;
|
||||
unsigned curnum;
|
||||
grub_usb_err_t err = GRUB_ERR_NONE;
|
||||
grub_usb_err_t err = GRUB_USB_ERR_NONE;
|
||||
|
||||
grub_boot_time ("Attaching USB mass storage");
|
||||
|
||||
@@ -302,6 +298,8 @@ grub_usbms_transfer_bo (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||
grub_usb_err_t errCSW = GRUB_USB_ERR_NONE;
|
||||
int retrycnt = 3 + 1;
|
||||
|
||||
tag++;
|
||||
|
||||
retry:
|
||||
retrycnt--;
|
||||
if (retrycnt == 0)
|
||||
@@ -309,8 +307,8 @@ grub_usbms_transfer_bo (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||
|
||||
/* Setup the request. */
|
||||
grub_memset (&cbw, 0, sizeof (cbw));
|
||||
cbw.signature = grub_cpu_to_le32 (0x43425355);
|
||||
cbw.tag = tag++;
|
||||
cbw.signature = grub_cpu_to_le32_compile_time (0x43425355);
|
||||
cbw.tag = tag;
|
||||
cbw.transfer_length = grub_cpu_to_le32 (size);
|
||||
cbw.flags = (!read_write) << GRUB_USBMS_DIRECTION_BIT;
|
||||
cbw.lun = scsi->lun; /* In USB MS CBW are LUN bits on another place than in SCSI CDB, both should be set correctly. */
|
||||
@@ -339,7 +337,7 @@ grub_usbms_transfer_bo (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||
grub_usb_clear_halt (dev->dev, dev->out->endp_addr);
|
||||
goto CheckCSW;
|
||||
}
|
||||
return grub_error (GRUB_ERR_IO, "USB Mass Storage request failed");
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/* Read/write the data, (maybe) according to specification. */
|
||||
@@ -416,7 +414,7 @@ CheckCSW:
|
||||
|
||||
/* If phase error or not valid signature, do bulk-only reset device. */
|
||||
if ((status.status == 2) ||
|
||||
(status.signature != grub_cpu_to_le32(0x53425355)))
|
||||
(status.signature != grub_cpu_to_le32_compile_time(0x53425355)))
|
||||
{ /* Bulk-only reset device. */
|
||||
grub_dprintf ("usb", "Bulk-only reset device - bad status\n");
|
||||
grub_usbms_reset (dev);
|
||||
@@ -571,8 +569,11 @@ grub_usbms_transfer_cbi (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (err)
|
||||
return grub_error (GRUB_ERR_IO, "USB error %d", err);
|
||||
|
||||
return err;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,458 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2013 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/disk.h>
|
||||
#include <grub/dl.h>
|
||||
#include <grub/mm.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/term.h>
|
||||
#include <grub/i18n.h>
|
||||
#include <grub/xen.h>
|
||||
#include <grub/time.h>
|
||||
#include <xen/io/blkif.h>
|
||||
|
||||
struct virtdisk
|
||||
{
|
||||
int handle;
|
||||
char *fullname;
|
||||
char *backend_dir;
|
||||
char *frontend_dir;
|
||||
struct blkif_sring *shared_page;
|
||||
struct blkif_front_ring ring;
|
||||
grub_xen_grant_t grant;
|
||||
grub_xen_evtchn_t evtchn;
|
||||
void *dma_page;
|
||||
grub_xen_grant_t dma_grant;
|
||||
};
|
||||
|
||||
#define xen_wmb() mb()
|
||||
#define xen_mb() mb()
|
||||
|
||||
static struct virtdisk *virtdisks;
|
||||
static grub_size_t vdiskcnt;
|
||||
|
||||
static int
|
||||
grub_virtdisk_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
|
||||
grub_disk_pull_t pull)
|
||||
{
|
||||
grub_size_t i;
|
||||
|
||||
if (pull != GRUB_DISK_PULL_NONE)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
if (hook (virtdisks[i].fullname, hook_data))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_open (const char *name, grub_disk_t disk)
|
||||
{
|
||||
grub_size_t i;
|
||||
grub_uint32_t secsize;
|
||||
char fdir[200];
|
||||
char *buf;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
if (grub_strcmp (name, virtdisks[i].fullname) == 0)
|
||||
break;
|
||||
if (i == vdiskcnt)
|
||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a virtdisk");
|
||||
disk->data = &virtdisks[i];
|
||||
disk->id = i;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/sectors", virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
disk->total_sectors = grub_strtoull (buf, 0, 10);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/sector-size",
|
||||
virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
return grub_errno;
|
||||
secsize = grub_strtoull (buf, 0, 10);
|
||||
if (grub_errno)
|
||||
return grub_errno;
|
||||
|
||||
if ((secsize & (secsize - 1)) || !secsize || secsize < 512
|
||||
|| secsize > GRUB_XEN_PAGE_SIZE)
|
||||
return grub_error (GRUB_ERR_IO, "unsupported sector size %d", secsize);
|
||||
|
||||
for (disk->log_sector_size = 0;
|
||||
(1U << disk->log_sector_size) < secsize; disk->log_sector_size++);
|
||||
|
||||
disk->total_sectors >>= disk->log_sector_size - 9;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_virtdisk_close (grub_disk_t disk __attribute__ ((unused)))
|
||||
{
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, char *buf)
|
||||
{
|
||||
struct virtdisk *data = disk->data;
|
||||
|
||||
while (size)
|
||||
{
|
||||
grub_size_t cur;
|
||||
struct blkif_request *req;
|
||||
struct blkif_response *resp;
|
||||
int sta = 0;
|
||||
struct evtchn_send send;
|
||||
cur = size;
|
||||
if (cur > (unsigned) (GRUB_XEN_PAGE_SIZE >> disk->log_sector_size))
|
||||
cur = GRUB_XEN_PAGE_SIZE >> disk->log_sector_size;
|
||||
while (RING_FULL (&data->ring))
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
req = RING_GET_REQUEST (&data->ring, data->ring.req_prod_pvt);
|
||||
req->operation = BLKIF_OP_READ;
|
||||
req->nr_segments = 1;
|
||||
req->handle = data->handle;
|
||||
req->id = 0;
|
||||
req->sector_number = sector << (disk->log_sector_size - 9);
|
||||
req->seg[0].gref = data->dma_grant;
|
||||
req->seg[0].first_sect = 0;
|
||||
req->seg[0].last_sect = (cur << (disk->log_sector_size - 9)) - 1;
|
||||
data->ring.req_prod_pvt++;
|
||||
RING_PUSH_REQUESTS (&data->ring);
|
||||
mb ();
|
||||
send.port = data->evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
|
||||
while (!RING_HAS_UNCONSUMED_RESPONSES (&data->ring))
|
||||
{
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
mb ();
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
int wtd;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES (&data->ring, wtd);
|
||||
if (!wtd)
|
||||
break;
|
||||
resp = RING_GET_RESPONSE (&data->ring, data->ring.rsp_cons);
|
||||
data->ring.rsp_cons++;
|
||||
if (resp->status)
|
||||
sta = resp->status;
|
||||
}
|
||||
if (sta)
|
||||
return grub_error (GRUB_ERR_IO, "read failed");
|
||||
grub_memcpy (buf, data->dma_page, cur << disk->log_sector_size);
|
||||
size -= cur;
|
||||
sector += cur;
|
||||
buf += cur << disk->log_sector_size;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_virtdisk_write (grub_disk_t disk, grub_disk_addr_t sector,
|
||||
grub_size_t size, const char *buf)
|
||||
{
|
||||
struct virtdisk *data = disk->data;
|
||||
|
||||
while (size)
|
||||
{
|
||||
grub_size_t cur;
|
||||
struct blkif_request *req;
|
||||
struct blkif_response *resp;
|
||||
int sta = 0;
|
||||
struct evtchn_send send;
|
||||
cur = size;
|
||||
if (cur > (unsigned) (GRUB_XEN_PAGE_SIZE >> disk->log_sector_size))
|
||||
cur = GRUB_XEN_PAGE_SIZE >> disk->log_sector_size;
|
||||
|
||||
grub_memcpy (data->dma_page, buf, cur << disk->log_sector_size);
|
||||
|
||||
while (RING_FULL (&data->ring))
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
req = RING_GET_REQUEST (&data->ring, data->ring.req_prod_pvt);
|
||||
req->operation = BLKIF_OP_WRITE;
|
||||
req->nr_segments = 1;
|
||||
req->handle = data->handle;
|
||||
req->id = 0;
|
||||
req->sector_number = sector << (disk->log_sector_size - 9);
|
||||
req->seg[0].gref = data->dma_grant;
|
||||
req->seg[0].first_sect = 0;
|
||||
req->seg[0].last_sect = (cur << (disk->log_sector_size - 9)) - 1;
|
||||
data->ring.req_prod_pvt++;
|
||||
RING_PUSH_REQUESTS (&data->ring);
|
||||
mb ();
|
||||
send.port = data->evtchn;
|
||||
grub_xen_event_channel_op (EVTCHNOP_send, &send);
|
||||
|
||||
while (!RING_HAS_UNCONSUMED_RESPONSES (&data->ring))
|
||||
{
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
mb ();
|
||||
}
|
||||
while (1)
|
||||
{
|
||||
int wtd;
|
||||
RING_FINAL_CHECK_FOR_RESPONSES (&data->ring, wtd);
|
||||
if (!wtd)
|
||||
break;
|
||||
resp = RING_GET_RESPONSE (&data->ring, data->ring.rsp_cons);
|
||||
data->ring.rsp_cons++;
|
||||
if (resp->status)
|
||||
sta = resp->status;
|
||||
}
|
||||
if (sta)
|
||||
return grub_error (GRUB_ERR_IO, "write failed");
|
||||
size -= cur;
|
||||
sector += cur;
|
||||
buf += cur << disk->log_sector_size;
|
||||
}
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
static struct grub_disk_dev grub_virtdisk_dev = {
|
||||
.name = "xen",
|
||||
.id = GRUB_DISK_DEVICE_XEN,
|
||||
.iterate = grub_virtdisk_iterate,
|
||||
.open = grub_virtdisk_open,
|
||||
.close = grub_virtdisk_close,
|
||||
.read = grub_virtdisk_read,
|
||||
.write = grub_virtdisk_write,
|
||||
.next = 0
|
||||
};
|
||||
|
||||
static int
|
||||
count (const char *dir __attribute__ ((unused)), void *data)
|
||||
{
|
||||
grub_size_t *ctr = data;
|
||||
(*ctr)++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
fill (const char *dir, void *data)
|
||||
{
|
||||
grub_size_t *ctr = data;
|
||||
domid_t dom;
|
||||
/* "dir" is just a number, at most 19 characters. */
|
||||
char fdir[200];
|
||||
char num[20];
|
||||
grub_err_t err;
|
||||
void *buf;
|
||||
struct evtchn_alloc_unbound alloc_unbound;
|
||||
|
||||
/* Shouldn't happen unles some hotplug happened. */
|
||||
if (vdiskcnt >= *ctr)
|
||||
return 1;
|
||||
virtdisks[vdiskcnt].handle = grub_strtoul (dir, 0, 10);
|
||||
if (grub_errno)
|
||||
{
|
||||
grub_errno = 0;
|
||||
return 0;
|
||||
}
|
||||
virtdisks[vdiskcnt].fullname = 0;
|
||||
virtdisks[vdiskcnt].backend_dir = 0;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/backend", dir);
|
||||
virtdisks[vdiskcnt].backend_dir = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!virtdisks[vdiskcnt].backend_dir)
|
||||
goto out_fail_1;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/dev",
|
||||
virtdisks[vdiskcnt].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
{
|
||||
grub_errno = 0;
|
||||
virtdisks[vdiskcnt].fullname = grub_xasprintf ("xenid/%s", dir);
|
||||
}
|
||||
else
|
||||
{
|
||||
virtdisks[vdiskcnt].fullname = grub_xasprintf ("xen/%s", (char *) buf);
|
||||
grub_free (buf);
|
||||
}
|
||||
if (!virtdisks[vdiskcnt].fullname)
|
||||
goto out_fail_1;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/backend-id", dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
goto out_fail_1;
|
||||
|
||||
dom = grub_strtoul (buf, 0, 10);
|
||||
grub_free (buf);
|
||||
if (grub_errno)
|
||||
goto out_fail_1;
|
||||
|
||||
virtdisks[vdiskcnt].shared_page =
|
||||
grub_xen_alloc_shared_page (dom, &virtdisks[vdiskcnt].grant);
|
||||
if (!virtdisks[vdiskcnt].shared_page)
|
||||
goto out_fail_1;
|
||||
|
||||
virtdisks[vdiskcnt].dma_page =
|
||||
grub_xen_alloc_shared_page (dom, &virtdisks[vdiskcnt].dma_grant);
|
||||
if (!virtdisks[vdiskcnt].dma_page)
|
||||
goto out_fail_2;
|
||||
|
||||
alloc_unbound.dom = DOMID_SELF;
|
||||
alloc_unbound.remote_dom = dom;
|
||||
|
||||
grub_xen_event_channel_op (EVTCHNOP_alloc_unbound, &alloc_unbound);
|
||||
virtdisks[vdiskcnt].evtchn = alloc_unbound.port;
|
||||
|
||||
SHARED_RING_INIT (virtdisks[vdiskcnt].shared_page);
|
||||
FRONT_RING_INIT (&virtdisks[vdiskcnt].ring, virtdisks[vdiskcnt].shared_page,
|
||||
GRUB_XEN_PAGE_SIZE);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/ring-ref", dir);
|
||||
grub_snprintf (num, sizeof (num), "%u", virtdisks[vdiskcnt].grant);
|
||||
err = grub_xenstore_write_file (fdir, num, grub_strlen (num));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/event-channel", dir);
|
||||
grub_snprintf (num, sizeof (num), "%u", virtdisks[vdiskcnt].evtchn);
|
||||
err = grub_xenstore_write_file (fdir, num, grub_strlen (num));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/protocol", dir);
|
||||
err = grub_xenstore_write_file (fdir, XEN_IO_PROTO_ABI_NATIVE,
|
||||
grub_strlen (XEN_IO_PROTO_ABI_NATIVE));
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
struct gnttab_dump_table dt;
|
||||
dt.dom = DOMID_SELF;
|
||||
grub_xen_grant_table_op (GNTTABOP_dump_table, (void *) &dt, 1);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s/state", dir);
|
||||
err = grub_xenstore_write_file (fdir, "3", 1);
|
||||
if (err)
|
||||
goto out_fail_3;
|
||||
|
||||
while (1)
|
||||
{
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[vdiskcnt].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
if (!buf)
|
||||
goto out_fail_3;
|
||||
if (grub_strcmp (buf, "2") != 0)
|
||||
break;
|
||||
grub_free (buf);
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
grub_dprintf ("xen", "state=%s\n", (char *) buf);
|
||||
grub_free (buf);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "device/vbd/%s", dir);
|
||||
|
||||
virtdisks[vdiskcnt].frontend_dir = grub_strdup (fdir);
|
||||
|
||||
vdiskcnt++;
|
||||
return 0;
|
||||
|
||||
out_fail_3:
|
||||
grub_xen_free_shared_page (virtdisks[vdiskcnt].dma_page);
|
||||
out_fail_2:
|
||||
grub_xen_free_shared_page (virtdisks[vdiskcnt].shared_page);
|
||||
out_fail_1:
|
||||
grub_free (virtdisks[vdiskcnt].backend_dir);
|
||||
grub_free (virtdisks[vdiskcnt].fullname);
|
||||
|
||||
grub_errno = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
grub_xendisk_init (void)
|
||||
{
|
||||
grub_size_t ctr = 0;
|
||||
if (grub_xenstore_dir ("device/vbd", count, &ctr))
|
||||
grub_errno = 0;
|
||||
|
||||
if (!ctr)
|
||||
return;
|
||||
|
||||
virtdisks = grub_malloc (ctr * sizeof (virtdisks[0]));
|
||||
if (!virtdisks)
|
||||
return;
|
||||
if (grub_xenstore_dir ("device/vbd", fill, &ctr))
|
||||
grub_errno = 0;
|
||||
|
||||
grub_disk_dev_register (&grub_virtdisk_dev);
|
||||
}
|
||||
|
||||
void
|
||||
grub_xendisk_fini (void)
|
||||
{
|
||||
char fdir[200];
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < vdiskcnt; i++)
|
||||
{
|
||||
char *buf;
|
||||
struct evtchn_close close_op = {.port = virtdisks[i].evtchn };
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, "6", 1);
|
||||
|
||||
while (1)
|
||||
{
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].backend_dir);
|
||||
buf = grub_xenstore_get_file (fdir, NULL);
|
||||
grub_dprintf ("xen", "state=%s\n", (char *) buf);
|
||||
|
||||
if (!buf || grub_strcmp (buf, "6") == 0)
|
||||
break;
|
||||
grub_free (buf);
|
||||
grub_xen_sched_op (SCHEDOP_yield, 0);
|
||||
}
|
||||
grub_free (buf);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/ring-ref",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, NULL, 0);
|
||||
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/event-channel",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, NULL, 0);
|
||||
|
||||
grub_xen_free_shared_page (virtdisks[i].dma_page);
|
||||
grub_xen_free_shared_page (virtdisks[i].shared_page);
|
||||
|
||||
grub_xen_event_channel_op (EVTCHNOP_close, &close_op);
|
||||
|
||||
/* Prepare for handoff. */
|
||||
grub_snprintf (fdir, sizeof (fdir), "%s/state",
|
||||
virtdisks[i].frontend_dir);
|
||||
grub_xenstore_write_file (fdir, "1", 1);
|
||||
}
|
||||
}
|
||||
Loaded 100 of 727 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user