Compare commits
1450 Commits
dev/ec-fmp
...
edk2-stabl
Author | SHA1 | Date | |
---|---|---|---|
|
fff6d81270 | ||
|
2ddc8e1b67 | ||
|
93629f2c7c | ||
|
0cb30c3f5e | ||
|
765ba5bf05 | ||
|
a89f558d3c | ||
|
b9e702c3c9 | ||
|
6d55ad9a59 | ||
|
31377aba8f | ||
|
80f097711b | ||
|
d4586fe3ae | ||
|
cef0c5c684 | ||
|
c1b073a9dc | ||
|
933b4c333c | ||
|
3182843f3b | ||
|
c8fb724046 | ||
|
3b1f3414f2 | ||
|
c17c3c24d8 | ||
|
342813a3f7 | ||
|
b0fd309719 | ||
|
179efe5d69 | ||
|
0be81a4d83 | ||
|
6032b46dce | ||
|
6c1a4a376e | ||
|
c7aecf2a4f | ||
|
50bee4cc12 | ||
|
239bcf7805 | ||
|
6e8b0b6913 | ||
|
82e70d9ac0 | ||
|
35043a5ec0 | ||
|
b556f2445c | ||
|
9eb5ccda50 | ||
|
ff29cdb968 | ||
|
6cdddccf00 | ||
|
863fe9e191 | ||
|
4b3e9d80be | ||
|
199031b2b0 | ||
|
922bf317f1 | ||
|
aade3b93fe | ||
|
8a89747844 | ||
|
e00ec499c5 | ||
|
351fe77666 | ||
|
ef4cf3d88d | ||
|
cbce5a1a93 | ||
|
3d480a93de | ||
|
9d8ed9c8ee | ||
|
aa0f522471 | ||
|
9a50990cdb | ||
|
dcf8c79056 | ||
|
cc650a0378 | ||
|
eff44c008d | ||
|
2695e49219 | ||
|
ee3da09bb2 | ||
|
eae9e51d98 | ||
|
b84f32ae5b | ||
|
cab1f02565 | ||
|
c46204e25f | ||
|
957a15adaf | ||
|
ae62a6e44d | ||
|
ed8bfada03 | ||
|
8487ec0ee7 | ||
|
b5dbf8267b | ||
|
85dba961c7 | ||
|
720c25ab41 | ||
|
7dcc2f3870 | ||
|
2af33db365 | ||
|
d1e41c620f | ||
|
6ca9f410d1 | ||
|
43e306806e | ||
|
502c01c502 | ||
|
9b648112a5 | ||
|
32c5a470ad | ||
|
00bbb1e584 | ||
|
df7ce74e6c | ||
|
66772bc852 | ||
|
e9a3613ce0 | ||
|
c9a4df88fd | ||
|
1729fb8a82 | ||
|
8405b1480f | ||
|
dab7bac94c | ||
|
a5672d43a6 | ||
|
5acd6489df | ||
|
0bcd3cc06e | ||
|
2ef32f914a | ||
|
a64cc43552 | ||
|
3bcc2e22ef | ||
|
44b7a856f0 | ||
|
48c6e7dbcd | ||
|
020891f173 | ||
|
52199bf532 | ||
|
d98efb4682 | ||
|
99338ef81e | ||
|
b92298af82 | ||
|
789a723285 | ||
|
25589c4a76 | ||
|
ca01e6216a | ||
|
83f11f9572 | ||
|
68d234989b | ||
|
0a64106c56 | ||
|
c1ff81f799 | ||
|
16bf588b60 | ||
|
115cebbe4d | ||
|
b6efc505e4 | ||
|
7136d5491e | ||
|
fead469a3b | ||
|
75d2be4a37 | ||
|
07be1d34d9 | ||
|
a26050f74d | ||
|
2eff4ddc77 | ||
|
9ca2dc7bec | ||
|
2997ae3873 | ||
|
9e2c88b16e | ||
|
9670f79937 | ||
|
26638d2aa3 | ||
|
7464db4474 | ||
|
56035d1c8b | ||
|
db2c22633f | ||
|
fb493ac84e | ||
|
b28acb22e0 | ||
|
f4213fed34 | ||
|
acb2acccfd | ||
|
4fcd5d2620 | ||
|
0882d6a32d | ||
|
d79295b5c5 | ||
|
3b46a1e243 | ||
|
244ce33bdd | ||
|
584b246e88 | ||
|
0c9744787e | ||
|
dfc7c3dc8c | ||
|
a57b4c11a5 | ||
|
e75951ca89 | ||
|
ea6d859b50 | ||
|
dd00f92b2f | ||
|
961fadf60c | ||
|
8f8372439d | ||
|
8437368c69 | ||
|
d7d9866ef4 | ||
|
4d29da411f | ||
|
6fd754ec0f | ||
|
2355f0c09c | ||
|
913a308df9 | ||
|
c6720db5dd | ||
|
31b1638468 | ||
|
999c53e2ca | ||
|
0487cac09f | ||
|
ab644cfac5 | ||
|
0f6eccdbf7 | ||
|
1d0ff11526 | ||
|
d23eb3aa99 | ||
|
0a29933ea9 | ||
|
225810a182 | ||
|
81aeb94648 | ||
|
09e74b81ba | ||
|
0e6db46b1b | ||
|
b03dceb87f | ||
|
c4663e7277 | ||
|
9d6915ca91 | ||
|
6f1bb567aa | ||
|
012e424601 | ||
|
055eaacc34 | ||
|
beabde5875 | ||
|
b8e54e15de | ||
|
a7e070808c | ||
|
d618fe05bf | ||
|
8fc06b6e19 | ||
|
4aa7e66c06 | ||
|
e0200cc47a | ||
|
2ce4bfb843 | ||
|
380821a949 | ||
|
dad7fc29d9 | ||
|
ced203c3d5 | ||
|
104df6136f | ||
|
f89815a125 | ||
|
dbbb045ff1 | ||
|
10d291f746 | ||
|
264e930de0 | ||
|
cd24eb578b | ||
|
f0a704f9b5 | ||
|
76bf716a7a | ||
|
b1b5177a0c | ||
|
ab9768cd46 | ||
|
bcdafe1179 | ||
|
114e6075b6 | ||
|
c53807cb7b | ||
|
cb4f1dfcc1 | ||
|
1aa311d175 | ||
|
082b563fc4 | ||
|
10daf3ee24 | ||
|
23d873f4cf | ||
|
6e1ddbab8d | ||
|
78b081334e | ||
|
711ee4103a | ||
|
d2c0d52ed6 | ||
|
c5f4b4fd03 | ||
|
ee2ea7868a | ||
|
ad8f2b7251 | ||
|
2067672ded | ||
|
d8c073c89b | ||
|
e25963d458 | ||
|
0371178d0b | ||
|
5bd2dbc698 | ||
|
e7d7f02c8e | ||
|
22745df666 | ||
|
8ecae3d641 | ||
|
190f77f8f4 | ||
|
0371032289 | ||
|
69a50a249b | ||
|
f21a1d48fe | ||
|
f80580f56b | ||
|
8db4e9f9a0 | ||
|
bb78d969b7 | ||
|
cafc573ac0 | ||
|
3c9e2f239a | ||
|
de103f1981 | ||
|
4364d66168 | ||
|
a670f12a74 | ||
|
406ad0582a | ||
|
3361336607 | ||
|
8916a4f67f | ||
|
9e6b552b4c | ||
|
ecb778d0ac | ||
|
bbda386d25 | ||
|
8f9ef9c9a0 | ||
|
5ff7d712d4 | ||
|
710f83b79d | ||
|
cf01fdd5d7 | ||
|
d6d4a81f8a | ||
|
1bd2ff1866 | ||
|
f054beec54 | ||
|
f931506815 | ||
|
b3d379d188 | ||
|
769879e2a6 | ||
|
9ecab62d40 | ||
|
7c424c28b0 | ||
|
28b16c01cf | ||
|
a62bd922aa | ||
|
629709a51d | ||
|
12973359d0 | ||
|
43c1111530 | ||
|
51e0599536 | ||
|
f01d3ee12c | ||
|
b6d324e06b | ||
|
4e1133b946 | ||
|
c24328ca62 | ||
|
8be33c6544 | ||
|
9fc029ee62 | ||
|
6a2b20ff97 | ||
|
7aa06237b8 | ||
|
b7213bbd59 | ||
|
d63242bd69 | ||
|
2a0bd3bffc | ||
|
3c0d567c37 | ||
|
f4d539007c | ||
|
b3dd9cb836 | ||
|
96f3efbd99 | ||
|
d97ee3244d | ||
|
2157a23a86 | ||
|
3b382f5b38 | ||
|
988e4d8f5e | ||
|
0e7aa6bf9e | ||
|
582a7c9995 | ||
|
ef9974b298 | ||
|
2500ce1011 | ||
|
58350c0055 | ||
|
09c90532e7 | ||
|
953438e466 | ||
|
e5eb0e3347 | ||
|
7d74ea141e | ||
|
130b649a8b | ||
|
11b5093ce4 | ||
|
8467a263f9 | ||
|
a8e8c43a0e | ||
|
4102950a21 | ||
|
03f708090b | ||
|
0c9d4ad788 | ||
|
42951543dd | ||
|
fd0ad0c346 | ||
|
5f403cdc6a | ||
|
022787f806 | ||
|
a23f76e184 | ||
|
acbc5747bc | ||
|
b19793a2ec | ||
|
e919c390e8 | ||
|
11b24ef0d7 | ||
|
1336476233 | ||
|
f3c69cb5a1 | ||
|
3f77ccb9c8 | ||
|
cbb3b6b950 | ||
|
0b1a1bdc30 | ||
|
7bb42e3249 | ||
|
238f5f9544 | ||
|
6f340acfb1 | ||
|
dd1e20b3c2 | ||
|
62f00dad22 | ||
|
2c17d676e4 | ||
|
415fc406d6 | ||
|
3184e44df1 | ||
|
f46c7d1e36 | ||
|
981bf66d5a | ||
|
8c92a9508e | ||
|
45297e6c9b | ||
|
1dccbd1a38 | ||
|
838c730fe6 | ||
|
db7afaee91 | ||
|
970e262949 | ||
|
d933ec115b | ||
|
477b5b7d55 | ||
|
34969dd260 | ||
|
cdb80a281f | ||
|
8fdb4de628 | ||
|
e8a537d28d | ||
|
e495b1009a | ||
|
c403de7bd4 | ||
|
1096a9b04b | ||
|
b4036b52b1 | ||
|
917a7e3f34 | ||
|
7b8f69d7e1 | ||
|
d82ec90f51 | ||
|
8465fd59d3 | ||
|
54c8d5e432 | ||
|
11a04bb4a6 | ||
|
512042eba8 | ||
|
314799a926 | ||
|
3d35a6c243 | ||
|
5eeb088ad6 | ||
|
db463e8e9d | ||
|
dba79765c4 | ||
|
520ba8e306 | ||
|
18b5b14932 | ||
|
f7da805b50 | ||
|
39596c41c8 | ||
|
3abaa281d3 | ||
|
70165fa6e2 | ||
|
ee91d9ef24 | ||
|
58eb8517ad | ||
|
4f173db8b4 | ||
|
0e72e8762a | ||
|
fb008dbe01 | ||
|
7cc7c52670 | ||
|
1b1c58ab32 | ||
|
c4bc1a9498 | ||
|
c05a218a97 | ||
|
b5d1dc94d0 | ||
|
1a24f5fb12 | ||
|
a4037690d9 | ||
|
05db766bee | ||
|
1926702c95 | ||
|
6dc4ac1347 | ||
|
e87ac5ef49 | ||
|
0ccf955674 | ||
|
22c45b7c52 | ||
|
52bf4eba45 | ||
|
aefcc91805 | ||
|
165b5bcd68 | ||
|
e61f3f4ef1 | ||
|
08522341c4 | ||
|
ec87181192 | ||
|
6edd257861 | ||
|
ac55fcb051 | ||
|
7719bc3f71 | ||
|
0a4079ad86 | ||
|
b9bb27e1ff | ||
|
033ba8bb29 | ||
|
5236d47854 | ||
|
d9c8a9cf11 | ||
|
b18c0905ee | ||
|
2081054636 | ||
|
9ca7ece8b3 | ||
|
31a94f7fba | ||
|
df25a5457f | ||
|
4b7bd4c591 | ||
|
9ab2b34dd4 | ||
|
76cf3d35e6 | ||
|
d1abb876f4 | ||
|
76ec17526b | ||
|
367604b2f4 | ||
|
3c06953fd7 | ||
|
04ecdc38cd | ||
|
383d34159d | ||
|
227a133a0a | ||
|
ba0e0e4c6a | ||
|
39ff9769ca | ||
|
166c49c212 | ||
|
722e03bc2e | ||
|
0ede7cad73 | ||
|
4d83ee04f4 | ||
|
dfdba857a6 | ||
|
f2bf043aaa | ||
|
eebef1b3b7 | ||
|
938430741f | ||
|
c15c9fa420 | ||
|
2bb0020675 | ||
|
d5fd86f256 | ||
|
e2ac68a23b | ||
|
68bf712d4f | ||
|
35d167ef3c | ||
|
9102518d29 | ||
|
64a20bea97 | ||
|
3f282f4510 | ||
|
b94836b224 | ||
|
30d62f5e31 | ||
|
2812668bfc | ||
|
809b5a3d2a | ||
|
a2b61de2f6 | ||
|
803ed060ee | ||
|
62391b4ce9 | ||
|
7b4754904e | ||
|
83d5871184 | ||
|
74f44d920a | ||
|
bd06717863 | ||
|
e76496530c | ||
|
e9e2ecab2d | ||
|
927113c83b | ||
|
9f53fd4ba7 | ||
|
f4c845e46b | ||
|
c16f02f776 | ||
|
9cb8974f06 | ||
|
13a0471bfd | ||
|
bf334513b3 | ||
|
f336e30ba1 | ||
|
75e3c2435c | ||
|
f1688ec9da | ||
|
9a24c3546e | ||
|
0f7bccf584 | ||
|
1da2012d93 | ||
|
57faeb782a | ||
|
21200d9fe6 | ||
|
9f197e44b1 | ||
|
1ee1622817 | ||
|
cf02322c98 | ||
|
d241a09afb | ||
|
f5f8c08db9 | ||
|
a0a03b5154 | ||
|
3e599bbc10 | ||
|
a8f59e2eb4 | ||
|
86757f0b47 | ||
|
444260d45e | ||
|
79aab22fca | ||
|
d219119721 | ||
|
0dc9b78a46 | ||
|
a551de0d93 | ||
|
19cbfaa431 | ||
|
6f4e10d6db | ||
|
e9150618ec | ||
|
de200b7e2c | ||
|
cd67efa1b2 | ||
|
4c55f6394f | ||
|
238f903e8d | ||
|
f5cea604a6 | ||
|
65c4f3f2be | ||
|
8a210b9ac0 | ||
|
0d0bfcb457 | ||
|
3eca64f157 | ||
|
0e7add1d75 | ||
|
1774a44ad9 | ||
|
57783adfb5 | ||
|
f26b70cb9f | ||
|
2677286307 | ||
|
e3d468acb9 | ||
|
b68d566439 | ||
|
7f1c89f167 | ||
|
a8c4fe23c4 | ||
|
69f76d0f72 | ||
|
a47241f133 | ||
|
8a5782d704 | ||
|
fca5de51e1 | ||
|
c0b7679aac | ||
|
8ee26529d1 | ||
|
d32a84b5ad | ||
|
6964b5c48c | ||
|
bf1ff540d9 | ||
|
5a3641bfcd | ||
|
c8af26627a | ||
|
343f37b5c0 | ||
|
494f333aba | ||
|
7ef91af84c | ||
|
3b8cee1781 | ||
|
4824924377 | ||
|
24eac4caf3 | ||
|
140446cd59 | ||
|
671b0cea51 | ||
|
19a8768365 | ||
|
9ac155bf0b | ||
|
6cda306da1 | ||
|
f0064ac3af | ||
|
e21b203911 | ||
|
e18a5f813c | ||
|
586b4a104b | ||
|
c966204049 | ||
|
792ebb6374 | ||
|
fc4a132c0e | ||
|
039bdb4d3e | ||
|
176016387f | ||
|
07c8e5e59b | ||
|
0d23c447d6 | ||
|
470206ba7f | ||
|
9ab389c01b | ||
|
12dd064a18 | ||
|
f6f3cc7ead | ||
|
c8e30482fd | ||
|
86a0f84470 | ||
|
e93bc6309b | ||
|
5496c763aa | ||
|
31d3eeb103 | ||
|
9ab18fec82 | ||
|
f193b945ea | ||
|
152e37cc5a | ||
|
dbc4e3675f | ||
|
5678ebb42b | ||
|
d2a0f379d5 | ||
|
fe73e9cd89 | ||
|
6eb4079475 | ||
|
6de7c084db | ||
|
56c717aafa | ||
|
d6bee54c45 | ||
|
134fbd552c | ||
|
e1eef3a8b0 | ||
|
7861b24dc9 | ||
|
70586d4e3a | ||
|
f966093f5b | ||
|
8d0564deaf | ||
|
21e6ef7522 | ||
|
c13377153f | ||
|
5914128871 | ||
|
7f4eca4cc2 | ||
|
b600f253b3 | ||
|
15b25045e6 | ||
|
8f0722434b | ||
|
2aee08c0b6 | ||
|
4bfd668e5e | ||
|
f304308e1c | ||
|
3f5b1b9132 | ||
|
3497fd5c26 | ||
|
a1bd79c514 | ||
|
2b1a5b8c61 | ||
|
6c9f218bc0 | ||
|
aa1bce0e5e | ||
|
3930d1791a | ||
|
b97243dea3 | ||
|
cfe165140a | ||
|
e8034b534a | ||
|
cc2db6ebfb | ||
|
92ab049719 | ||
|
05e57cc9ce | ||
|
16d97fa601 | ||
|
6676162f64 | ||
|
e2ae0bed29 | ||
|
92288f4334 | ||
|
b09ada6edc | ||
|
f0b97e165e | ||
|
ccc269756f | ||
|
283ab9437a | ||
|
b4d7b9d2b5 | ||
|
76323c3145 | ||
|
54aeed7e00 | ||
|
e7abb94d1f | ||
|
2a09527ebc | ||
|
2fbc5ff0a5 | ||
|
34d505123e | ||
|
21a9b605b8 | ||
|
ff36b2550f | ||
|
a81a650da1 | ||
|
ff0ffe5999 | ||
|
2818fda9bc | ||
|
4f89e4b3e8 | ||
|
0b36dea3f8 | ||
|
0a4019ec9d | ||
|
57a6ee3461 | ||
|
f8264e1303 | ||
|
ac03c339de | ||
|
4b0a622635 | ||
|
a708536dce | ||
|
dc443e4437 | ||
|
b1567b2e15 | ||
|
72c5afd0b4 | ||
|
bf25f27e00 | ||
|
3129ed374c | ||
|
43f3cfce19 | ||
|
5c9f151e0c | ||
|
632574ced1 | ||
|
bd10d4e201 | ||
|
ad3bafa7d5 | ||
|
47f44097eb | ||
|
b57911c84c | ||
|
0223898f3e | ||
|
81ab97b7b9 | ||
|
64706ef761 | ||
|
54cd0d9b2f | ||
|
62044aa99b | ||
|
df1c7e91b4 | ||
|
11d8abcba2 | ||
|
fa2b212d61 | ||
|
3ca7326b37 | ||
|
dac2fc8146 | ||
|
b4be5f05dd | ||
|
7f0890776e | ||
|
16779ede2d | ||
|
07c0c2eb0a | ||
|
9c733f0b90 | ||
|
a21a3438f7 | ||
|
a72d552f19 | ||
|
1f026ababf | ||
|
a7d3d4e7c4 | ||
|
a69eac7578 | ||
|
524a15c1fa | ||
|
8db39c60cd | ||
|
4dbebc2d10 | ||
|
60b519456c | ||
|
0903042b66 | ||
|
2189c71026 | ||
|
7b126978e1 | ||
|
2d1138a1a8 | ||
|
708620d29d | ||
|
57c84113a1 | ||
|
b7a446f224 | ||
|
a744199470 | ||
|
cc070e9e0c | ||
|
5621d81edf | ||
|
48b919cb14 | ||
|
e9eeb0ad2b | ||
|
b55b6d33e4 | ||
|
35d9b7ea2d | ||
|
ef01d63ef3 | ||
|
57ebb2994d | ||
|
d0efa681b6 | ||
|
17702186b5 | ||
|
deee7a100b | ||
|
73d6d41de0 | ||
|
b63a49e056 | ||
|
2f06e5af47 | ||
|
ad629b5c5a | ||
|
b5cd30a79b | ||
|
9dd964f5e5 | ||
|
a332ffb6ef | ||
|
499b0d5fa5 | ||
|
f753c36209 | ||
|
43613b2fe8 | ||
|
0e31124877 | ||
|
a658ed30e5 | ||
|
29ae55a0b8 | ||
|
1a6c837638 | ||
|
8079d4dc4f | ||
|
247a0fc65e | ||
|
2434f6f206 | ||
|
86d41c077e | ||
|
1783b099d3 | ||
|
3afa0a2096 | ||
|
a63b086e69 | ||
|
d4eef3fe7c | ||
|
826527c9db | ||
|
a64b944942 | ||
|
101f4c7892 | ||
|
5299568ce6 | ||
|
daa6cd8763 | ||
|
4092f1d397 | ||
|
cabd96ad03 | ||
|
d372ab585a | ||
|
916f90baa5 | ||
|
86de090b99 | ||
|
5f6ecaa398 | ||
|
82c07f2cc7 | ||
|
182122914c | ||
|
ecc79b092e | ||
|
483d3bb716 | ||
|
96e1d337e0 | ||
|
5a17629902 | ||
|
b807174fec | ||
|
2d9d605714 | ||
|
ee582858c4 | ||
|
f4dfec6ca1 | ||
|
2306555bf9 | ||
|
a85ae8d964 | ||
|
fdfbf1fdab | ||
|
b06a007b64 | ||
|
892787fed5 | ||
|
6d2baf9dfb | ||
|
532bd4ec38 | ||
|
76fda1def3 | ||
|
7012cb73c4 | ||
|
2a7e1e890d | ||
|
2f44d77c68 | ||
|
74a3eb975d | ||
|
d020ac55b6 | ||
|
3d97733f44 | ||
|
91a03f78ba | ||
|
86a2f3c439 | ||
|
4a6ed7e46a | ||
|
6bec5a66ea | ||
|
00aa71ce20 | ||
|
d40965b987 | ||
|
6f219bef55 | ||
|
630df8c86e | ||
|
9bf7291d63 | ||
|
4cfb28f12a | ||
|
f3da13461c | ||
|
0c901fcc20 | ||
|
efc39e65e5 | ||
|
1a49e2aa3c | ||
|
8a5727c7a8 | ||
|
c411566fad | ||
|
f5508a91e3 | ||
|
fab6285a73 | ||
|
03951e5645 | ||
|
fd5f347c84 | ||
|
2759e42fbc | ||
|
58771f4b2d | ||
|
3b4b49cf00 | ||
|
4352d115c4 | ||
|
5576b17363 | ||
|
12a50c9ce1 | ||
|
753fd319e2 | ||
|
c43ff5188d | ||
|
3974aa539e | ||
|
38a9afd0fb | ||
|
35a4b63247 | ||
|
dab96cf02e | ||
|
63e155f24d | ||
|
676084303d | ||
|
bfefdc2c49 | ||
|
4f4afcd288 | ||
|
0d7fec9f79 | ||
|
b8c5ba2337 | ||
|
94f905b3bf | ||
|
a298a84478 | ||
|
f3c11224b5 | ||
|
deea4e58b0 | ||
|
88f3d734f5 | ||
|
050b2ba27d | ||
|
17b2d64ced | ||
|
4a4aeaa446 | ||
|
f8e68587e2 | ||
|
a9302b89a9 | ||
|
c040831cf9 | ||
|
68ee42c991 | ||
|
82d15dc6c1 | ||
|
3599f5479d | ||
|
2e55b0cd9e | ||
|
e10c776487 | ||
|
4348c72ad0 | ||
|
6b7dde7cdd | ||
|
d10b8dc5d8 | ||
|
fec018624c | ||
|
7217263514 | ||
|
4c8486fd72 | ||
|
c1a7a50f67 | ||
|
be2c927d7c | ||
|
0b469caff6 | ||
|
0797989c5d | ||
|
a409f4b67d | ||
|
50e1432a40 | ||
|
f96517f4d0 | ||
|
ef05955996 | ||
|
a6f8946bc9 | ||
|
e846797662 | ||
|
d2cb6e67a4 | ||
|
97ab54c1b1 | ||
|
7c41ec47ca | ||
|
27b1a840e4 | ||
|
c63905aba7 | ||
|
9276e0d2b9 | ||
|
3f7af17c6b | ||
|
e189e01af2 | ||
|
5f76c3e471 | ||
|
d2998af211 | ||
|
ad6816c319 | ||
|
d932199d39 | ||
|
dbfbaedb21 | ||
|
f16b05a13b | ||
|
3e130e40fc | ||
|
0023e35cf4 | ||
|
b953265a27 | ||
|
7fda517c3d | ||
|
44a53a3bdd | ||
|
cb8349f01a | ||
|
c477b2783f | ||
|
149ed8e421 | ||
|
f674fa9cde | ||
|
55fda68a80 | ||
|
1f29de4d20 | ||
|
4fe2678411 | ||
|
75942a52ae | ||
|
580a6b616b | ||
|
c37cbc030d | ||
|
299c44cd4f | ||
|
c2e7be4055 | ||
|
2520182122 | ||
|
07c721fea7 | ||
|
fae5c1464d | ||
|
5aa8018639 | ||
|
9fdc70af6b | ||
|
cf17156d7d | ||
|
e23f8f52fd | ||
|
cc3620f304 | ||
|
fd306d1dbc | ||
|
bec9104201 | ||
|
6b27c11690 | ||
|
2b80269d98 | ||
|
ccca1c2d5d | ||
|
b22ac35b75 | ||
|
96047b6663 | ||
|
10460942ff | ||
|
f53f449f15 | ||
|
cec82a64cf | ||
|
12e860a1e8 | ||
|
e510326245 | ||
|
f3801cf26c | ||
|
432e4acd87 | ||
|
3dd47f9544 | ||
|
6d2ce5fd5c | ||
|
5a2574a82e | ||
|
9a9b33b3d6 | ||
|
102cafedad | ||
|
57bcfc3b06 | ||
|
6a608255bb | ||
|
352eabdcd5 | ||
|
88da06ca76 | ||
|
d983b102b3 | ||
|
7bed7ae6c5 | ||
|
3571fc906f | ||
|
d74e932681 | ||
|
b6b2de8848 | ||
|
ab9d790901 | ||
|
de327f7d8a | ||
|
daf8f642f3 | ||
|
eddcba40b5 | ||
|
c3001cb744 | ||
|
818bc9596d | ||
|
77228269e7 | ||
|
3f0c788a5f | ||
|
b328bb54c6 | ||
|
75628d27c0 | ||
|
3b0de44759 | ||
|
c3ca70669e | ||
|
2268920afc | ||
|
55637a2894 | ||
|
2b4b8013fe | ||
|
c248802e40 | ||
|
449eb01a8d | ||
|
76191052fd | ||
|
237c966396 | ||
|
7456990e8e | ||
|
40004ff9d5 | ||
|
691b178667 | ||
|
3ef2071927 | ||
|
ec30a4a0c3 | ||
|
22130dcd98 | ||
|
85021f8cf2 | ||
|
7b005f344e | ||
|
355515a06a | ||
|
4a2e1000a1 | ||
|
3115377bf0 | ||
|
bf9230a9f3 | ||
|
69218d5d28 | ||
|
5d8d8b5148 | ||
|
ec0b54849b | ||
|
267a92fef3 | ||
|
c1e662101a | ||
|
28eeb08d86 | ||
|
79a705fbaf | ||
|
b429959bb6 | ||
|
411b3ff6dd | ||
|
0531f61376 | ||
|
5b56c52b5c | ||
|
33438f7354 | ||
|
414cd2a4d5 | ||
|
c8ea48bdf9 | ||
|
a13dfc769b | ||
|
52e09dcd7a | ||
|
0fdd466c75 | ||
|
10b4c8f3b7 | ||
|
2b175eeb6a | ||
|
f06941cc46 | ||
|
c63ef58698 | ||
|
2aac8bb7ef | ||
|
56530dec11 | ||
|
62fa37fe7b | ||
|
af74efe494 | ||
|
79f2734e5a | ||
|
4adc364c75 | ||
|
091b6a1197 | ||
|
949b8a3d97 | ||
|
4a68176cb5 | ||
|
b83d0a6438 | ||
|
82bfd2e86d | ||
|
d50d9e5549 | ||
|
e1c7f9b4e5 | ||
|
9ac8c85d50 | ||
|
0015a4e0a8 | ||
|
0a707eb258 | ||
|
b909b4ad09 | ||
|
589d51df26 | ||
|
b422b0fcf9 | ||
|
906242343f | ||
|
dc39554d58 | ||
|
497ac7b6d7 | ||
|
6a890db161 | ||
|
bbaa00dd01 | ||
|
2aa107c0aa | ||
|
7bc8b1d9f4 | ||
|
d3febfd9ad | ||
|
84338c0d49 | ||
|
b1b89f9009 | ||
|
f1d1c337e7 | ||
|
63c50d3ff2 | ||
|
de463163d9 | ||
|
54cddc3ad4 | ||
|
2dbed52506 | ||
|
b24306f15d | ||
|
8a57673316 | ||
|
c28e376edc | ||
|
85589ddbf6 | ||
|
1193aa2dfb | ||
|
42af706dfb | ||
|
c9b7c6e0cc | ||
|
b360b0b589 | ||
|
1f54eaa725 | ||
|
bd676f080a | ||
|
96b8b5fd10 | ||
|
f78b937c95 | ||
|
d4ac53aa91 | ||
|
c09dbc92e9 | ||
|
6fb09da89f | ||
|
a4b7aa362d | ||
|
33189f0527 | ||
|
007a95055b | ||
|
45b1612659 | ||
|
017564d637 | ||
|
5b3c682d91 | ||
|
17a02163bd | ||
|
312ef7a0a4 | ||
|
0dbd356983 | ||
|
dc1118fa0d | ||
|
5816bd3eab | ||
|
5751d60821 | ||
|
13136cc311 | ||
|
742dafd2cc | ||
|
103fa647d1 | ||
|
ba79becd55 | ||
|
49a2d8cbf5 | ||
|
55c05427b9 | ||
|
336da55ca8 | ||
|
7f25ddbc03 | ||
|
929804b172 | ||
|
e95b44c90e | ||
|
862ea6e836 | ||
|
ae35314e7b | ||
|
8542fc5f95 | ||
|
76b3d45b75 | ||
|
f4b7b473b4 | ||
|
a867f3a704 | ||
|
6777e67383 | ||
|
8cc5590eab | ||
|
1aa1ec4574 | ||
|
541a077bd1 | ||
|
ce37f45955 | ||
|
5b39832e18 | ||
|
ee67067f17 | ||
|
7e5c603cba | ||
|
21320ef669 | ||
|
7709988dd8 | ||
|
772c5bb8dc | ||
|
5801910013 | ||
|
59c48c9314 | ||
|
5302bd81d9 | ||
|
b66056ef21 | ||
|
e73d1bf96a | ||
|
7b6cbe0a81 | ||
|
196be601f9 | ||
|
71082d3d1b | ||
|
fdcea7ff6f | ||
|
1552050ce7 | ||
|
6ecdda71fe | ||
|
a2da72b2ca | ||
|
c712ce2bb1 | ||
|
7438a85bf1 | ||
|
6062002bd5 | ||
|
14a731096d | ||
|
9dd14fc91c | ||
|
079a58276b | ||
|
13d9e8ec98 | ||
|
45920941d9 | ||
|
d463c56ddd | ||
|
c095122d4b | ||
|
7935be0fbd | ||
|
e910f076ad | ||
|
6612ff8561 | ||
|
15c596aeeb | ||
|
ae8272ef78 | ||
|
9ec2cc1f31 | ||
|
de9e5b7dc7 | ||
|
ee1f8262b8 | ||
|
f129b1f06f | ||
|
c63a10ecb7 | ||
|
ab5ab2f603 | ||
|
195f011973 | ||
|
8ed8568922 | ||
|
b451c69088 | ||
|
45e3842970 | ||
|
a6c0418651 | ||
|
e6ea1464a8 | ||
|
4de8d61bce | ||
|
b819388772 | ||
|
5711ff4d0b | ||
|
b47575801e | ||
|
3a72ec71cd | ||
|
f14fff5135 | ||
|
38f6d78c3b | ||
|
5fe5b6f94f | ||
|
740e3bb634 | ||
|
2e2db65e39 | ||
|
b2d0ed20fd | ||
|
9006967c8d | ||
|
deb01dfd7f | ||
|
c67bf628c8 | ||
|
26bf034a59 | ||
|
7b6c8b30a5 | ||
|
d250d408cf | ||
|
b04cf355a0 | ||
|
0fa1217726 | ||
|
e366a41ef0 | ||
|
51941f7558 | ||
|
3ebe1ff5c9 | ||
|
8d2691c3d5 | ||
|
5d8b5d171c | ||
|
d59c5a20f8 | ||
|
90ad4b3b34 | ||
|
c039fa7ff0 | ||
|
4d30352445 | ||
|
7a6e6ae933 | ||
|
41d8bb3038 | ||
|
759e3c6d21 | ||
|
557dede8a6 | ||
|
ec37fd9c1f | ||
|
e35a746cf5 | ||
|
ce306e48eb | ||
|
69ddfee1c3 | ||
|
b2b8def4e3 | ||
|
fd5fc4bbb7 | ||
|
0e7147fe75 | ||
|
7f1861be2b | ||
|
e07d27e24d | ||
|
2a68abf6ee | ||
|
c802f8935c | ||
|
79dcaf7054 | ||
|
64ef0dd1d3 | ||
|
1203eba58e | ||
|
2722856a87 | ||
|
8b8ae609a7 | ||
|
04eacd3943 | ||
|
64bccda534 | ||
|
21ee379407 | ||
|
61be49e0f7 | ||
|
2686468c43 | ||
|
adf070ff56 | ||
|
8c06c53b58 | ||
|
a124cd4ef9 | ||
|
d5efc875ef | ||
|
2b20a34fd5 | ||
|
f6df289a1c | ||
|
7594c5bfe2 | ||
|
66bce05f6d | ||
|
d8ef774346 | ||
|
2ccefa32a6 | ||
|
9afcd48a94 | ||
|
e81a81e584 | ||
|
e139829dd6 | ||
|
b2bbe3df54 | ||
|
8cf2bdfcfb | ||
|
a50b65ce22 | ||
|
0077c22f6d | ||
|
30631f0a26 | ||
|
0f1d7477c0 | ||
|
06544455d0 | ||
|
67484aed69 | ||
|
ea3a12d970 | ||
|
b7b8872031 | ||
|
b928eb44d5 | ||
|
d4d7c9ad5f | ||
|
9c703bc0f1 | ||
|
2c354252be | ||
|
f5a6e1bab5 | ||
|
f4e3ce5f53 | ||
|
b95908e043 | ||
|
504ae26b80 | ||
|
26210f9436 | ||
|
8eb79b5f4f | ||
|
202fb22be6 | ||
|
d39f8d88ec | ||
|
11b15336f0 | ||
|
d706f8fec2 | ||
|
ade62c18f4 | ||
|
19914edc5a | ||
|
a19b648952 | ||
|
d2b998fbdc | ||
|
7c3b2892ea | ||
|
d9822304ce | ||
|
34819f2cac | ||
|
f2dc28f0b6 | ||
|
cca9cd3dd6 | ||
|
707c71a01b | ||
|
3053183d41 | ||
|
2fe8edfe55 | ||
|
e2289d19d8 | ||
|
2ddacfb6b8 | ||
|
c82ab4d8c1 | ||
|
d25b803e51 | ||
|
7b28310008 | ||
|
85a678bf76 | ||
|
965292135b | ||
|
ffdde9d719 | ||
|
2527723de9 | ||
|
94e0a7bddb | ||
|
b2f7ee2ded | ||
|
ca78281c25 | ||
|
1832eb15aa | ||
|
dc453b5164 | ||
|
7c0ad2c338 | ||
|
e5efcf8be8 | ||
|
053e878bfb | ||
|
91415a36ae | ||
|
c1e126b119 | ||
|
b878648967 | ||
|
47d20b54f9 | ||
|
c411b485b6 | ||
|
39de741e2d | ||
|
5220bd211d | ||
|
ac0a286f4d | ||
|
d1050b9dff | ||
|
2f88bd3a12 | ||
|
1436aea4d5 | ||
|
7c7184e201 | ||
|
111f2228dd | ||
|
45ce0a67bb | ||
|
bcdcc4160d | ||
|
a550d468a6 | ||
|
e7108d0e96 | ||
|
731c67e1d7 | ||
|
7c34237831 | ||
|
2b16a4fb91 | ||
|
40b0b23ed3 | ||
|
429309e0c6 | ||
|
7c2a6033c1 | ||
|
f9f4fb2329 | ||
|
deba54761a | ||
|
8e875037bf | ||
|
ed7f7c9168 | ||
|
098307e082 | ||
|
db52c7f755 | ||
|
4a9d411662 | ||
|
e3b855f283 | ||
|
ea85f0fe13 | ||
|
78bc3bdd2a | ||
|
e35dd32821 | ||
|
4ec586b9f6 | ||
|
902e76de19 | ||
|
f9c9215b55 | ||
|
18908e6131 | ||
|
9b8507cabe | ||
|
12710fe93b | ||
|
dc8fe5ec95 | ||
|
237295f46d | ||
|
79d49e162e | ||
|
8874fa199d | ||
|
d0e2f8232a | ||
|
e3917e22e7 | ||
|
9c721071d3 | ||
|
c69fc80c80 | ||
|
792433088c | ||
|
fe2d81892f | ||
|
c8f46130f8 | ||
|
9607597a74 | ||
|
2863ba97ca | ||
|
1871d28eaf | ||
|
96e1cba5c1 | ||
|
586fda4800 | ||
|
4a1aee13d8 | ||
|
e905fbb05a | ||
|
ca56749b0e | ||
|
47719926e8 | ||
|
c49ca4a29e | ||
|
5f289f3ae3 | ||
|
87000d7708 | ||
|
917e98f3e5 | ||
|
9c7da8d804 | ||
|
a1878955b2 | ||
|
c5b3a56e4f | ||
|
1d2482e1e3 | ||
|
a4a582e180 | ||
|
dfafa8e453 | ||
|
f0f3f5aae7 | ||
|
c057347977 | ||
|
c30c40d6c6 | ||
|
9944508e85 | ||
|
60fa40be45 | ||
|
df790cd6b3 | ||
|
9deb937076 | ||
|
d7d30e8f21 | ||
|
d5744ecba8 | ||
|
c97fee87f0 | ||
|
1939fc9569 | ||
|
365dced2c3 | ||
|
76a1ce4d5f | ||
|
99f84ff473 | ||
|
3019f1bbab | ||
|
854462bd34 | ||
|
69877614fd | ||
|
ef9a059cdb | ||
|
bb1bba3d77 | ||
|
4c7ce0d285 | ||
|
e1e7306b54 | ||
|
455b0347a7 | ||
|
466ebdd2e0 | ||
|
4c495e5e3d | ||
|
a92559671a | ||
|
22c3b5a865 | ||
|
8c8867c5da | ||
|
f826b20811 | ||
|
a7b35aae13 | ||
|
aab6bb3d32 | ||
|
c974257821 | ||
|
d6e6337cd6 | ||
|
8c1b1fe634 | ||
|
fd42dcb1fc | ||
|
d939a25d41 | ||
|
45137bca2f | ||
|
77dcd03ecf | ||
|
f331310a10 | ||
|
5948ec3647 | ||
|
48452993ad | ||
|
b5d4a35d90 | ||
|
d79df34beb | ||
|
4050c873b5 | ||
|
15e635d1b5 | ||
|
b0a03ca4a9 | ||
|
c1f2287635 | ||
|
e13e53cb2f | ||
|
0f4cdad25b | ||
|
b258f12889 | ||
|
6f9e83f757 | ||
|
939c2355da | ||
|
c8594a5311 | ||
|
91b772ab62 | ||
|
e7663fdd82 | ||
|
1bc232aae3 | ||
|
bb146ce32d | ||
|
9a95d11023 | ||
|
2f6f3329ad | ||
|
b80c17b62d | ||
|
242dcfe30f | ||
|
ae8acce8ae | ||
|
04714cef46 | ||
|
1d66480aa4 | ||
|
bed990aae6 | ||
|
e7e8ea27d4 | ||
|
87a34ca0cf | ||
|
8b76f23534 | ||
|
c9ec74a198 | ||
|
5a2411784b | ||
|
f079e9b450 | ||
|
6254037223 | ||
|
bd5ec03d87 | ||
|
2f286930a8 | ||
|
305fd6bee0 | ||
|
99325a8b65 | ||
|
6893865b30 | ||
|
4fdf843c75 | ||
|
37a33f02aa | ||
|
90246a6d9f | ||
|
6ef5797447 | ||
|
91a978ce7e | ||
|
36b561623a | ||
|
11a4af85a4 | ||
|
2108698346 | ||
|
f10a112f08 | ||
|
7e43d3e086 | ||
|
785cfd3305 | ||
|
f2400e06db | ||
|
e0c23cba5e | ||
|
b21c6794de | ||
|
9a7509e465 | ||
|
c6770f4b88 | ||
|
26aa241d2f | ||
|
f8d0501ded | ||
|
47bd85e9f9 | ||
|
d881c6ddf5 | ||
|
77e9b3a7c6 | ||
|
7d78a86ecf | ||
|
fb759b8b73 | ||
|
e40fefafa9 | ||
|
a7fcab7aa3 | ||
|
43b3840873 | ||
|
978d428ec3 | ||
|
6ed6abd6c1 | ||
|
4225a464c6 | ||
|
f22feb0e3b | ||
|
ba4ae92234 | ||
|
782d018703 | ||
|
19ee56c4b3 | ||
|
769e63999f | ||
|
f17ef10e63 | ||
|
a5e36ad9bc | ||
|
018a962d92 | ||
|
3e958e93ce | ||
|
e2d7b4950b | ||
|
de62ccbf4f | ||
|
ce15936f2f | ||
|
12e65fd258 | ||
|
1e33479b39 | ||
|
9454d1ebcb | ||
|
f995f8672b | ||
|
6d2777d85f | ||
|
37bd08176c | ||
|
2dd7dd3952 | ||
|
7b2022d39e | ||
|
74addfeab6 | ||
|
28b2df475f | ||
|
bfaf7c8b9e | ||
|
25cf58a163 | ||
|
71c3c9c0c4 | ||
|
30400318a2 | ||
|
5ece2ad36c | ||
|
b4da6c29f1 | ||
|
80e67bcb23 | ||
|
942c9bd357 | ||
|
f09dbf20b9 | ||
|
06a326caf1 | ||
|
862e814de4 | ||
|
55f47d2299 | ||
|
8456785986 | ||
|
2c467c9be2 | ||
|
1d3e89f349 | ||
|
bf02d73e74 | ||
|
8583b57c5c | ||
|
6a8e9ad24b | ||
|
76602f45dc | ||
|
27de86ae41 | ||
|
b9dd64b80e | ||
|
6073bf6cd8 | ||
|
06fa1f1931 | ||
|
0569c52b15 | ||
|
60d55c4156 | ||
|
2a49c19b9e | ||
|
4932f05a00 | ||
|
606340fba3 | ||
|
c806b76865 | ||
|
b3685956d2 | ||
|
282122ec5f | ||
|
c49cb8f30e | ||
|
4cc1458dbe | ||
|
22873f58c4 | ||
|
691c5f7762 | ||
|
7a8c037e9e | ||
|
235ff9fcd1 | ||
|
96e006b37e | ||
|
72ab552554 | ||
|
653113412f | ||
|
1ad5182500 | ||
|
20775950c6 | ||
|
0875443f7e | ||
|
422e5d2f7f | ||
|
2273799677 | ||
|
9e950cda6a | ||
|
8b4bb94f64 | ||
|
f86de75862 | ||
|
bd298d7593 | ||
|
8ab8fbc016 | ||
|
b8675deaa8 | ||
|
499c4608b1 | ||
|
442e46d3b6 | ||
|
c7d5b046d9 | ||
|
445c39f757 | ||
|
259c184c8f | ||
|
c214128a38 | ||
|
1ce6ceb75b | ||
|
2ea0a0a414 | ||
|
4a1899dd79 | ||
|
dc430ccf3f | ||
|
cc5a67269e | ||
|
b0f1b1c5fd | ||
|
f57040b038 | ||
|
46b4606ba2 | ||
|
d60915b751 | ||
|
7ea7f9c077 | ||
|
c0cd26f43c | ||
|
f2a7e24e38 | ||
|
fdeff3fdae | ||
|
79019c7a42 | ||
|
f334c5a41d | ||
|
542cba73d2 | ||
|
e3e47d7963 | ||
|
ac6388add4 | ||
|
60d8bb9f28 | ||
|
89f7ed8b29 | ||
|
010753b7e7 | ||
|
bda3546c55 | ||
|
f4e72cf9d6 | ||
|
c19d18136e | ||
|
6f501a7c9b | ||
|
6c80564b89 | ||
|
3b69fcf5f8 | ||
|
2fa89c8e11 | ||
|
a4867dea2a | ||
|
f108178c56 | ||
|
2906e572c6 | ||
|
ebbc8ab2cd | ||
|
4d5f39cd22 | ||
|
610d8073f2 | ||
|
dcd3d63f4f | ||
|
d96df7e993 | ||
|
cf7c650592 | ||
|
6c7d6d4a5e | ||
|
d248516b3a | ||
|
851785ea67 | ||
|
a7cf2c5664 | ||
|
4473834e7d | ||
|
edf8bc6d24 | ||
|
81d71fb86e | ||
|
c5e805ffe1 | ||
|
b6bc203375 | ||
|
e3ee8c8dbd | ||
|
63fddc98e0 | ||
|
12e33dca4c | ||
|
b170806518 | ||
|
3b3f882288 | ||
|
cdda3f74a1 | ||
|
5d34cc49d5 | ||
|
f0fe55bca4 | ||
|
9f3eda177a | ||
|
5b5f10d746 | ||
|
52e2dabc0f | ||
|
28152333bc | ||
|
cb0d24637d | ||
|
cae735f613 | ||
|
0f11537548 | ||
|
443300be46 | ||
|
dc995ce906 | ||
|
b04453d36b | ||
|
77d5fa8024 | ||
|
ae12188cf8 | ||
|
6a3e9576b8 | ||
|
537a724421 | ||
|
212a2b9bb8 | ||
|
08293e43da | ||
|
94e465e5cb | ||
|
a82bad9730 | ||
|
b9af5037b2 | ||
|
ab77b6031b | ||
|
80e67af9af | ||
|
8b15024dc7 | ||
|
82f7e315d6 |
@@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) Microsoft Corporation.
|
# Copyright (c) Microsoft Corporation.
|
||||||
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
||||||
|
# Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
##
|
##
|
||||||
trigger:
|
trigger:
|
||||||
@@ -17,5 +18,5 @@ jobs:
|
|||||||
parameters:
|
parameters:
|
||||||
tool_chain_tag: 'GCC5'
|
tool_chain_tag: 'GCC5'
|
||||||
vm_image: 'ubuntu-latest'
|
vm_image: 'ubuntu-latest'
|
||||||
arch_list: "IA32,X64,ARM,AARCH64,RISCV64"
|
arch_list: "IA32,X64,ARM,AARCH64,RISCV64,LOONGARCH64"
|
||||||
|
|
||||||
|
@@ -27,7 +27,7 @@ steps:
|
|||||||
|
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: '3.7.x'
|
versionSpec: '>=3.10.6'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
|
|
||||||
- script: |
|
- script: |
|
||||||
|
@@ -16,5 +16,5 @@ jobs:
|
|||||||
- template: templates/pr-gate-build-job.yml
|
- template: templates/pr-gate-build-job.yml
|
||||||
parameters:
|
parameters:
|
||||||
tool_chain_tag: 'VS2019'
|
tool_chain_tag: 'VS2019'
|
||||||
vm_image: 'windows-latest'
|
vm_image: 'windows-2019'
|
||||||
arch_list: "IA32,X64"
|
arch_list: "IA32,X64"
|
||||||
|
@@ -42,7 +42,7 @@ steps:
|
|||||||
|
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: "3.8.x"
|
versionSpec: ">=3.10.6"
|
||||||
architecture: "x64"
|
architecture: "x64"
|
||||||
|
|
||||||
- script: pip install -r pip-requirements.txt --upgrade
|
- script: pip install -r pip-requirements.txt --upgrade
|
||||||
|
@@ -17,10 +17,14 @@ parameters:
|
|||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
- job: Build_${{ parameters.tool_chain_tag }}
|
- job: Build_${{ parameters.tool_chain_tag }}
|
||||||
|
timeoutInMinutes: 120
|
||||||
#Use matrix to speed up the build process
|
#Use matrix to speed up the build process
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
${{ if eq(parameters.tool_chain_tag, 'GCC5') }}:
|
||||||
|
TARGET_GCC_ONLY:
|
||||||
|
Build.Pkgs: 'EmbeddedPkg'
|
||||||
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_ARM_ARMPLATFORM:
|
TARGET_ARM_ARMPLATFORM:
|
||||||
Build.Pkgs: 'ArmPkg,ArmPlatformPkg'
|
Build.Pkgs: 'ArmPkg,ArmPlatformPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
@@ -35,24 +39,30 @@ jobs:
|
|||||||
Build.Targets: 'RELEASE,NO-TARGET'
|
Build.Targets: 'RELEASE,NO-TARGET'
|
||||||
TARGET_NETWORK:
|
TARGET_NETWORK:
|
||||||
Build.Pkgs: 'NetworkPkg,RedfishPkg'
|
Build.Pkgs: 'NetworkPkg,RedfishPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_OTHER:
|
TARGET_OTHER:
|
||||||
Build.Pkgs: 'PcAtChipsetPkg,ShellPkg,StandaloneMmPkg'
|
Build.Pkgs: 'PcAtChipsetPkg,PrmPkg,ShellPkg,SourceLevelDebugPkg,StandaloneMmPkg,SignedCapsulePkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_FMP_FAT_TEST:
|
TARGET_FMP_FAT_TEST:
|
||||||
Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg'
|
Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_CRYPTO:
|
TARGET_CRYPTO:
|
||||||
Build.Pkgs: 'CryptoPkg'
|
Build.Pkgs: 'CryptoPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
|
TARGET_FSP:
|
||||||
|
Build.Pkgs: 'IntelFsp2Pkg,IntelFsp2WrapperPkg'
|
||||||
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_SECURITY:
|
TARGET_SECURITY:
|
||||||
Build.Pkgs: 'SecurityPkg'
|
Build.Pkgs: 'SecurityPkg'
|
||||||
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
|
TARGET_UEFIPAYLOAD:
|
||||||
|
Build.Pkgs: 'UefiPayloadPkg'
|
||||||
|
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
|
||||||
TARGET_PLATFORMS:
|
TARGET_PLATFORMS:
|
||||||
# For Platforms only check code. Leave it to Platform CI
|
# For Platforms only check code. Leave it to Platform CI
|
||||||
# to build them.
|
# to build them.
|
||||||
Build.Pkgs: 'ArmVirtPkg,EmulatorPkg,OvmfPkg'
|
Build.Pkgs: 'ArmVirtPkg,EmulatorPkg,OvmfPkg'
|
||||||
Build.Targets: 'NO-TARGET'
|
Build.Targets: 'NO-TARGET,NOOPT'
|
||||||
|
|
||||||
workspace:
|
workspace:
|
||||||
clean: all
|
clean: all
|
||||||
|
@@ -20,7 +20,7 @@ steps:
|
|||||||
|
|
||||||
- task: UsePythonVersion@0
|
- task: UsePythonVersion@0
|
||||||
inputs:
|
inputs:
|
||||||
versionSpec: '3.8.x'
|
versionSpec: '>=3.10.6'
|
||||||
architecture: 'x64'
|
architecture: 'x64'
|
||||||
|
|
||||||
- script: pip install -r pip-requirements.txt --upgrade
|
- script: pip install -r pip-requirements.txt --upgrade
|
||||||
|
@@ -17,6 +17,6 @@ steps:
|
|||||||
#checkLatest: false # Optional
|
#checkLatest: false # Optional
|
||||||
condition: and(gt(variables.pkg_count, 0), succeeded())
|
condition: and(gt(variables.pkg_count, 0), succeeded())
|
||||||
|
|
||||||
- script: npm install -g cspell
|
- script: npm install -g cspell@5.20.0
|
||||||
displayName: 'Install cspell npm'
|
displayName: 'Install cspell npm'
|
||||||
condition: and(gt(variables.pkg_count, 0), succeeded())
|
condition: and(gt(variables.pkg_count, 0), succeeded())
|
||||||
|
29
.github/codeql/codeql-config.yml
vendored
Normal file
29
.github/codeql/codeql-config.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
## @file
|
||||||
|
# CodeQL configuration file for edk2.
|
||||||
|
#
|
||||||
|
# Copyright (c) Microsoft Corporation.
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
##
|
||||||
|
|
||||||
|
name: "CodeQL config"
|
||||||
|
|
||||||
|
# The following line disables the default queries. This is used because we want to enable on query at a time by
|
||||||
|
# explicitly specifying each query in a "queries" array as they are enabled.
|
||||||
|
#
|
||||||
|
# See the following for more information about adding custom queries:
|
||||||
|
# https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-a-custom-configuration-file
|
||||||
|
|
||||||
|
#disable-default-queries: true
|
||||||
|
|
||||||
|
queries:
|
||||||
|
- name: EDK2 CodeQL Query List
|
||||||
|
uses: ./.github/codeql/edk2.qls
|
||||||
|
|
||||||
|
# We must specify a query for CodeQL to run. Until the first query is enabled, enable the security query suite but
|
||||||
|
# exclude all problem levels from impacting the results. After the first query is enabled, this filter can be relaxed
|
||||||
|
# to find the level of problems desired from the query.
|
||||||
|
query-filters:
|
||||||
|
- exclude:
|
||||||
|
problem.severity:
|
||||||
|
- warning
|
||||||
|
- recommendation
|
14
.github/codeql/edk2.qls
vendored
Normal file
14
.github/codeql/edk2.qls
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
- description: EDK2 (C++) queries
|
||||||
|
|
||||||
|
# Bring in all queries from the official cpp-queries suite so individual queries can be explicitly enabled.
|
||||||
|
|
||||||
|
- queries: '.'
|
||||||
|
from: codeql/cpp-queries
|
||||||
|
|
||||||
|
# Enable individual queries below.
|
||||||
|
|
||||||
|
- include:
|
||||||
|
id: cpp/infinite-loop-with-unsatisfiable-exit-condition
|
||||||
|
- include:
|
||||||
|
id: cpp/overflow-buffer
|
96
.github/workflows/codeql-analysis.yml
vendored
Normal file
96
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
# @file
|
||||||
|
# GitHub Workflow for CodeQL Analysis
|
||||||
|
#
|
||||||
|
# Copyright (c) Microsoft Corporation.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
##
|
||||||
|
|
||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
paths-ignore:
|
||||||
|
- '**/*.bat'
|
||||||
|
- '**/*.md'
|
||||||
|
- '**/*.py'
|
||||||
|
- '**/*.rst'
|
||||||
|
- '**/*.sh'
|
||||||
|
- '**/*.txt'
|
||||||
|
|
||||||
|
schedule:
|
||||||
|
# https://crontab.guru/#20_23_*_*_4
|
||||||
|
- cron: '20 23 * * 4'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: windows-2019
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
package: [
|
||||||
|
"ArmPkg",
|
||||||
|
"CryptoPkg",
|
||||||
|
"DynamicTablesPkg",
|
||||||
|
"FatPkg",
|
||||||
|
"FmpDevicePkg",
|
||||||
|
"IntelFsp2Pkg",
|
||||||
|
"IntelFsp2WrapperPkg",
|
||||||
|
"MdeModulePkg",
|
||||||
|
"MdePkg",
|
||||||
|
"PcAtChipsetPkg",
|
||||||
|
"PrmPkg",
|
||||||
|
"SecurityPkg",
|
||||||
|
"ShellPkg",
|
||||||
|
"SourceLevelDebugPkg",
|
||||||
|
"StandaloneMmPkg",
|
||||||
|
"UefiCpuPkg",
|
||||||
|
"UnitTestFrameworkPkg"]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10.6'
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: 'cpp'
|
||||||
|
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||||
|
# Learn more about CodeQL language support at https://codeql.github.com/docs/codeql-overview/supported-languages-and-frameworks/
|
||||||
|
config-file: ./.github/codeql/codeql-config.yml
|
||||||
|
# Note: Add new queries to codeql-config.yml file as they are enabled.
|
||||||
|
|
||||||
|
- name: Install/Upgrade pip Modules
|
||||||
|
run: pip install -r pip-requirements.txt --upgrade
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
run: stuart_setup -c .pytool/CISettings.py -t DEBUG -a IA32,X64 TOOL_CHAIN_TAG=VS2019
|
||||||
|
|
||||||
|
- name: Update
|
||||||
|
run: stuart_update -c .pytool/CISettings.py -t DEBUG -a IA32,X64 TOOL_CHAIN_TAG=VS2019
|
||||||
|
|
||||||
|
- name: Build Tools From Source
|
||||||
|
run: python BaseTools/Edk2ToolsBuild.py -t VS2019
|
||||||
|
|
||||||
|
- name: CI Build
|
||||||
|
run: stuart_ci_build -c .pytool/CISettings.py -p ${{ matrix.package }} -t DEBUG -a IA32,X64 TOOL_CHAIN_TAG=VS2019
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -20,3 +20,6 @@
|
|||||||
[submodule "RedfishPkg/Library/JsonLib/jansson"]
|
[submodule "RedfishPkg/Library/JsonLib/jansson"]
|
||||||
path = RedfishPkg/Library/JsonLib/jansson
|
path = RedfishPkg/Library/JsonLib/jansson
|
||||||
url = https://github.com/akheron/jansson
|
url = https://github.com/akheron/jansson
|
||||||
|
[submodule "UnitTestFrameworkPkg/Library/GoogleTestLib/googletest"]
|
||||||
|
path = UnitTestFrameworkPkg/Library/GoogleTestLib/googletest
|
||||||
|
url = https://github.com/google/googletest.git
|
||||||
|
@@ -53,7 +53,10 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
"ArmPlatformPkg",
|
"ArmPlatformPkg",
|
||||||
"ArmVirtPkg",
|
"ArmVirtPkg",
|
||||||
"DynamicTablesPkg",
|
"DynamicTablesPkg",
|
||||||
|
"EmbeddedPkg",
|
||||||
"EmulatorPkg",
|
"EmulatorPkg",
|
||||||
|
"IntelFsp2Pkg",
|
||||||
|
"IntelFsp2WrapperPkg",
|
||||||
"MdePkg",
|
"MdePkg",
|
||||||
"MdeModulePkg",
|
"MdeModulePkg",
|
||||||
"NetworkPkg",
|
"NetworkPkg",
|
||||||
@@ -62,12 +65,16 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
"UefiCpuPkg",
|
"UefiCpuPkg",
|
||||||
"FmpDevicePkg",
|
"FmpDevicePkg",
|
||||||
"ShellPkg",
|
"ShellPkg",
|
||||||
|
"SignedCapsulePkg",
|
||||||
"StandaloneMmPkg",
|
"StandaloneMmPkg",
|
||||||
"FatPkg",
|
"FatPkg",
|
||||||
"CryptoPkg",
|
"CryptoPkg",
|
||||||
|
"PrmPkg",
|
||||||
"UnitTestFrameworkPkg",
|
"UnitTestFrameworkPkg",
|
||||||
"OvmfPkg",
|
"OvmfPkg",
|
||||||
"RedfishPkg"
|
"RedfishPkg",
|
||||||
|
"SourceLevelDebugPkg",
|
||||||
|
"UefiPayloadPkg"
|
||||||
)
|
)
|
||||||
|
|
||||||
def GetArchitecturesSupported(self):
|
def GetArchitecturesSupported(self):
|
||||||
@@ -77,7 +84,8 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
"X64",
|
"X64",
|
||||||
"ARM",
|
"ARM",
|
||||||
"AARCH64",
|
"AARCH64",
|
||||||
"RISCV64")
|
"RISCV64",
|
||||||
|
"LOONGARCH64")
|
||||||
|
|
||||||
def GetTargetsSupported(self):
|
def GetTargetsSupported(self):
|
||||||
''' return iterable of edk2 target tags supported by this build '''
|
''' return iterable of edk2 target tags supported by this build '''
|
||||||
@@ -168,6 +176,8 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
scopes += ("gcc_arm_linux",)
|
scopes += ("gcc_arm_linux",)
|
||||||
if "RISCV64" in self.ActualArchitectures:
|
if "RISCV64" in self.ActualArchitectures:
|
||||||
scopes += ("gcc_riscv64_unknown",)
|
scopes += ("gcc_riscv64_unknown",)
|
||||||
|
if "LOONGARCH64" in self.ActualArchitectures:
|
||||||
|
scopes += ("gcc_loongarch64_unknown_linux",)
|
||||||
self.ActualScopes = scopes
|
self.ActualScopes = scopes
|
||||||
return self.ActualScopes
|
return self.ActualScopes
|
||||||
|
|
||||||
@@ -182,6 +192,8 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
|
|||||||
"CryptoPkg/Library/OpensslLib/openssl", False))
|
"CryptoPkg/Library/OpensslLib/openssl", False))
|
||||||
rs.append(RequiredSubmodule(
|
rs.append(RequiredSubmodule(
|
||||||
"UnitTestFrameworkPkg/Library/CmockaLib/cmocka", False))
|
"UnitTestFrameworkPkg/Library/CmockaLib/cmocka", False))
|
||||||
|
rs.append(RequiredSubmodule(
|
||||||
|
"UnitTestFrameworkPkg/Library/GoogleTestLib/googletest", False))
|
||||||
rs.append(RequiredSubmodule(
|
rs.append(RequiredSubmodule(
|
||||||
"MdeModulePkg/Universal/RegularExpressionDxe/oniguruma", False))
|
"MdeModulePkg/Universal/RegularExpressionDxe/oniguruma", False))
|
||||||
rs.append(RequiredSubmodule(
|
rs.append(RequiredSubmodule(
|
||||||
|
@@ -69,7 +69,7 @@ class CharEncodingCheck(ICiBuildPlugin):
|
|||||||
overall_status = 0
|
overall_status = 0
|
||||||
files_tested = 0
|
files_tested = 0
|
||||||
|
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||||
|
|
||||||
if abs_pkg_path is None:
|
if abs_pkg_path is None:
|
||||||
tc.SetSkipped()
|
tc.SetSkipped()
|
||||||
@@ -90,7 +90,7 @@ class CharEncodingCheck(ICiBuildPlugin):
|
|||||||
tc.LogStdError("CharEncodingCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore file".format(a))
|
tc.LogStdError("CharEncodingCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore file".format(a))
|
||||||
logging.info("CharEncodingCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore file".format(a))
|
logging.info("CharEncodingCheck.IgnoreInf -> {0} not found in filesystem. Invalid ignore file".format(a))
|
||||||
|
|
||||||
files = [Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(x) for x in files]
|
files = [Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(x) for x in files]
|
||||||
for a in files:
|
for a in files:
|
||||||
files_tested += 1
|
files_tested += 1
|
||||||
if(self.TestEncodingOk(a, enc)):
|
if(self.TestEncodingOk(a, enc)):
|
||||||
|
@@ -61,7 +61,7 @@ class CompilerPlugin(ICiBuildPlugin):
|
|||||||
tc.LogStdError("DscPath not found in config file. Nothing to compile.")
|
tc.LogStdError("DscPath not found in config file. Nothing to compile.")
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
AP = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
AP = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||||
|
|
||||||
APDSC = os.path.join(AP, pkgconfig["DscPath"].strip())
|
APDSC = os.path.join(AP, pkgconfig["DscPath"].strip())
|
||||||
AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC)
|
AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC)
|
||||||
|
@@ -55,7 +55,7 @@ class DependencyCheck(ICiBuildPlugin):
|
|||||||
overall_status = 0
|
overall_status = 0
|
||||||
|
|
||||||
# Get current platform
|
# Get current platform
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||||
|
|
||||||
# Get INF Files
|
# Get INF Files
|
||||||
INFFiles = self.WalkDirectoryForExtension([".inf"], abs_pkg_path)
|
INFFiles = self.WalkDirectoryForExtension([".inf"], abs_pkg_path)
|
||||||
|
@@ -58,7 +58,7 @@ class DscCompleteCheck(ICiBuildPlugin):
|
|||||||
"DscPath not found in config file. Nothing to check.")
|
"DscPath not found in config file. Nothing to check.")
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||||
packagename)
|
packagename)
|
||||||
abs_dsc_path = os.path.join(abs_pkg_path, pkgconfig["DscPath"].strip())
|
abs_dsc_path = os.path.join(abs_pkg_path, pkgconfig["DscPath"].strip())
|
||||||
wsr_dsc_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(
|
wsr_dsc_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(
|
||||||
|
@@ -30,7 +30,6 @@ class EccCheck(ICiBuildPlugin):
|
|||||||
},
|
},
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ReModifyFile = re.compile(r'[B-Q,S-Z]+[\d]*\t(.*)')
|
|
||||||
FindModifyFile = re.compile(r'\+\+\+ b\/(.*)')
|
FindModifyFile = re.compile(r'\+\+\+ b\/(.*)')
|
||||||
LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
|
LineScopePattern = (r'@@ -\d*\,*\d* \+\d*\,*\d* @@.*')
|
||||||
LineNumRange = re.compile(r'@@ -\d*\,*\d* \+(\d*)\,*(\d*) @@.*')
|
LineNumRange = re.compile(r'@@ -\d*\,*\d* \+(\d*)\,*(\d*) @@.*')
|
||||||
@@ -69,77 +68,174 @@ class EccCheck(ICiBuildPlugin):
|
|||||||
env.set_shell_var('WORKSPACE', workspace_path)
|
env.set_shell_var('WORKSPACE', workspace_path)
|
||||||
env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
|
env.set_shell_var('PACKAGES_PATH', os.pathsep.join(Edk2pathObj.PackagePathList))
|
||||||
self.ECC_PASS = True
|
self.ECC_PASS = True
|
||||||
self.ApplyConfig(pkgconfig, workspace_path, basetools_path, packagename)
|
|
||||||
modify_dir_list = self.GetModifyDir(packagename)
|
# Create temp directory
|
||||||
patch = self.GetDiff(packagename)
|
temp_path = os.path.join(workspace_path, 'Build', '.pytool', 'Plugin', 'EccCheck')
|
||||||
ecc_diff_range = self.GetDiffRange(patch, packagename, workspace_path)
|
try:
|
||||||
self.GenerateEccReport(modify_dir_list, ecc_diff_range, workspace_path, basetools_path)
|
# Delete temp directory
|
||||||
ecc_log = os.path.join(workspace_path, "Ecc.log")
|
if os.path.exists(temp_path):
|
||||||
self.RevertCode()
|
shutil.rmtree(temp_path)
|
||||||
|
# Copy package being scanned to temp_path
|
||||||
|
shutil.copytree (
|
||||||
|
os.path.join(workspace_path, packagename),
|
||||||
|
os.path.join(temp_path, packagename),
|
||||||
|
symlinks=True
|
||||||
|
)
|
||||||
|
# Copy exception.xml to temp_path
|
||||||
|
shutil.copyfile (
|
||||||
|
os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml"),
|
||||||
|
os.path.join(temp_path, "exception.xml")
|
||||||
|
)
|
||||||
|
# Output file to use for git diff operations
|
||||||
|
temp_diff_output = os.path.join (temp_path, 'diff.txt')
|
||||||
|
|
||||||
|
self.ApplyConfig(pkgconfig, temp_path, packagename)
|
||||||
|
modify_dir_list = self.GetModifyDir(packagename, temp_diff_output)
|
||||||
|
patch = self.GetDiff(packagename, temp_diff_output)
|
||||||
|
ecc_diff_range = self.GetDiffRange(patch, packagename, temp_path)
|
||||||
|
#
|
||||||
|
# Use temp_path as working directory when running ECC tool
|
||||||
|
#
|
||||||
|
self.GenerateEccReport(modify_dir_list, ecc_diff_range, temp_path, basetools_path)
|
||||||
|
ecc_log = os.path.join(temp_path, "Ecc.log")
|
||||||
if self.ECC_PASS:
|
if self.ECC_PASS:
|
||||||
|
# Delete temp directory
|
||||||
|
if os.path.exists(temp_path):
|
||||||
|
shutil.rmtree(temp_path)
|
||||||
tc.SetSuccess()
|
tc.SetSuccess()
|
||||||
self.RemoveFile(ecc_log)
|
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
with open(ecc_log, encoding='utf8') as output:
|
with open(ecc_log, encoding='utf8') as output:
|
||||||
ecc_output = output.readlines()
|
ecc_output = output.readlines()
|
||||||
for line in ecc_output:
|
for line in ecc_output:
|
||||||
logging.error(line.strip())
|
logging.error(line.strip())
|
||||||
self.RemoveFile(ecc_log)
|
# Delete temp directory
|
||||||
tc.SetFailed("EccCheck failed for {0}".format(packagename), "Ecc detected issues")
|
if os.path.exists(temp_path):
|
||||||
|
shutil.rmtree(temp_path)
|
||||||
|
tc.SetFailed("EccCheck failed for {0}".format(packagename), "CHECK FAILED")
|
||||||
|
return 1
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
# If EccCheck is interrupted by keybard interrupt, then return failure
|
||||||
|
# Delete temp directory
|
||||||
|
if os.path.exists(temp_path):
|
||||||
|
shutil.rmtree(temp_path)
|
||||||
|
tc.SetFailed("EccCheck interrupted for {0}".format(packagename), "CHECK FAILED")
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
# If EccCheck fails for any other exception type, raise the exception
|
||||||
|
# Delete temp directory
|
||||||
|
if os.path.exists(temp_path):
|
||||||
|
shutil.rmtree(temp_path)
|
||||||
|
tc.SetFailed("EccCheck exception for {0}".format(packagename), "CHECK FAILED")
|
||||||
|
raise
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
def RevertCode(self) -> None:
|
def GetDiff(self, pkg: str, temp_diff_output: str) -> List[str]:
|
||||||
submoudle_params = "submodule update --init"
|
patch = []
|
||||||
RunCmd("git", submoudle_params)
|
#
|
||||||
reset_params = "reset HEAD --hard"
|
# Generate unified diff between origin/master and HEAD.
|
||||||
RunCmd("git", reset_params)
|
#
|
||||||
|
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
|
||||||
def GetDiff(self, pkg: str) -> List[str]:
|
RunCmd("git", params)
|
||||||
return_buffer = StringIO()
|
with open(temp_diff_output) as file:
|
||||||
params = "diff --unified=0 origin/master HEAD"
|
patch = file.read().strip().split('\n')
|
||||||
RunCmd("git", params, outstream=return_buffer)
|
|
||||||
p = return_buffer.getvalue().strip()
|
|
||||||
patch = p.split("\n")
|
|
||||||
return_buffer.close()
|
|
||||||
|
|
||||||
return patch
|
return patch
|
||||||
|
|
||||||
def RemoveFile(self, file: str) -> None:
|
def GetModifyDir(self, pkg: str, temp_diff_output: str) -> List[str]:
|
||||||
if os.path.exists(file):
|
#
|
||||||
os.remove(file)
|
# Generate diff between origin/master and HEAD using --diff-filter to
|
||||||
return
|
# exclude deleted and renamed files that do not need to be scanned by
|
||||||
|
# ECC. Also use --name-status to only generate the names of the files
|
||||||
|
# with differences. The output format of this git diff command is a
|
||||||
|
# list of files with the change status and the filename. The filename
|
||||||
|
# is always at the end of the line. Examples:
|
||||||
|
#
|
||||||
|
# M MdeModulePkg/Application/CapsuleApp/CapsuleApp.h
|
||||||
|
# M MdeModulePkg/Application/UiApp/FrontPage.h
|
||||||
|
#
|
||||||
|
params = "diff --output={} --diff-filter=dr --name-status origin/master HEAD".format(temp_diff_output)
|
||||||
|
RunCmd("git", params)
|
||||||
|
dir_list = []
|
||||||
|
with open(temp_diff_output) as file:
|
||||||
|
dir_list = file.read().strip().split('\n')
|
||||||
|
|
||||||
def GetModifyDir(self, pkg: str) -> List[str]:
|
|
||||||
return_buffer = StringIO()
|
|
||||||
params = "diff --name-status" + ' HEAD' + ' origin/master'
|
|
||||||
RunCmd("git", params, outstream=return_buffer)
|
|
||||||
p1 = return_buffer.getvalue().strip()
|
|
||||||
dir_list = p1.split("\n")
|
|
||||||
return_buffer.close()
|
|
||||||
modify_dir_list = []
|
modify_dir_list = []
|
||||||
for modify_dir in dir_list:
|
for modify_dir in dir_list:
|
||||||
file_path = self.ReModifyFile.findall(modify_dir)
|
#
|
||||||
if file_path:
|
# Parse file name from the end of the line
|
||||||
file_dir = os.path.dirname(file_path[0])
|
#
|
||||||
else:
|
file_path = modify_dir.strip().split()
|
||||||
|
#
|
||||||
|
# Skip lines that do not have at least 2 elements (status and file name)
|
||||||
|
#
|
||||||
|
if len(file_path) < 2:
|
||||||
continue
|
continue
|
||||||
if pkg in file_dir and file_dir != pkg:
|
#
|
||||||
modify_dir_list.append('%s' % file_dir)
|
# Parse the directory name from the file name
|
||||||
else:
|
#
|
||||||
|
file_dir = os.path.dirname(file_path[-1])
|
||||||
|
#
|
||||||
|
# Skip directory names that do not start with the package being scanned.
|
||||||
|
#
|
||||||
|
if file_dir.split('/')[0] != pkg:
|
||||||
continue
|
continue
|
||||||
|
#
|
||||||
|
# Skip directory names that are identical to the package being scanned.
|
||||||
|
# The assumption here is that there are no source files at the package
|
||||||
|
# root. Instead, the only expected files in the package root are
|
||||||
|
# EDK II meta data files (DEC, DSC, FDF).
|
||||||
|
#
|
||||||
|
if file_dir == pkg:
|
||||||
|
continue
|
||||||
|
#
|
||||||
|
# Skip directory names that are already in the modified dir list
|
||||||
|
#
|
||||||
|
if file_dir in modify_dir_list:
|
||||||
|
continue
|
||||||
|
#
|
||||||
|
# Add the candidate directory to scan to the modified dir list
|
||||||
|
#
|
||||||
|
modify_dir_list.append(file_dir)
|
||||||
|
|
||||||
modify_dir_list = list(set(modify_dir_list))
|
#
|
||||||
return modify_dir_list
|
# Remove duplicates from modify_dir_list
|
||||||
|
# Given a folder path, ECC performs a recursive scan of that folder.
|
||||||
|
# If a parent and child folder are both present in modify_dir_list,
|
||||||
|
# then ECC will perform redudanct scans of source files. In order
|
||||||
|
# to prevent redundant scans, if a parent and child folder are both
|
||||||
|
# present, then remove all the child folders.
|
||||||
|
#
|
||||||
|
# For example, if modified_dir_list contains the following elements:
|
||||||
|
# MdeModulePkg/Core/Dxe
|
||||||
|
# MdeModulePkg/Core/Dxe/Hand
|
||||||
|
# MdeModulePkg/Core/Dxe/Mem
|
||||||
|
#
|
||||||
|
# Then MdeModulePkg/Core/Dxe/Hand and MdeModulePkg/Core/Dxe/Mem should
|
||||||
|
# be removed because the files in those folders are covered by a scan
|
||||||
|
# of MdeModulePkg/Core/Dxe.
|
||||||
|
#
|
||||||
|
filtered_list = []
|
||||||
|
for dir1 in modify_dir_list:
|
||||||
|
Append = True
|
||||||
|
for dir2 in modify_dir_list:
|
||||||
|
if dir1 == dir2:
|
||||||
|
continue
|
||||||
|
common = os.path.commonpath([dir1, dir2])
|
||||||
|
if os.path.normpath(common) == os.path.normpath(dir2):
|
||||||
|
Append = False
|
||||||
|
break
|
||||||
|
if Append and dir1 not in filtered_list:
|
||||||
|
filtered_list.append(dir1)
|
||||||
|
return filtered_list
|
||||||
|
|
||||||
def GetDiffRange(self, patch_diff: List[str], pkg: str, workingdir: str) -> Dict[str, List[Tuple[int, int]]]:
|
def GetDiffRange(self, patch_diff: List[str], pkg: str, temp_path: str) -> Dict[str, List[Tuple[int, int]]]:
|
||||||
IsDelete = True
|
IsDelete = True
|
||||||
StartCheck = False
|
StartCheck = False
|
||||||
range_directory: Dict[str, List[Tuple[int, int]]] = {}
|
range_directory: Dict[str, List[Tuple[int, int]]] = {}
|
||||||
for line in patch_diff:
|
for line in patch_diff:
|
||||||
modify_file = self.FindModifyFile.findall(line)
|
modify_file = self.FindModifyFile.findall(line)
|
||||||
if modify_file and pkg in modify_file[0] and not StartCheck and os.path.isfile(modify_file[0]):
|
if modify_file and pkg in modify_file[0] and not StartCheck and os.path.isfile(modify_file[0]):
|
||||||
modify_file_comment_dic = self.GetCommentRange(modify_file[0], workingdir)
|
modify_file_comment_dic = self.GetCommentRange(modify_file[0], temp_path)
|
||||||
IsDelete = False
|
IsDelete = False
|
||||||
StartCheck = True
|
StartCheck = True
|
||||||
modify_file_dic = modify_file[0]
|
modify_file_dic = modify_file[0]
|
||||||
@@ -158,11 +254,13 @@ class EccCheck(ICiBuildPlugin):
|
|||||||
range_directory[modify_file_dic].append(i)
|
range_directory[modify_file_dic].append(i)
|
||||||
return range_directory
|
return range_directory
|
||||||
|
|
||||||
def GetCommentRange(self, modify_file: str, workingdir: str) -> List[Tuple[int, int]]:
|
def GetCommentRange(self, modify_file: str, temp_path: str) -> List[Tuple[int, int]]:
|
||||||
modify_file_path = os.path.join(workingdir, modify_file)
|
comment_range: List[Tuple[int, int]] = []
|
||||||
|
modify_file_path = os.path.join(temp_path, modify_file)
|
||||||
|
if not os.path.exists (modify_file_path):
|
||||||
|
return comment_range
|
||||||
with open(modify_file_path) as f:
|
with open(modify_file_path) as f:
|
||||||
line_no = 1
|
line_no = 1
|
||||||
comment_range: List[Tuple[int, int]] = []
|
|
||||||
Start = False
|
Start = False
|
||||||
for line in f:
|
for line in f:
|
||||||
if line.startswith('/**'):
|
if line.startswith('/**'):
|
||||||
@@ -179,35 +277,33 @@ class EccCheck(ICiBuildPlugin):
|
|||||||
return comment_range
|
return comment_range
|
||||||
|
|
||||||
def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]],
|
def GenerateEccReport(self, modify_dir_list: List[str], ecc_diff_range: Dict[str, List[Tuple[int, int]]],
|
||||||
workspace_path: str, basetools_path: str) -> None:
|
temp_path: str, basetools_path: str) -> None:
|
||||||
ecc_need = False
|
ecc_need = False
|
||||||
ecc_run = True
|
ecc_run = True
|
||||||
config = os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini")
|
config = os.path.normpath(os.path.join(basetools_path, "Source", "Python", "Ecc", "config.ini"))
|
||||||
exception = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
|
exception = os.path.normpath(os.path.join(temp_path, "exception.xml"))
|
||||||
report = os.path.join(workspace_path, "Ecc.csv")
|
report = os.path.normpath(os.path.join(temp_path, "Ecc.csv"))
|
||||||
for modify_dir in modify_dir_list:
|
for modify_dir in modify_dir_list:
|
||||||
target = os.path.join(workspace_path, modify_dir)
|
target = os.path.normpath(os.path.join(temp_path, modify_dir))
|
||||||
logging.info('Run ECC tool for the commit in %s' % modify_dir)
|
logging.info('Run ECC tool for the commit in %s' % modify_dir)
|
||||||
ecc_need = True
|
ecc_need = True
|
||||||
ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report)
|
ecc_params = "-c {0} -e {1} -t {2} -r {3}".format(config, exception, target, report)
|
||||||
return_code = RunCmd("Ecc", ecc_params, workingdir=workspace_path)
|
return_code = RunCmd("Ecc", ecc_params, workingdir=temp_path)
|
||||||
if return_code != 0:
|
if return_code != 0:
|
||||||
ecc_run = False
|
ecc_run = False
|
||||||
break
|
break
|
||||||
if not ecc_run:
|
if not ecc_run:
|
||||||
logging.error('Fail to run ECC tool')
|
logging.error('Fail to run ECC tool')
|
||||||
self.ParseEccReport(ecc_diff_range, workspace_path)
|
self.ParseEccReport(ecc_diff_range, temp_path)
|
||||||
|
|
||||||
if not ecc_need:
|
if not ecc_need:
|
||||||
logging.info("Doesn't need run ECC check")
|
logging.info("Doesn't need run ECC check")
|
||||||
|
|
||||||
revert_params = "checkout -- {}".format(exception)
|
|
||||||
RunCmd("git", revert_params)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], workspace_path: str) -> None:
|
def ParseEccReport(self, ecc_diff_range: Dict[str, List[Tuple[int, int]]], temp_path: str) -> None:
|
||||||
ecc_log = os.path.join(workspace_path, "Ecc.log")
|
ecc_log = os.path.join(temp_path, "Ecc.log")
|
||||||
ecc_csv = os.path.join(workspace_path, "Ecc.csv")
|
ecc_csv = os.path.join(temp_path, "Ecc.csv")
|
||||||
row_lines = []
|
row_lines = []
|
||||||
ignore_error_code = self.GetIgnoreErrorCode()
|
ignore_error_code = self.GetIgnoreErrorCode()
|
||||||
if os.path.exists(ecc_csv):
|
if os.path.exists(ecc_csv):
|
||||||
@@ -236,16 +332,16 @@ class EccCheck(ICiBuildPlugin):
|
|||||||
log.writelines(all_line)
|
log.writelines(all_line)
|
||||||
return
|
return
|
||||||
|
|
||||||
def ApplyConfig(self, pkgconfig: Dict[str, List[str]], workspace_path: str, basetools_path: str, pkg: str) -> None:
|
def ApplyConfig(self, pkgconfig: Dict[str, List[str]], temp_path: str, pkg: str) -> None:
|
||||||
if "IgnoreFiles" in pkgconfig:
|
if "IgnoreFiles" in pkgconfig:
|
||||||
for a in pkgconfig["IgnoreFiles"]:
|
for a in pkgconfig["IgnoreFiles"]:
|
||||||
a = os.path.join(workspace_path, pkg, a)
|
a = os.path.join(temp_path, pkg, a)
|
||||||
a = a.replace(os.sep, "/")
|
a = a.replace(os.sep, "/")
|
||||||
|
|
||||||
logging.info("Ignoring Files {0}".format(a))
|
logging.info("Ignoring Files {0}".format(a))
|
||||||
if os.path.exists(a):
|
if os.path.exists(a):
|
||||||
if os.path.isfile(a):
|
if os.path.isfile(a):
|
||||||
self.RemoveFile(a)
|
os.remove(a)
|
||||||
elif os.path.isdir(a):
|
elif os.path.isdir(a):
|
||||||
shutil.rmtree(a)
|
shutil.rmtree(a)
|
||||||
else:
|
else:
|
||||||
@@ -253,7 +349,7 @@ class EccCheck(ICiBuildPlugin):
|
|||||||
|
|
||||||
if "ExceptionList" in pkgconfig:
|
if "ExceptionList" in pkgconfig:
|
||||||
exception_list = pkgconfig["ExceptionList"]
|
exception_list = pkgconfig["ExceptionList"]
|
||||||
exception_xml = os.path.join(basetools_path, "Source", "Python", "Ecc", "exception.xml")
|
exception_xml = os.path.join(temp_path, "exception.xml")
|
||||||
try:
|
try:
|
||||||
logging.info("Appending exceptions")
|
logging.info("Appending exceptions")
|
||||||
self.AppendException(exception_list, exception_xml)
|
self.AppendException(exception_list, exception_xml)
|
||||||
|
@@ -116,7 +116,7 @@ class GuidCheck(ICiBuildPlugin):
|
|||||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
||||||
Errors = []
|
Errors = []
|
||||||
|
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||||
packagename)
|
packagename)
|
||||||
|
|
||||||
if abs_pkg_path is None:
|
if abs_pkg_path is None:
|
||||||
|
@@ -93,7 +93,7 @@ class HostUnitTestCompilerPlugin(ICiBuildPlugin):
|
|||||||
tc.LogStdError("DscPath not found in config file. Nothing to compile for HostBasedUnitTests.")
|
tc.LogStdError("DscPath not found in config file. Nothing to compile for HostBasedUnitTests.")
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
AP = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
AP = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||||
|
|
||||||
APDSC = os.path.join(AP, pkgconfig["DscPath"].strip())
|
APDSC = os.path.join(AP, pkgconfig["DscPath"].strip())
|
||||||
AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC)
|
AP_Path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(APDSC)
|
||||||
|
@@ -61,7 +61,7 @@ class HostUnitTestDscCompleteCheck(ICiBuildPlugin):
|
|||||||
"DscPath not found in config file. Nothing to check.")
|
"DscPath not found in config file. Nothing to check.")
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||||
packagename)
|
packagename)
|
||||||
abs_dsc_path = os.path.join(abs_pkg_path, pkgconfig["DscPath"].strip())
|
abs_dsc_path = os.path.join(abs_pkg_path, pkgconfig["DscPath"].strip())
|
||||||
wsr_dsc_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(
|
wsr_dsc_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(
|
||||||
|
@@ -63,7 +63,7 @@ class LibraryClassCheck(ICiBuildPlugin):
|
|||||||
overall_status = 0
|
overall_status = 0
|
||||||
LibraryClassIgnore = []
|
LibraryClassIgnore = []
|
||||||
|
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(packagename)
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(packagename)
|
||||||
abs_dec_path = self.__GetPkgDec(abs_pkg_path)
|
abs_dec_path = self.__GetPkgDec(abs_pkg_path)
|
||||||
wsr_dec_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(abs_dec_path)
|
wsr_dec_path = Edk2pathObj.GetEdk2RelativePathFromAbsolutePath(abs_dec_path)
|
||||||
|
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
##
|
##
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import shutil
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
@@ -61,12 +62,19 @@ class LicenseCheck(ICiBuildPlugin):
|
|||||||
# - Junit Logger
|
# - Junit Logger
|
||||||
# - output_stream the StringIO output stream from this plugin via logging
|
# - output_stream the StringIO output stream from this plugin via logging
|
||||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
||||||
return_buffer = StringIO()
|
# Create temp directory
|
||||||
params = "diff --unified=0 origin/master HEAD"
|
temp_path = os.path.join(Edk2pathObj.WorkspacePath, 'Build', '.pytool', 'Plugin', 'LicenseCheck')
|
||||||
RunCmd("git", params, outstream=return_buffer)
|
if not os.path.exists(temp_path):
|
||||||
p = return_buffer.getvalue().strip()
|
os.makedirs(temp_path)
|
||||||
patch = p.split("\n")
|
# Output file to use for git diff operations
|
||||||
return_buffer.close()
|
temp_diff_output = os.path.join (temp_path, 'diff.txt')
|
||||||
|
params = "diff --output={} --unified=0 origin/master HEAD".format(temp_diff_output)
|
||||||
|
RunCmd("git", params)
|
||||||
|
with open(temp_diff_output) as file:
|
||||||
|
patch = file.read().strip().split("\n")
|
||||||
|
# Delete temp directory
|
||||||
|
if os.path.exists(temp_path):
|
||||||
|
shutil.rmtree(temp_path)
|
||||||
|
|
||||||
ignore_files = []
|
ignore_files = []
|
||||||
if "IgnoreFiles" in pkgconfig:
|
if "IgnoreFiles" in pkgconfig:
|
||||||
|
@@ -73,7 +73,7 @@ class SpellCheck(ICiBuildPlugin):
|
|||||||
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
def RunBuildPlugin(self, packagename, Edk2pathObj, pkgconfig, environment, PLM, PLMHelper, tc, output_stream=None):
|
||||||
Errors = []
|
Errors = []
|
||||||
|
|
||||||
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
|
abs_pkg_path = Edk2pathObj.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||||
packagename)
|
packagename)
|
||||||
|
|
||||||
if abs_pkg_path is None:
|
if abs_pkg_path is None:
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
"*.jpg"
|
"*.jpg"
|
||||||
],
|
],
|
||||||
"minWordLength": 5,
|
"minWordLength": 5,
|
||||||
"allowCompoundWords": false,
|
"allowCompoundWords": true,
|
||||||
"maxNumberOfProblems": 200,
|
"maxNumberOfProblems": 200,
|
||||||
"maxDuplicateProblems": 200,
|
"maxDuplicateProblems": 200,
|
||||||
"ignoreWords": [
|
"ignoreWords": [
|
||||||
@@ -178,6 +178,119 @@
|
|||||||
"vcruntimed",
|
"vcruntimed",
|
||||||
"ucrtd",
|
"ucrtd",
|
||||||
"msvcrtd",
|
"msvcrtd",
|
||||||
"XIPFLAGS"
|
"XIPFLAGS",
|
||||||
|
"bootflow",
|
||||||
|
"bootup",
|
||||||
|
"cacheability",
|
||||||
|
"cachetype",
|
||||||
|
"conout",
|
||||||
|
"deadloop",
|
||||||
|
"devicepath",
|
||||||
|
"hisilicon",
|
||||||
|
"littleendian",
|
||||||
|
"nonsecure",
|
||||||
|
"pagetable",
|
||||||
|
"postmem",
|
||||||
|
"premem",
|
||||||
|
"reglist",
|
||||||
|
"semihalf",
|
||||||
|
"subvendor",
|
||||||
|
"subhierarchy",
|
||||||
|
"targetlist",
|
||||||
|
"tmpname",
|
||||||
|
"watchdogtimer",
|
||||||
|
"writeback",
|
||||||
|
"langcode",
|
||||||
|
"langcodes",
|
||||||
|
"autoreload",
|
||||||
|
"bootable",
|
||||||
|
"endiannness",
|
||||||
|
"fvmain",
|
||||||
|
"prefetchable",
|
||||||
|
"multiboot",
|
||||||
|
"ramdisk",
|
||||||
|
"unbootable",
|
||||||
|
"setjump",
|
||||||
|
"bytecodes",
|
||||||
|
"bytelist",
|
||||||
|
"bytestream",
|
||||||
|
"countof",
|
||||||
|
"deregistering",
|
||||||
|
"devicetree",
|
||||||
|
"mainpage",
|
||||||
|
"mismanipulation",
|
||||||
|
"pytool",
|
||||||
|
"wbinvd",
|
||||||
|
"armltd",
|
||||||
|
"datacache",
|
||||||
|
"lastattemptstatus",
|
||||||
|
"lastattemptversion",
|
||||||
|
"lowestsupportedversion",
|
||||||
|
"updateable",
|
||||||
|
"pecoff",
|
||||||
|
"autodetect",
|
||||||
|
"harddisk",
|
||||||
|
"toctou",
|
||||||
|
"bugbug",
|
||||||
|
"depexes",
|
||||||
|
"fwvol",
|
||||||
|
"hoblist",
|
||||||
|
"imagehandle",
|
||||||
|
"schedulable",
|
||||||
|
"StandaloneMMCore",
|
||||||
|
"systemtable",
|
||||||
|
"uncacheable",
|
||||||
|
"devpath",
|
||||||
|
"testsuites",
|
||||||
|
"testcase",
|
||||||
|
"pxmldoc",
|
||||||
|
"pcxml",
|
||||||
|
"pclutf",
|
||||||
|
"pcunicode",
|
||||||
|
"ntxmltransformcharacter",
|
||||||
|
"ntxmlcomparestrings",
|
||||||
|
"pcxmldoc",
|
||||||
|
"ntxmlfetchcharacterdecoder",
|
||||||
|
"ntxml",
|
||||||
|
"ntxmlspecialstringcompare",
|
||||||
|
"rtlxmlcallback",
|
||||||
|
"xmlef",
|
||||||
|
"osruntime",
|
||||||
|
"readytoboot",
|
||||||
|
"hwerrrec",
|
||||||
|
"xformed",
|
||||||
|
"xform",
|
||||||
|
"undock",
|
||||||
|
"qrencoder",
|
||||||
|
"selawik",
|
||||||
|
"ntxmlrawnextcharacter",
|
||||||
|
"undocked",
|
||||||
|
"reprompt",
|
||||||
|
"yesno",
|
||||||
|
"okcancel",
|
||||||
|
"qrencoding",
|
||||||
|
"qrlevel",
|
||||||
|
"shiftn",
|
||||||
|
"unenroll",
|
||||||
|
"pcxmlstructure",
|
||||||
|
"pxmlstructure",
|
||||||
|
"pcencoder",
|
||||||
|
"pcvoid",
|
||||||
|
"nofailure",
|
||||||
|
"blockio",
|
||||||
|
"lockv",
|
||||||
|
"uefishelldebug",
|
||||||
|
"mtrrcap",
|
||||||
|
"drhds",
|
||||||
|
"rmrrs",
|
||||||
|
"creatorid",
|
||||||
|
"dxeipl",
|
||||||
|
"swmdialogs",
|
||||||
|
"unrecovered",
|
||||||
|
"cmocka",
|
||||||
|
"unenrolling",
|
||||||
|
"unconfigure",
|
||||||
|
"Loongson",
|
||||||
|
"LOONGARCH"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
127
.pytool/Plugin/UncrustifyCheck/Readme.md
Normal file
127
.pytool/Plugin/UncrustifyCheck/Readme.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
# UncrustifyCheck Plugin
|
||||||
|
|
||||||
|
This CiBuildPlugin scans all the files in a given package and checks for coding standard compliance issues.
|
||||||
|
|
||||||
|
This plugin is enabled by default. If a package would like to prevent the plugin from reporting errors, it can do
|
||||||
|
so by enabling [`AuditOnly`](#auditonly) mode.
|
||||||
|
|
||||||
|
This plugin requires the directory containing the Uncrustify executable that should be used for this plugin to
|
||||||
|
be specified in an environment variable named `UNCRUSTIFY_CI_PATH`. This unique variable name is used to avoid confusion
|
||||||
|
with other paths to Uncrustify which might not be the expected build for use by this plugin.
|
||||||
|
|
||||||
|
By default, an Uncrustify configuration file named "uncrustify.cfg" located in the same directory as the plugin is
|
||||||
|
used. The value can be overridden to a package-specific path with the `ConfigFilePath` configuration file option.
|
||||||
|
|
||||||
|
* Uncrustify source code and documentation: https://github.com/uncrustify/uncrustify
|
||||||
|
* Project Mu Uncrustify fork source code and documentation: https://dev.azure.com/projectmu/Uncrustify
|
||||||
|
|
||||||
|
## Files Checked in a Package
|
||||||
|
|
||||||
|
By default, this plugin will discover all files in the package with the following default paths:
|
||||||
|
|
||||||
|
```python
|
||||||
|
[
|
||||||
|
# C source
|
||||||
|
"*.c",
|
||||||
|
"*.h"
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
From this list of files, any files ignored by Git or residing in a Git submodule will be removed. If Git is not
|
||||||
|
found, submodules are not found, or ignored files are not found no changes are made to the list of discovered files.
|
||||||
|
|
||||||
|
To control the paths checked in a given package, review the configuration options described in this file.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
The plugin can be configured with a few optional configuration options.
|
||||||
|
|
||||||
|
``` yaml
|
||||||
|
"UncrustifyCheck": {
|
||||||
|
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
|
||||||
|
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
|
||||||
|
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
|
||||||
|
"IgnoreFiles": [], # A list of file patterns to ignore.
|
||||||
|
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
|
||||||
|
"OutputFileDiffs": True, # Output chunks of formatting diffs in the test case log.
|
||||||
|
# This can significantly slow down the plugin on very large packages.
|
||||||
|
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### `AdditionalIncludePaths`
|
||||||
|
|
||||||
|
A package configuration file can specify any additional paths to be included with this option.
|
||||||
|
|
||||||
|
At this time, it is recommended all files run against the plugin be written in the C or C++ language.
|
||||||
|
|
||||||
|
### `AuditOnly`
|
||||||
|
|
||||||
|
`Boolean` - Default is `False`.
|
||||||
|
|
||||||
|
If `True`, run the test in an "audit only mode" which will log all errors but instead of failing the build, it will set
|
||||||
|
the test as skipped. This allows visibility into the failures without breaking the build.
|
||||||
|
|
||||||
|
### `ConfigFilePath`
|
||||||
|
|
||||||
|
`String` - Default is `"uncrustify.cfg"`
|
||||||
|
|
||||||
|
When specified in the config file, this is a package relative path to the Uncrustify configuration file.
|
||||||
|
|
||||||
|
### `IgnoreFiles`
|
||||||
|
|
||||||
|
This option supports .gitignore file and folder matching strings including wildcards.
|
||||||
|
|
||||||
|
The files specified by this configuration option will not be processed by Uncrustify.
|
||||||
|
|
||||||
|
### `IgnoreStandardPaths`
|
||||||
|
|
||||||
|
This plugin by default will check the below standard paths. A package configuration file can specify any of these paths
|
||||||
|
to be ignored.
|
||||||
|
|
||||||
|
```python
|
||||||
|
[
|
||||||
|
# C source
|
||||||
|
"*.c",
|
||||||
|
"*.h"
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### `OutputFileDiffs`
|
||||||
|
|
||||||
|
`Boolean` - Default is `True`.
|
||||||
|
|
||||||
|
If `True`, output diffs of formatting changes into the test case log. This is helpful to exactly understand what changes
|
||||||
|
need to be made to the source code in order to fix a coding standard compliance issue.
|
||||||
|
|
||||||
|
Note that calculating the file diffs on a very large set of of results (e.g. >100 files) can significantly slow down
|
||||||
|
plugin execution.
|
||||||
|
|
||||||
|
### `SkipGitExclusions`
|
||||||
|
|
||||||
|
`Boolean` - Default is `False`.
|
||||||
|
|
||||||
|
By default, files in paths matched in a .gitignore file or a recognized git submodule are excluded. If this option
|
||||||
|
is `True`, the plugin will not attempt to recognize these files and exclude them.
|
||||||
|
|
||||||
|
## High-Level Plugin Operation
|
||||||
|
|
||||||
|
This plugin generates two main sets of temporary files:
|
||||||
|
|
||||||
|
1. A working directory in the directory `Build/.pytool/Plugin/Uncrustify`
|
||||||
|
2. For each source file with formatting errors, a sibling file with the `.uncrustify_plugin` extension
|
||||||
|
|
||||||
|
The working directory contains temporary files unique to operation of the plugin. All of these files are removed on
|
||||||
|
exit of the plugin including successful or unsuccessful execution (such as a Python exception occurring). If for any
|
||||||
|
reason, any files in the package exist prior to running the plugin with the `.uncrustify_plugin` extension, the plugin
|
||||||
|
will inform the user to remove these files and exit before running Uncrustify. This is to ensure the accuracy of the
|
||||||
|
results reported from each execution instance of the plugin.
|
||||||
|
|
||||||
|
The plugin determines the list of relevant files to check with Uncrustify and then invokes Uncrustify with that file
|
||||||
|
list. For any files not compliant to the configuration file provided, Uncrustify will generate a corresponding file
|
||||||
|
with the `.uncrustify_plugin` extension. The plugin discovers all of these files. If any such files are present, this
|
||||||
|
indicates a formatting issue was found and the test is marked failed (unless `AuditOnly` mode is enabled).
|
||||||
|
|
||||||
|
The test case log will contain a report of which files failed to format properly, allowing the user to run Uncrustify
|
||||||
|
against the file locally to fix the issue. If the `OutputFileDiffs` configuration option is set to `True`, the plugin
|
||||||
|
will output diff chunks for all code formatting issues in the test case log.
|
660
.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
Normal file
660
.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
Normal file
@@ -0,0 +1,660 @@
|
|||||||
|
# @file UncrustifyCheck.py
|
||||||
|
#
|
||||||
|
# An edk2-pytool based plugin wrapper for Uncrustify
|
||||||
|
#
|
||||||
|
# Copyright (c) Microsoft Corporation.
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
##
|
||||||
|
import configparser
|
||||||
|
import difflib
|
||||||
|
import errno
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
import shutil
|
||||||
|
import timeit
|
||||||
|
from edk2toolext.environment import version_aggregator
|
||||||
|
from edk2toolext.environment.plugin_manager import PluginManager
|
||||||
|
from edk2toolext.environment.plugintypes.ci_build_plugin import ICiBuildPlugin
|
||||||
|
from edk2toolext.environment.plugintypes.uefi_helper_plugin import HelperFunctions
|
||||||
|
from edk2toolext.environment.var_dict import VarDict
|
||||||
|
from edk2toollib.gitignore_parser import parse_gitignore_lines
|
||||||
|
from edk2toollib.log.junit_report_format import JunitReportTestCase
|
||||||
|
from edk2toollib.uefi.edk2.path_utilities import Edk2Path
|
||||||
|
from edk2toollib.utility_functions import RunCmd
|
||||||
|
from io import StringIO
|
||||||
|
from typing import Any, Dict, List, Tuple
|
||||||
|
|
||||||
|
#
|
||||||
|
# Provide more user friendly messages for certain scenarios
|
||||||
|
#
|
||||||
|
class UncrustifyException(Exception):
|
||||||
|
def __init__(self, message, exit_code):
|
||||||
|
super().__init__(message)
|
||||||
|
self.exit_code = exit_code
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyAppEnvVarNotFoundException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -101)
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyAppVersionErrorException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -102)
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyAppExecutionException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -103)
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyStalePluginFormattedFilesException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -120)
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyInputFileCreationErrorException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -121)
|
||||||
|
|
||||||
|
class UncrustifyInvalidIgnoreStandardPathsException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -122)
|
||||||
|
|
||||||
|
class UncrustifyGitIgnoreFileException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -140)
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyGitSubmoduleException(UncrustifyException):
|
||||||
|
def __init__(self, message):
|
||||||
|
super().__init__(message, -141)
|
||||||
|
|
||||||
|
|
||||||
|
class UncrustifyCheck(ICiBuildPlugin):
|
||||||
|
"""
|
||||||
|
A CiBuildPlugin that uses Uncrustify to check the source files in the
|
||||||
|
package being tested for coding standard issues.
|
||||||
|
|
||||||
|
By default, the plugin runs against standard C source file extensions but
|
||||||
|
its configuration can be modified through its configuration file.
|
||||||
|
|
||||||
|
Configuration options:
|
||||||
|
"UncrustifyCheck": {
|
||||||
|
"AdditionalIncludePaths": [], # Additional paths to check formatting (wildcards supported).
|
||||||
|
"AuditOnly": False, # Don't fail the build if there are errors. Just log them.
|
||||||
|
"ConfigFilePath": "", # Custom path to an Uncrustify config file.
|
||||||
|
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignored.
|
||||||
|
"OutputFileDiffs": False, # Output chunks of formatting diffs in the test case log.
|
||||||
|
# This can significantly slow down the plugin on very large packages.
|
||||||
|
"SkipGitExclusions": False # Don't exclude git ignored files and files in git submodules.
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
#
|
||||||
|
# By default, use an "uncrustify.cfg" config file in the plugin directory
|
||||||
|
# A package can override this path via "ConfigFilePath"
|
||||||
|
#
|
||||||
|
# Note: Values specified via "ConfigFilePath" are relative to the package
|
||||||
|
#
|
||||||
|
DEFAULT_CONFIG_FILE_PATH = os.path.join(
|
||||||
|
pathlib.Path(__file__).parent.resolve(), "uncrustify.cfg")
|
||||||
|
|
||||||
|
#
|
||||||
|
# The extension used for formatted files produced by this plugin
|
||||||
|
#
|
||||||
|
FORMATTED_FILE_EXTENSION = ".uncrustify_plugin"
|
||||||
|
|
||||||
|
#
|
||||||
|
# A package can add any additional paths with "AdditionalIncludePaths"
|
||||||
|
# A package can remove any of these paths with "IgnoreStandardPaths"
|
||||||
|
#
|
||||||
|
STANDARD_PLUGIN_DEFINED_PATHS = ("*.c", "*.h")
|
||||||
|
|
||||||
|
#
|
||||||
|
# The Uncrustify application path should set in this environment variable
|
||||||
|
#
|
||||||
|
UNCRUSTIFY_PATH_ENV_KEY = "UNCRUSTIFY_CI_PATH"
|
||||||
|
|
||||||
|
def GetTestName(self, packagename: str, environment: VarDict) -> Tuple:
|
||||||
|
""" Provide the testcase name and classname for use in reporting
|
||||||
|
|
||||||
|
Args:
|
||||||
|
packagename: string containing name of package to build
|
||||||
|
environment: The VarDict for the test to run in
|
||||||
|
Returns:
|
||||||
|
A tuple containing the testcase name and the classname
|
||||||
|
(testcasename, classname)
|
||||||
|
testclassname: a descriptive string for the testcase can include whitespace
|
||||||
|
classname: should be patterned <packagename>.<plugin>.<optionally any unique condition>
|
||||||
|
"""
|
||||||
|
return ("Check file coding standard compliance in " + packagename, packagename + ".UncrustifyCheck")
|
||||||
|
|
||||||
|
def RunBuildPlugin(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], environment_config: Any, plugin_manager: PluginManager, plugin_manager_helper: HelperFunctions, tc: JunitReportTestCase, output_stream=None) -> int:
|
||||||
|
"""
|
||||||
|
External function of plugin. This function is used to perform the task of the CiBuild Plugin.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
- package_rel_path: edk2 workspace relative path to the package
|
||||||
|
- edk2_path: Edk2Path object with workspace and packages paths
|
||||||
|
- package_config: Dictionary with the package configuration
|
||||||
|
- environment_config: Environment configuration
|
||||||
|
- plugin_manager: Plugin Manager Instance
|
||||||
|
- plugin_manager_helper: Plugin Manager Helper Instance
|
||||||
|
- tc: JUnit test case
|
||||||
|
- output_stream: The StringIO output stream from this plugin (logging)
|
||||||
|
|
||||||
|
Returns
|
||||||
|
>0 : Number of errors found
|
||||||
|
0 : Passed successfully
|
||||||
|
-1 : Skipped for missing prereq
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
# Initialize plugin and check pre-requisites.
|
||||||
|
self._initialize_environment_info(
|
||||||
|
package_rel_path, edk2_path, package_config, tc)
|
||||||
|
self._initialize_configuration()
|
||||||
|
self._check_for_preexisting_formatted_files()
|
||||||
|
|
||||||
|
# Log important context information.
|
||||||
|
self._log_uncrustify_app_info()
|
||||||
|
|
||||||
|
# Get template file contents if specified
|
||||||
|
self._get_template_file_contents()
|
||||||
|
|
||||||
|
# Create meta input files & directories
|
||||||
|
self._create_temp_working_directory()
|
||||||
|
self._create_uncrustify_file_list_file()
|
||||||
|
|
||||||
|
self._run_uncrustify()
|
||||||
|
|
||||||
|
# Post-execution actions.
|
||||||
|
self._process_uncrustify_results()
|
||||||
|
|
||||||
|
except UncrustifyException as e:
|
||||||
|
self._tc.LogStdError(
|
||||||
|
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
|
||||||
|
logging.warning(
|
||||||
|
f"Uncrustify error {e.exit_code}. Details:\n\n{str(e)}")
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
if self._formatted_file_error_count > 0:
|
||||||
|
if self._audit_only_mode:
|
||||||
|
logging.info(
|
||||||
|
"Setting test as skipped since AuditOnly is enabled")
|
||||||
|
self._tc.SetSkipped()
|
||||||
|
return -1
|
||||||
|
else:
|
||||||
|
self._tc.SetFailed(
|
||||||
|
f"{self._plugin_name} failed due to {self._formatted_file_error_count} incorrectly formatted files.", "CHECK_FAILED")
|
||||||
|
else:
|
||||||
|
self._tc.SetSuccess()
|
||||||
|
return self._formatted_file_error_count
|
||||||
|
finally:
|
||||||
|
self._cleanup_temporary_formatted_files()
|
||||||
|
self._cleanup_temporary_directory()
|
||||||
|
|
||||||
|
def _initialize_configuration(self) -> None:
|
||||||
|
"""
|
||||||
|
Initializes plugin configuration.
|
||||||
|
"""
|
||||||
|
self._initialize_app_info()
|
||||||
|
self._initialize_config_file_info()
|
||||||
|
self._initialize_file_to_format_info()
|
||||||
|
self._initialize_test_case_output_options()
|
||||||
|
|
||||||
|
def _check_for_preexisting_formatted_files(self) -> None:
|
||||||
|
"""
|
||||||
|
Checks if any formatted files from prior execution are present.
|
||||||
|
|
||||||
|
Existence of such files is an unexpected condition. This might result
|
||||||
|
from an error that occurred during a previous run or a premature exit from a debug scenario. In any case, the package should be clean before starting a new run.
|
||||||
|
"""
|
||||||
|
pre_existing_formatted_file_count = len(
|
||||||
|
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')])
|
||||||
|
|
||||||
|
if pre_existing_formatted_file_count > 0:
|
||||||
|
raise UncrustifyStalePluginFormattedFilesException(
|
||||||
|
f"{pre_existing_formatted_file_count} formatted files already exist. To prevent overwriting these files, please remove them before running this plugin.")
|
||||||
|
|
||||||
|
def _cleanup_temporary_directory(self) -> None:
|
||||||
|
"""
|
||||||
|
Cleans up the temporary directory used for this execution instance.
|
||||||
|
|
||||||
|
This removes the directory and all files created during this instance.
|
||||||
|
"""
|
||||||
|
if hasattr(self, '_working_dir'):
|
||||||
|
self._remove_tree(self._working_dir)
|
||||||
|
|
||||||
|
def _cleanup_temporary_formatted_files(self) -> None:
|
||||||
|
"""
|
||||||
|
Cleans up the temporary formmatted files produced by Uncrustify.
|
||||||
|
|
||||||
|
This will recursively remove all formatted files generated by Uncrustify
|
||||||
|
during this execution instance.
|
||||||
|
"""
|
||||||
|
if hasattr(self, '_abs_package_path'):
|
||||||
|
formatted_files = [str(path.resolve()) for path in pathlib.Path(
|
||||||
|
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
|
||||||
|
|
||||||
|
for formatted_file in formatted_files:
|
||||||
|
os.remove(formatted_file)
|
||||||
|
|
||||||
|
def _create_temp_working_directory(self) -> None:
|
||||||
|
"""
|
||||||
|
Creates the temporary directory used for this execution instance.
|
||||||
|
"""
|
||||||
|
self._working_dir = os.path.join(
|
||||||
|
self._abs_workspace_path, "Build", ".pytool", "Plugin", f"{self._plugin_name}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
pathlib.Path(self._working_dir).mkdir(parents=True, exist_ok=True)
|
||||||
|
except OSError as e:
|
||||||
|
raise UncrustifyInputFileCreationErrorException(
|
||||||
|
f"Error creating plugin directory {self._working_dir}.\n\n{repr(e)}.")
|
||||||
|
|
||||||
|
def _create_uncrustify_file_list_file(self) -> None:
|
||||||
|
"""
|
||||||
|
Creates the file with the list of source files for Uncrustify to process.
|
||||||
|
"""
|
||||||
|
self._app_input_file_path = os.path.join(
|
||||||
|
self._working_dir, "uncrustify_file_list.txt")
|
||||||
|
|
||||||
|
with open(self._app_input_file_path, 'w', encoding='utf8') as f:
|
||||||
|
f.writelines(f"\n".join(self._abs_file_paths_to_format))
|
||||||
|
|
||||||
|
def _execute_uncrustify(self) -> None:
|
||||||
|
"""
|
||||||
|
Executes Uncrustify with the initialized configuration.
|
||||||
|
"""
|
||||||
|
output = StringIO()
|
||||||
|
self._app_exit_code = RunCmd(
|
||||||
|
self._app_path,
|
||||||
|
f"-c {self._app_config_file} -F {self._app_input_file_path} --if-changed --suffix {UncrustifyCheck.FORMATTED_FILE_EXTENSION}", outstream=output)
|
||||||
|
self._app_output = output.getvalue().strip().splitlines()
|
||||||
|
|
||||||
|
def _get_files_ignored_in_config(self):
|
||||||
|
""""
|
||||||
|
Returns a function that returns true if a given file string path is ignored in the plugin configuration file and false otherwise.
|
||||||
|
"""
|
||||||
|
ignored_files = []
|
||||||
|
if "IgnoreFiles" in self._package_config:
|
||||||
|
ignored_files = self._package_config["IgnoreFiles"]
|
||||||
|
|
||||||
|
# Pass "Package configuration file" as the source file path since
|
||||||
|
# the actual configuration file name is unknown to this plugin and
|
||||||
|
# this provides a generic description of the file that provided
|
||||||
|
# the ignore file content.
|
||||||
|
#
|
||||||
|
# This information is only used for reporting (not used here) and
|
||||||
|
# the ignore lines are being passed directly as they are given to
|
||||||
|
# this plugin.
|
||||||
|
return parse_gitignore_lines(ignored_files, "Package configuration file", self._abs_package_path)
|
||||||
|
|
||||||
|
def _get_git_ignored_paths(self) -> List[str]:
|
||||||
|
""""
|
||||||
|
Returns a list of file absolute path strings to all files ignored in this git repository.
|
||||||
|
|
||||||
|
If git is not found, an empty list will be returned.
|
||||||
|
"""
|
||||||
|
if not shutil.which("git"):
|
||||||
|
logging.warn(
|
||||||
|
"Git is not found on this system. Git submodule paths will not be considered.")
|
||||||
|
return []
|
||||||
|
|
||||||
|
outstream_buffer = StringIO()
|
||||||
|
exit_code = RunCmd("git", "ls-files --other",
|
||||||
|
workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
|
||||||
|
if (exit_code != 0):
|
||||||
|
raise UncrustifyGitIgnoreFileException(
|
||||||
|
f"An error occurred reading git ignore settings. This will prevent Uncrustify from running against the expected set of files.")
|
||||||
|
|
||||||
|
# Note: This will potentially be a large list, but at least sorted
|
||||||
|
rel_paths = outstream_buffer.getvalue().strip().splitlines()
|
||||||
|
abs_paths = []
|
||||||
|
for path in rel_paths:
|
||||||
|
abs_paths.append(
|
||||||
|
os.path.normpath(os.path.join(self._abs_workspace_path, path)))
|
||||||
|
return abs_paths
|
||||||
|
|
||||||
|
def _get_git_submodule_paths(self) -> List[str]:
|
||||||
|
"""
|
||||||
|
Returns a list of directory absolute path strings to the root of each submodule in the workspace repository.
|
||||||
|
|
||||||
|
If git is not found, an empty list will be returned.
|
||||||
|
"""
|
||||||
|
if not shutil.which("git"):
|
||||||
|
logging.warn(
|
||||||
|
"Git is not found on this system. Git submodule paths will not be considered.")
|
||||||
|
return []
|
||||||
|
|
||||||
|
if os.path.isfile(os.path.join(self._abs_workspace_path, ".gitmodules")):
|
||||||
|
logging.info(
|
||||||
|
f".gitmodules file found. Excluding submodules in {self._package_name}.")
|
||||||
|
|
||||||
|
outstream_buffer = StringIO()
|
||||||
|
exit_code = RunCmd("git", "config --file .gitmodules --get-regexp path", workingdir=self._abs_workspace_path, outstream=outstream_buffer, logging_level=logging.NOTSET)
|
||||||
|
if (exit_code != 0):
|
||||||
|
raise UncrustifyGitSubmoduleException(
|
||||||
|
f".gitmodule file detected but an error occurred reading the file. Cannot proceed with unknown submodule paths.")
|
||||||
|
|
||||||
|
submodule_paths = []
|
||||||
|
for line in outstream_buffer.getvalue().strip().splitlines():
|
||||||
|
submodule_paths.append(
|
||||||
|
os.path.normpath(os.path.join(self._abs_workspace_path, line.split()[1])))
|
||||||
|
|
||||||
|
return submodule_paths
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
def _get_template_file_contents(self) -> None:
|
||||||
|
"""
|
||||||
|
Gets the contents of Uncrustify template files if they are specified
|
||||||
|
in the Uncrustify configuration file.
|
||||||
|
"""
|
||||||
|
|
||||||
|
self._file_template_contents = None
|
||||||
|
self._func_template_contents = None
|
||||||
|
|
||||||
|
# Allow no value to allow "set" statements in the config file which do
|
||||||
|
# not specify value assignment
|
||||||
|
parser = configparser.ConfigParser(allow_no_value=True)
|
||||||
|
with open(self._app_config_file, 'r') as cf:
|
||||||
|
parser.read_string("[dummy_section]\n" + cf.read())
|
||||||
|
|
||||||
|
try:
|
||||||
|
file_template_name = parser["dummy_section"]["cmt_insert_file_header"]
|
||||||
|
|
||||||
|
file_template_path = pathlib.Path(file_template_name)
|
||||||
|
|
||||||
|
if not file_template_path.is_file():
|
||||||
|
file_template_path = pathlib.Path(os.path.join(self._plugin_path, file_template_name))
|
||||||
|
self._file_template_contents = file_template_path.read_text()
|
||||||
|
except KeyError:
|
||||||
|
logging.warn("A file header template is not specified in the config file.")
|
||||||
|
except FileNotFoundError:
|
||||||
|
logging.warn("The specified file header template file was not found.")
|
||||||
|
try:
|
||||||
|
func_template_name = parser["dummy_section"]["cmt_insert_func_header"]
|
||||||
|
|
||||||
|
func_template_path = pathlib.Path(func_template_name)
|
||||||
|
|
||||||
|
if not func_template_path.is_file():
|
||||||
|
func_template_path = pathlib.Path(os.path.join(self._plugin_path, func_template_name))
|
||||||
|
self._func_template_contents = func_template_path.read_text()
|
||||||
|
except KeyError:
|
||||||
|
logging.warn("A function header template is not specified in the config file.")
|
||||||
|
except FileNotFoundError:
|
||||||
|
logging.warn("The specified function header template file was not found.")
|
||||||
|
|
||||||
|
def _initialize_app_info(self) -> None:
|
||||||
|
"""
|
||||||
|
Initialize Uncrustify application information.
|
||||||
|
|
||||||
|
This function will determine the application path and version.
|
||||||
|
"""
|
||||||
|
# Verify Uncrustify is specified in the environment.
|
||||||
|
if UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY not in os.environ:
|
||||||
|
raise UncrustifyAppEnvVarNotFoundException(
|
||||||
|
f"Uncrustify environment variable {UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY} is not present.")
|
||||||
|
|
||||||
|
self._app_path = shutil.which('uncrustify', path=os.environ[UncrustifyCheck.UNCRUSTIFY_PATH_ENV_KEY])
|
||||||
|
|
||||||
|
if self._app_path is None:
|
||||||
|
raise FileNotFoundError(
|
||||||
|
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
|
||||||
|
|
||||||
|
self._app_path = os.path.normcase(os.path.normpath(self._app_path))
|
||||||
|
|
||||||
|
if not os.path.isfile(self._app_path):
|
||||||
|
raise FileNotFoundError(
|
||||||
|
errno.ENOENT, os.strerror(errno.ENOENT), self._app_path)
|
||||||
|
|
||||||
|
# Verify Uncrustify is present at the expected path.
|
||||||
|
return_buffer = StringIO()
|
||||||
|
ret = RunCmd(self._app_path, "--version", outstream=return_buffer)
|
||||||
|
if (ret != 0):
|
||||||
|
raise UncrustifyAppVersionErrorException(
|
||||||
|
f"Error occurred executing --version: {ret}.")
|
||||||
|
|
||||||
|
# Log Uncrustify version information.
|
||||||
|
self._app_version = return_buffer.getvalue().strip()
|
||||||
|
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
|
||||||
|
version_aggregator.GetVersionAggregator().ReportVersion(
|
||||||
|
"Uncrustify", self._app_version, version_aggregator.VersionTypes.INFO)
|
||||||
|
|
||||||
|
def _initialize_config_file_info(self) -> None:
|
||||||
|
"""
|
||||||
|
Initialize Uncrustify configuration file info.
|
||||||
|
|
||||||
|
The config file path is relative to the package root.
|
||||||
|
"""
|
||||||
|
self._app_config_file = UncrustifyCheck.DEFAULT_CONFIG_FILE_PATH
|
||||||
|
if "ConfigFilePath" in self._package_config:
|
||||||
|
self._app_config_file = self._package_config["ConfigFilePath"].strip()
|
||||||
|
|
||||||
|
self._app_config_file = os.path.normpath(
|
||||||
|
os.path.join(self._abs_package_path, self._app_config_file))
|
||||||
|
|
||||||
|
if not os.path.isfile(self._app_config_file):
|
||||||
|
raise FileNotFoundError(
|
||||||
|
errno.ENOENT, os.strerror(errno.ENOENT), self._app_config_file)
|
||||||
|
|
||||||
|
def _initialize_environment_info(self, package_rel_path: str, edk2_path: Edk2Path, package_config: Dict[str, List[str]], tc: JunitReportTestCase) -> None:
|
||||||
|
"""
|
||||||
|
Initializes plugin environment information.
|
||||||
|
"""
|
||||||
|
self._abs_package_path = edk2_path.GetAbsolutePathOnThisSystemFromEdk2RelativePath(
|
||||||
|
package_rel_path)
|
||||||
|
self._abs_workspace_path = edk2_path.WorkspacePath
|
||||||
|
self._package_config = package_config
|
||||||
|
self._package_name = os.path.basename(
|
||||||
|
os.path.normpath(package_rel_path))
|
||||||
|
self._plugin_name = self.__class__.__name__
|
||||||
|
self._plugin_path = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
self._rel_package_path = package_rel_path
|
||||||
|
self._tc = tc
|
||||||
|
|
||||||
|
def _initialize_file_to_format_info(self) -> None:
|
||||||
|
"""
|
||||||
|
Forms the list of source files for Uncrustify to process.
|
||||||
|
"""
|
||||||
|
# Create a list of all the package relative file paths in the package to run against Uncrustify.
|
||||||
|
rel_file_paths_to_format = list(
|
||||||
|
UncrustifyCheck.STANDARD_PLUGIN_DEFINED_PATHS)
|
||||||
|
|
||||||
|
# Allow the ci.yaml to remove any of the pre-defined standard paths
|
||||||
|
if "IgnoreStandardPaths" in self._package_config:
|
||||||
|
for a in self._package_config["IgnoreStandardPaths"]:
|
||||||
|
if a.strip() in rel_file_paths_to_format:
|
||||||
|
self._tc.LogStdOut(
|
||||||
|
f"Ignoring standard path due to ci.yaml ignore: {a}")
|
||||||
|
rel_file_paths_to_format.remove(a.strip())
|
||||||
|
else:
|
||||||
|
raise UncrustifyInvalidIgnoreStandardPathsException(f"Invalid IgnoreStandardPaths value: {a}")
|
||||||
|
|
||||||
|
# Allow the ci.yaml to specify additional include paths for this package
|
||||||
|
if "AdditionalIncludePaths" in self._package_config:
|
||||||
|
rel_file_paths_to_format.extend(
|
||||||
|
self._package_config["AdditionalIncludePaths"])
|
||||||
|
|
||||||
|
self._abs_file_paths_to_format = []
|
||||||
|
for path in rel_file_paths_to_format:
|
||||||
|
self._abs_file_paths_to_format.extend(
|
||||||
|
[str(path.resolve()) for path in pathlib.Path(self._abs_package_path).rglob(path)])
|
||||||
|
|
||||||
|
# Remove files ignore in the plugin configuration file
|
||||||
|
plugin_ignored_files = list(filter(self._get_files_ignored_in_config(), self._abs_file_paths_to_format))
|
||||||
|
|
||||||
|
if plugin_ignored_files:
|
||||||
|
logging.info(
|
||||||
|
f"{self._package_name} file count before plugin ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||||
|
for path in plugin_ignored_files:
|
||||||
|
if path in self._abs_file_paths_to_format:
|
||||||
|
logging.info(f" File ignored in plugin config file: {path}")
|
||||||
|
self._abs_file_paths_to_format.remove(path)
|
||||||
|
logging.info(
|
||||||
|
f"{self._package_name} file count after plugin ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||||
|
|
||||||
|
if not "SkipGitExclusions" in self._package_config or not self._package_config["SkipGitExclusions"]:
|
||||||
|
# Remove files ignored by git
|
||||||
|
logging.info(
|
||||||
|
f"{self._package_name} file count before git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||||
|
|
||||||
|
ignored_paths = self._get_git_ignored_paths()
|
||||||
|
self._abs_file_paths_to_format = list(
|
||||||
|
set(self._abs_file_paths_to_format).difference(ignored_paths))
|
||||||
|
|
||||||
|
logging.info(
|
||||||
|
f"{self._package_name} file count after git ignore file exclusion: {len(self._abs_file_paths_to_format)}")
|
||||||
|
|
||||||
|
# Remove files in submodules
|
||||||
|
logging.info(
|
||||||
|
f"{self._package_name} file count before submodule exclusion: {len(self._abs_file_paths_to_format)}")
|
||||||
|
|
||||||
|
submodule_paths = tuple(self._get_git_submodule_paths())
|
||||||
|
for path in submodule_paths:
|
||||||
|
logging.info(f" submodule path: {path}")
|
||||||
|
|
||||||
|
self._abs_file_paths_to_format = [
|
||||||
|
f for f in self._abs_file_paths_to_format if not f.startswith(submodule_paths)]
|
||||||
|
|
||||||
|
logging.info(
|
||||||
|
f"{self._package_name} file count after submodule exclusion: {len(self._abs_file_paths_to_format)}")
|
||||||
|
|
||||||
|
# Sort the files for more consistent results
|
||||||
|
self._abs_file_paths_to_format.sort()
|
||||||
|
|
||||||
|
def _initialize_test_case_output_options(self) -> None:
|
||||||
|
"""
|
||||||
|
Initializes options that influence test case output.
|
||||||
|
"""
|
||||||
|
self._audit_only_mode = False
|
||||||
|
self._output_file_diffs = True
|
||||||
|
|
||||||
|
if "AuditOnly" in self._package_config and self._package_config["AuditOnly"]:
|
||||||
|
self._audit_only_mode = True
|
||||||
|
|
||||||
|
if "OutputFileDiffs" in self._package_config and not self._package_config["OutputFileDiffs"]:
|
||||||
|
self._output_file_diffs = False
|
||||||
|
|
||||||
|
def _log_uncrustify_app_info(self) -> None:
|
||||||
|
"""
|
||||||
|
Logs Uncrustify application information.
|
||||||
|
"""
|
||||||
|
self._tc.LogStdOut(f"Found Uncrustify at {self._app_path}")
|
||||||
|
self._tc.LogStdOut(f"Uncrustify version: {self._app_version}")
|
||||||
|
self._tc.LogStdOut('\n')
|
||||||
|
logging.info(f"Found Uncrustify at {self._app_path}")
|
||||||
|
logging.info(f"Uncrustify version: {self._app_version}")
|
||||||
|
logging.info('\n')
|
||||||
|
|
||||||
|
def _process_uncrustify_results(self) -> None:
|
||||||
|
"""
|
||||||
|
Process the results from Uncrustify.
|
||||||
|
|
||||||
|
Determines whether formatting errors are present and logs failures.
|
||||||
|
"""
|
||||||
|
formatted_files = [str(path.resolve()) for path in pathlib.Path(
|
||||||
|
self._abs_package_path).rglob(f'*{UncrustifyCheck.FORMATTED_FILE_EXTENSION}')]
|
||||||
|
|
||||||
|
self._formatted_file_error_count = len(formatted_files)
|
||||||
|
|
||||||
|
if self._formatted_file_error_count > 0:
|
||||||
|
logging.error(
|
||||||
|
"Visit the following instructions to learn "
|
||||||
|
"how to find the detailed formatting errors in Azure "
|
||||||
|
"DevOps CI: "
|
||||||
|
"https://github.com/tianocore/tianocore.github.io/wiki/EDK-II-Code-Formatting#how-to-find-uncrustify-formatting-errors-in-continuous-integration-ci")
|
||||||
|
self._tc.LogStdError("Files with formatting errors:\n")
|
||||||
|
|
||||||
|
if self._output_file_diffs:
|
||||||
|
logging.info("Calculating file diffs. This might take a while...")
|
||||||
|
|
||||||
|
for formatted_file in formatted_files:
|
||||||
|
pre_formatted_file = formatted_file[:-
|
||||||
|
len(UncrustifyCheck.FORMATTED_FILE_EXTENSION)]
|
||||||
|
logging.error(pre_formatted_file)
|
||||||
|
|
||||||
|
if (self._output_file_diffs or
|
||||||
|
self._file_template_contents is not None or
|
||||||
|
self._func_template_contents is not None):
|
||||||
|
self._tc.LogStdError(
|
||||||
|
f"Formatting errors in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
||||||
|
|
||||||
|
with open(formatted_file) as ff:
|
||||||
|
formatted_file_text = ff.read()
|
||||||
|
|
||||||
|
if (self._file_template_contents is not None and
|
||||||
|
self._file_template_contents in formatted_file_text):
|
||||||
|
self._tc.LogStdError(f"File header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
||||||
|
|
||||||
|
if (self._func_template_contents is not None and
|
||||||
|
self._func_template_contents in formatted_file_text):
|
||||||
|
self._tc.LogStdError(f"A function header is missing in {os.path.relpath(pre_formatted_file, self._abs_package_path)}\n")
|
||||||
|
|
||||||
|
if self._output_file_diffs:
|
||||||
|
with open(pre_formatted_file) as pf:
|
||||||
|
pre_formatted_file_text = pf.read()
|
||||||
|
|
||||||
|
for line in difflib.unified_diff(pre_formatted_file_text.split('\n'), formatted_file_text.split('\n'), fromfile=pre_formatted_file, tofile=formatted_file, n=3):
|
||||||
|
self._tc.LogStdError(line)
|
||||||
|
|
||||||
|
self._tc.LogStdError('\n')
|
||||||
|
else:
|
||||||
|
self._tc.LogStdError(pre_formatted_file)
|
||||||
|
|
||||||
|
def _remove_tree(self, dir_path: str, ignore_errors: bool = False) -> None:
|
||||||
|
"""
|
||||||
|
Helper for removing a directory. Over time there have been
|
||||||
|
many private implementations of this due to reliability issues in the
|
||||||
|
shutil implementations. To consolidate on a single function this helper is added.
|
||||||
|
|
||||||
|
On error try to change file attributes. Also add retry logic.
|
||||||
|
|
||||||
|
This function is temporarily borrowed from edk2toollib.utility_functions
|
||||||
|
since the version used in edk2 is not recent enough to include the
|
||||||
|
function.
|
||||||
|
|
||||||
|
This function should be replaced by "RemoveTree" when it is available.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
- dir_path: Path to directory to remove.
|
||||||
|
- ignore_errors: Whether to ignore errors during removal
|
||||||
|
"""
|
||||||
|
|
||||||
|
def _remove_readonly(func, path, _):
|
||||||
|
"""
|
||||||
|
Private function to attempt to change permissions on file/folder being deleted.
|
||||||
|
"""
|
||||||
|
os.chmod(path, os.stat.S_IWRITE)
|
||||||
|
func(path)
|
||||||
|
|
||||||
|
for _ in range(3): # retry up to 3 times
|
||||||
|
try:
|
||||||
|
shutil.rmtree(dir_path, ignore_errors=ignore_errors, onerror=_remove_readonly)
|
||||||
|
except OSError as err:
|
||||||
|
logging.warning(f"Failed to fully remove {dir_path}: {err}")
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise RuntimeError(f"Failed to remove {dir_path}")
|
||||||
|
|
||||||
|
def _run_uncrustify(self) -> None:
|
||||||
|
"""
|
||||||
|
Runs Uncrustify for this instance of plugin execution.
|
||||||
|
"""
|
||||||
|
logging.info("Executing Uncrustify. This might take a while...")
|
||||||
|
start_time = timeit.default_timer()
|
||||||
|
self._execute_uncrustify()
|
||||||
|
end_time = timeit.default_timer() - start_time
|
||||||
|
|
||||||
|
execution_summary = f"Uncrustify executed against {len(self._abs_file_paths_to_format)} files in {self._package_name} in {end_time:.2f} seconds.\n"
|
||||||
|
|
||||||
|
self._tc.LogStdOut(execution_summary)
|
||||||
|
logging.info(execution_summary)
|
||||||
|
|
||||||
|
if self._app_exit_code != 0 and self._app_exit_code != 1:
|
||||||
|
raise UncrustifyAppExecutionException(
|
||||||
|
f"Error {str(self._app_exit_code)} returned from Uncrustify:\n\n{str(self._app_output)}")
|
9
.pytool/Plugin/UncrustifyCheck/default_file_header.txt
Normal file
9
.pytool/Plugin/UncrustifyCheck/default_file_header.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/** @file
|
||||||
|
Brief description of the file's purpose.
|
||||||
|
|
||||||
|
Detailed description of the file's contents and other useful
|
||||||
|
information for a person viewing the file for the first time.
|
||||||
|
|
||||||
|
<<Copyright>>
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
**/
|
15
.pytool/Plugin/UncrustifyCheck/default_function_header.txt
Normal file
15
.pytool/Plugin/UncrustifyCheck/default_function_header.txt
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
Brief description of this function's purpose.
|
||||||
|
|
||||||
|
Follow it immediately with the detailed description.
|
||||||
|
|
||||||
|
@param[in] Arg1 Description of Arg1.
|
||||||
|
@param[in] Arg2 Description of Arg2 This is complicated and requires
|
||||||
|
multiple lines to describe.
|
||||||
|
@param[out] Arg3 Description of Arg3.
|
||||||
|
@param[in, out] Arg4 Description of Arg4.
|
||||||
|
|
||||||
|
@retval VAL_ONE Description of what VAL_ONE signifies.
|
||||||
|
@retval OTHER This is the only other return value. If there were other
|
||||||
|
return values, they would be listed.
|
||||||
|
**/
|
462
.pytool/Plugin/UncrustifyCheck/uncrustify.cfg
Normal file
462
.pytool/Plugin/UncrustifyCheck/uncrustify.cfg
Normal file
@@ -0,0 +1,462 @@
|
|||||||
|
## @file
|
||||||
|
# Uncrustify Configuration File for EDK II C Code
|
||||||
|
#
|
||||||
|
# Coding Standard: https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/
|
||||||
|
#
|
||||||
|
# This configuration file is meant to be a "best attempt" to align with the
|
||||||
|
# definitions in the EDK II C Coding Standards Specification.
|
||||||
|
#
|
||||||
|
# Copyright (c) Microsoft Corporation.
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
##
|
||||||
|
|
||||||
|
# Force UTF-8 encoding (no UTF-16)
|
||||||
|
enable_digraphs = false
|
||||||
|
utf8_byte = false
|
||||||
|
utf8_force = true
|
||||||
|
|
||||||
|
# Code width / line splitting
|
||||||
|
#code_width =120 # TODO: This causes non-deterministic behaviour in some cases when code wraps
|
||||||
|
ls_code_width =false
|
||||||
|
ls_for_split_full =true
|
||||||
|
ls_func_split_full =true
|
||||||
|
pos_comma =trail
|
||||||
|
|
||||||
|
# 5.1.7 All files must end with CRLF
|
||||||
|
newlines = crlf
|
||||||
|
|
||||||
|
# 5.1.2 Do not use tab characters
|
||||||
|
|
||||||
|
cmt_convert_tab_to_spaces = true # Whether to convert all tabs to spaces in comments. If false, tabs in
|
||||||
|
# comments are left alone, unless used for indenting.
|
||||||
|
indent_columns = 2 # Number of spaces for indentation
|
||||||
|
indent_with_tabs = 0 # Do not use TAB characters
|
||||||
|
string_replace_tab_chars = true # Replace TAB with SPACE
|
||||||
|
# Note: This will break .robot files but is needed for edk2 style
|
||||||
|
|
||||||
|
# 5.2.1.1 There shall be only one statement on a line (statement ends with ;)
|
||||||
|
nl_multi_line_cond = true # Add a newline between ')' and '{' if the ')' is on a different line than
|
||||||
|
# the if/for/etc.
|
||||||
|
nl_after_semicolon = true # Whether to add a newline after semicolons, except in 'for' statements.
|
||||||
|
|
||||||
|
# 5.2.1.3 An open brace '{' goes on the same line as the closing parenthesis ')' of simple predicate expressions
|
||||||
|
mod_full_brace_do = add # Add or remove braces on a single-line 'do' statement.
|
||||||
|
mod_full_brace_for = add
|
||||||
|
mod_full_brace_function = add # Add or remove braces on a single-line function definition.
|
||||||
|
mod_full_brace_if = add # Add or remove braces on a single-line 'if' statement. Braces will not be
|
||||||
|
# removed if the braced statement contains an 'else'.
|
||||||
|
mod_full_brace_if_chain = false
|
||||||
|
mod_full_brace_while = add
|
||||||
|
|
||||||
|
# 5.2.1.4 A close brace '}' always goes at the beginning of the last line of the body
|
||||||
|
eat_blanks_after_open_brace = true
|
||||||
|
eat_blanks_before_close_brace = true # Whether to remove blank lines before '}'.
|
||||||
|
|
||||||
|
# 5.2.2.2 Always put space before and after binary operators.
|
||||||
|
sp_assign = add # Add or remove space around assignment operator '=', '+=', etc.
|
||||||
|
sp_assign_default = add
|
||||||
|
sp_bool = add # Add or remove space around boolean operators '&&' and '||'.
|
||||||
|
sp_compare = add # Add or remove space around compare operator '<', '>', '==', etc.
|
||||||
|
|
||||||
|
# 5.2.2.3 Do not put space between unary operators and their object
|
||||||
|
sp_addr = remove # A or remove space after the '&' (address-of) unary operator.
|
||||||
|
sp_incdec = remove # Add or remove space between '++' and '--' the word to which it is being
|
||||||
|
# applied, as in '(--x)' or 'y++;'.
|
||||||
|
sp_inv = remove # Add or remove space after the '~' (invert) unary operator.
|
||||||
|
sp_not = remove # Add or remove space after the '!' (not) unary operator.
|
||||||
|
sp_sign = remove # Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'.
|
||||||
|
|
||||||
|
# 5.2.2.4 Subsequent lines of multi-line function calls should line up two spaces from the beginning of the function
|
||||||
|
# name
|
||||||
|
nl_func_call_args_multi_line = true # Whether to add a newline after each ',' in a function call if '(' and ')'
|
||||||
|
# are in different lines.
|
||||||
|
nl_func_call_args_multi_line_ignore_closures = false
|
||||||
|
|
||||||
|
# - Indent each argument 2 spaces from the start of the function name. If a
|
||||||
|
# function is called through a structure or union member, of type
|
||||||
|
# pointer-to-function, then indent each argument 2 spaces from the start of the
|
||||||
|
# member name.
|
||||||
|
indent_func_call_edk2_style = true # Use EDK2 indentation style for function calls (**CUSTOM SETTING**)
|
||||||
|
indent_paren_after_func_call = true # Whether to indent the open parenthesis of a function call, if the
|
||||||
|
# parenthesis is on its own line.
|
||||||
|
|
||||||
|
# - Align the close parenthesis with the start of the last argument
|
||||||
|
indent_paren_close = 0 # How to indent a close parenthesis after a newline.
|
||||||
|
# (0: Body, 1: Openparenthesis, 2: Brace level)
|
||||||
|
|
||||||
|
|
||||||
|
# 5.2.2.5 Always put space after commas or semicolons that separate items
|
||||||
|
sp_after_comma = force # Add or remove space after ',', i.e. 'a,b' vs. 'a, b'.
|
||||||
|
sp_before_comma = remove # Add or remove space before ','.
|
||||||
|
|
||||||
|
# 5.2.2.6 Always put space before an open parenthesis
|
||||||
|
sp_after_sparen = add # Add or remove space after ')' of control statements.
|
||||||
|
sp_attribute_paren = add # Add or remove space between '__attribute__' and '('.
|
||||||
|
sp_before_sparen = force # Add or remove space before '(' of control statements
|
||||||
|
# ('if', 'for', 'switch', 'while', etc.).
|
||||||
|
sp_defined_paren = force # Add or remove space between 'defined' and '(' in '#if defined (FOO)'.
|
||||||
|
sp_func_call_paren = force # Add or remove space between function name and '(' on function calls.
|
||||||
|
sp_func_call_paren_empty = force # Add or remove space between function name and '()' on function calls
|
||||||
|
# without parameters. If set to ignore (the default), sp_func_call_paren is
|
||||||
|
# used.
|
||||||
|
sp_func_def_paren = add # Add or remove space between alias name and '(' of a non-pointer function
|
||||||
|
# type typedef.
|
||||||
|
sp_func_proto_paren = add # Add or remove space between function name and '()' on function declaration
|
||||||
|
sp_sizeof_paren = force # Add or remove space between 'sizeof' and '('.
|
||||||
|
sp_type_func = add # Add or remove space between return type and function name. A minimum of 1
|
||||||
|
# is forced except for pointer return types.
|
||||||
|
|
||||||
|
# Not specified, but also good style to remove spaces inside parentheses (Optional)
|
||||||
|
sp_cparen_oparen = remove # Add or remove space between back-to-back parentheses, i.e. ')(' vs. ') ('.
|
||||||
|
sp_inside_fparen = remove # Add or remove space inside function '(' and ')'.
|
||||||
|
sp_inside_fparens = remove # Add or remove space inside empty function '()'.
|
||||||
|
sp_inside_paren = remove # Add or remove space inside '(' and ')'.
|
||||||
|
sp_inside_paren_cast = remove # Add or remove spaces inside cast parentheses. '(int)x'
|
||||||
|
sp_inside_square = remove # Add or remove space inside a non-empty '[' and ']'.
|
||||||
|
sp_paren_paren = remove # Add or remove space between nested parentheses, i.e. '((' vs. ') )'.
|
||||||
|
sp_square_fparen = remove # Add or remove space between ']' and '(' when part of a function call.
|
||||||
|
|
||||||
|
# 5.2.2.7 Put a space before an open brace if it is not on its own line
|
||||||
|
sp_do_brace_open = force # Add or remove space between 'do' and '{'.
|
||||||
|
sp_paren_brace = force # Add or remove space between ')' and '{'.
|
||||||
|
sp_sparen_brace = force # Add or remove space between ')' and '{' of of control statements.
|
||||||
|
|
||||||
|
# 5.2.2.8 Do not put spaces around structure member and pointer operators
|
||||||
|
sp_after_byref = remove # Add or remove space after reference sign '&', if followed by a word.
|
||||||
|
sp_before_byref = add # Add or remove space before a reference sign '&'.
|
||||||
|
sp_deref = remove # Add or remove space after the '*' (dereference) unary operator. This does
|
||||||
|
# not affect the spacing after a '*' that is part of a type.
|
||||||
|
sp_member = remove # Add or remove space around the '.' or '->' operators.
|
||||||
|
|
||||||
|
# 5.2.2.9 Do not put spaces before open brackets of array subscripts
|
||||||
|
sp_before_square = remove # Add or remove space before '[' (except '[]').
|
||||||
|
sp_before_squares = remove # Add or remove space before '[]'.
|
||||||
|
sp_before_vardef_square = remove # Add or remove space before '[' for a variable definition.
|
||||||
|
|
||||||
|
# 5.2.2.10 Use extra parentheses rather than depending on in-depth knowledge of the order of precedence of C
|
||||||
|
mod_full_paren_if_bool = true # Whether to fully parenthesize Boolean expressions in 'while' and 'if'
|
||||||
|
# statement, as in 'if (a && b > c)' => 'if (a && (b > c))'.
|
||||||
|
|
||||||
|
# 5.2.2.11 Align a continuation line with the part of the line that it continues.
|
||||||
|
use_indent_continue_only_once = true
|
||||||
|
|
||||||
|
# Additional '{}' bracing rules (Optional)
|
||||||
|
# NOTE - The style guide specifies two different styles for braces,
|
||||||
|
# so these are ignored for now to allow developers some flexibility.
|
||||||
|
nl_after_brace_close = true # Whether to add a newline after '}'. Does not apply if followed by a
|
||||||
|
# necessary ';'.
|
||||||
|
nl_brace_else = remove # Add or remove newline between '}' and 'else'.
|
||||||
|
nl_brace_while = remove # Add or remove newline between '}' and 'while' of 'do' statement.
|
||||||
|
nl_do_brace = remove # Add or remove newline between 'do' and '{'.
|
||||||
|
nl_else_brace = remove # Add or remove newline between 'else' and '{'.
|
||||||
|
nl_else_if = remove # Add or remove newline between 'else' and 'if'.
|
||||||
|
nl_elseif_brace = remove # Add or remove newline between 'else if' and '{'.
|
||||||
|
nl_enum_brace = remove # Add or remove newline between 'enum' and '{'.
|
||||||
|
nl_fcall_brace = remove # Add or remove newline between a function call's ')' and '{',
|
||||||
|
# as in 'list_for_each(item, &list) { }'.
|
||||||
|
nl_for_brace = remove # Add or remove newline between 'for' and '{'.
|
||||||
|
nl_if_brace = remove # Add or remove newline between 'if' and '{'.
|
||||||
|
nl_struct_brace = remove # Add or remove newline between 'struct and '{'.
|
||||||
|
nl_switch_brace = remove # Add or remove newline between 'switch' and '{'.
|
||||||
|
nl_union_brace = remove # Add or remove newline between 'union' and '{'.
|
||||||
|
nl_while_brace = remove # Add or remove newline between 'while' and '{'.
|
||||||
|
|
||||||
|
# Additional whitespace rules (Optional)
|
||||||
|
sp_after_ptr_star = remove # Add or remove space after pointer star '*', if followed by a word.
|
||||||
|
# Useful when paired with align_var_def_star_style==2
|
||||||
|
sp_after_ptr_star_func = remove # Add or remove space after a pointer star '*', if followed by a function
|
||||||
|
# prototype or function definition.
|
||||||
|
sp_after_semi = remove # Add or remove space after ';', except when followed by a comment.
|
||||||
|
sp_before_case_colon = remove # Add or remove space before case ':'.
|
||||||
|
sp_before_ptr_star = add # Add or remove space before pointer star '*'.
|
||||||
|
sp_before_ptr_star_func = add # Add or remove space before a pointer star '*', if followed by a function
|
||||||
|
# prototype or function definition.
|
||||||
|
sp_before_semi = remove # Add or remove space before ';'
|
||||||
|
sp_before_semi_for = remove # Add or remove space before ';' in non-empty 'for' statements.
|
||||||
|
sp_before_semi_for_empty = add # Add or remove space before a semicolon of an empty part of a for statement
|
||||||
|
sp_between_ptr_star = remove # Add or remove space between pointer stars '*'. (ie, 'VOID **')
|
||||||
|
sp_brace_close_while = force # Add or remove space between '}' and 'while'.
|
||||||
|
|
||||||
|
sp_after_cast = remove
|
||||||
|
sp_after_type = add
|
||||||
|
sp_balance_nested_parens = false
|
||||||
|
sp_before_nl_cont = add
|
||||||
|
sp_before_square_asm_block = ignore
|
||||||
|
sp_before_unnamed_byref = add
|
||||||
|
sp_brace_brace = ignore
|
||||||
|
sp_brace_else = force
|
||||||
|
sp_brace_typedef = add
|
||||||
|
sp_case_label = force
|
||||||
|
sp_cmt_cpp_doxygen = true
|
||||||
|
sp_cond_colon = add
|
||||||
|
sp_cond_question = add
|
||||||
|
sp_cpp_cast_paren = force
|
||||||
|
sp_else_brace = force
|
||||||
|
sp_endif_cmt = force
|
||||||
|
sp_enum_assign = add
|
||||||
|
sp_inside_braces = force
|
||||||
|
sp_inside_braces_empty = force
|
||||||
|
sp_inside_braces_enum = force
|
||||||
|
sp_inside_braces_struct = force
|
||||||
|
sp_pp_concat = add
|
||||||
|
sp_pp_stringify = add
|
||||||
|
sp_return_paren = add
|
||||||
|
sp_special_semi = force
|
||||||
|
sp_while_paren_open = force
|
||||||
|
|
||||||
|
# Additional Indentation Rules
|
||||||
|
indent_access_spec = 1
|
||||||
|
indent_access_spec_body = false
|
||||||
|
indent_align_assign = true
|
||||||
|
indent_align_string = true
|
||||||
|
indent_bool_paren = true
|
||||||
|
indent_brace_parent = false
|
||||||
|
indent_braces = false
|
||||||
|
indent_braces_no_class = false
|
||||||
|
indent_braces_no_func = true
|
||||||
|
indent_braces_no_struct = false
|
||||||
|
indent_class = false
|
||||||
|
indent_class_colon = false
|
||||||
|
indent_cmt_with_tabs = false # Whether to indent comments that are not at a brace level with tabs on
|
||||||
|
# a tabstop. Requires indent_with_tabs=2. If false, will use spaces.
|
||||||
|
indent_col1_comment = true
|
||||||
|
indent_col1_multi_string_literal= true
|
||||||
|
indent_comma_paren = true
|
||||||
|
indent_else_if = true
|
||||||
|
indent_extern = false
|
||||||
|
indent_first_bool_expr = true
|
||||||
|
|
||||||
|
indent_func_def_param_paren_pos_threshold = 0
|
||||||
|
indent_func_param_double = false
|
||||||
|
indent_func_proto_param = true
|
||||||
|
indent_ignore_asm_block = true
|
||||||
|
indent_label = 1
|
||||||
|
indent_member = 2
|
||||||
|
indent_namespace = false
|
||||||
|
indent_param = 2
|
||||||
|
indent_paren_nl = false
|
||||||
|
indent_paren_open_brace = false
|
||||||
|
indent_preserve_sql = false
|
||||||
|
indent_relative_single_line_comments = false
|
||||||
|
indent_sing_line_comments = 0
|
||||||
|
indent_single_newlines = false
|
||||||
|
indent_square_nl = false
|
||||||
|
indent_switch_case = 2
|
||||||
|
indent_template_param = true
|
||||||
|
indent_var_def_blk = 0
|
||||||
|
indent_var_def_cont = false
|
||||||
|
|
||||||
|
# Tidy-up rules (Optional)
|
||||||
|
mod_move_case_break = true # Whether to move a 'break' that appears after a fully braced 'case'
|
||||||
|
# before the close brace, as in 'case X: { ... } break;' =>
|
||||||
|
# 'case X: { ... break; }'.
|
||||||
|
mod_pawn_semicolon = false
|
||||||
|
mod_remove_empty_return = false # Whether to remove a void 'return;' that appears as the last statement
|
||||||
|
# in a function.
|
||||||
|
mod_remove_extra_semicolon = true
|
||||||
|
mod_sort_import = false
|
||||||
|
mod_sort_include = false
|
||||||
|
mod_sort_using = false
|
||||||
|
nl_after_case = false # Whether to add a newline after a 'case' statement.
|
||||||
|
nl_end_of_file = force # Add or remove newline at the end of the file.
|
||||||
|
nl_end_of_file_min = 1 # The minimum number of newlines at the end of the file
|
||||||
|
nl_max = 2 # The maximum number of consecutive newlines (3 = 2 blank lines).
|
||||||
|
nl_start_of_file = remove # Add or remove newlines at the start of the file.
|
||||||
|
|
||||||
|
# Code alignment rules (Optional)
|
||||||
|
align_asm_colon = false
|
||||||
|
align_assign_span = 1 # The span for aligning on '=' in assignments.
|
||||||
|
align_assign_thresh = 0
|
||||||
|
align_edk2_style = true # Whether to apply edk2-specific alignment formatting
|
||||||
|
align_enum_equ_span = 1 # The span for aligning on '=' in enums.
|
||||||
|
align_func_params = true # Whether to align variable definitions in prototypes and functions.
|
||||||
|
align_func_params_gap = 2
|
||||||
|
align_func_params_span = 2 # The span for aligning parameter definitions in function on parameter name.
|
||||||
|
align_func_params_thresh = 0
|
||||||
|
align_func_proto_span = 0
|
||||||
|
align_keep_tabs = false
|
||||||
|
align_left_shift = false
|
||||||
|
align_mix_var_proto = false
|
||||||
|
align_nl_cont = false
|
||||||
|
align_oc_decl_colon = false
|
||||||
|
align_on_operator = false
|
||||||
|
align_on_tabstop = false
|
||||||
|
align_pp_define_gap = 2
|
||||||
|
align_pp_define_span = 1
|
||||||
|
align_right_cmt_at_col = 0 # Align trailing comment at or beyond column N; 'pulls in' comments as
|
||||||
|
# a bonus side effect (0=ignore)
|
||||||
|
align_right_cmt_gap = 0 # If a trailing comment is more than this number of columns away from the
|
||||||
|
# text it follows,
|
||||||
|
# it will qualify for being aligned. This has to be > 0 to do anything.
|
||||||
|
align_right_cmt_mix = false # If aligning comments, mix with comments after '}' and #endif with less
|
||||||
|
# than 3 spaces before the comment
|
||||||
|
align_right_cmt_same_level = true # Whether to only align trailing comments that are at the same brace level.
|
||||||
|
align_right_cmt_span = 2 # The span for aligning comments that end lines.
|
||||||
|
align_same_func_call_params = false
|
||||||
|
align_single_line_brace = true
|
||||||
|
align_single_line_func = true
|
||||||
|
align_struct_init_span = 1 # The span for aligning struct initializer values.
|
||||||
|
align_typedef_amp_style = 1
|
||||||
|
align_typedef_func = 1 # How to align typedef'd functions with other typedefs.
|
||||||
|
# (0: No align, 1: Align open paranthesis, 2: Align function type name)
|
||||||
|
align_typedef_gap = 2
|
||||||
|
align_typedef_span = 1 # The span for aligning single-line typedefs.
|
||||||
|
align_typedef_star_style = 1
|
||||||
|
align_var_def_amp_style = 1
|
||||||
|
align_var_def_attribute = true
|
||||||
|
align_var_def_colon = true # Whether to align the colon in struct bit fields.
|
||||||
|
align_var_def_gap = 2 # The gap (minimum spacing for aligned items) for variable definitions.
|
||||||
|
align_var_def_inline = false
|
||||||
|
align_var_def_span = 1 # The span (lines needed to align) for aligning variable definitions.
|
||||||
|
align_var_def_star_style = 1 # How to consider (or treat) the '*' in the alignment of variable
|
||||||
|
# definitions.
|
||||||
|
# 0: Part of the type 'void * foo;' (default)
|
||||||
|
# 1: Part of the variable 'void *foo;'
|
||||||
|
# 2: Dangling 'void *foo;'
|
||||||
|
# (Note - should also set sp_after_ptr_star=remove)
|
||||||
|
align_var_struct_gap = 4
|
||||||
|
align_var_struct_span = 8 # The span for aligning struct/union member definitions.
|
||||||
|
align_var_struct_thresh = 0
|
||||||
|
align_with_tabs = false
|
||||||
|
|
||||||
|
# Comment formatting
|
||||||
|
cmt_align_doxygen_javadoc_tags = true # Whether to align doxygen javadoc-style tags ('@param', '@return', etc.)
|
||||||
|
# TODO: Eats '[' in '[in]'
|
||||||
|
cmt_c_group = false
|
||||||
|
cmt_c_nl_end = true # Whether to add a newline before the closing '*/' of the combined c-comment.
|
||||||
|
cmt_c_nl_start = true
|
||||||
|
cmt_cpp_group = false
|
||||||
|
cmt_cpp_nl_end = true
|
||||||
|
cmt_cpp_nl_start = true
|
||||||
|
cmt_cpp_to_c = false
|
||||||
|
cmt_indent_multi = false # Whether to apply changes to multi-line comments, including cmt_width,
|
||||||
|
# keyword substitution and leading chars.
|
||||||
|
cmt_insert_before_preproc = false
|
||||||
|
#cmt_insert_file_header = default_file_header.txt
|
||||||
|
#cmt_insert_func_header = default_function_header.txt
|
||||||
|
cmt_multi_check_last = false
|
||||||
|
cmt_multi_first_len_minimum = 2
|
||||||
|
cmt_reflow_mode = 1 # How to reflow comments.
|
||||||
|
# (0:No reflow, 1:No touching at all, 2: Full reflow)
|
||||||
|
cmt_sp_after_star_cont = 0 # The number of spaces to insert after the star on subsequent comment lines.
|
||||||
|
cmt_sp_before_star_cont = 0 # The number of spaces to insert at the start of subsequent comment lines.
|
||||||
|
cmt_star_cont = false # Whether to put a star on subsequent comment lines.
|
||||||
|
cmt_width = 120 # Try to wrap comments at N columns.
|
||||||
|
sp_cmt_cpp_start = add # Add or remove space after the opening of a C++ comment, as in
|
||||||
|
# '// <here> A'. NOTE: Breaks indentation within comments.
|
||||||
|
|
||||||
|
# Function definitions / declarations
|
||||||
|
indent_func_call_param = false # Whether to indent continued function call parameters one indent level,
|
||||||
|
# rather than aligning parameters under the open parenthesis.
|
||||||
|
indent_func_class_param = false # Whether to indent continued function call declaration one indent level,
|
||||||
|
# rather than aligning parameters under the open parenthesis.
|
||||||
|
indent_func_ctor_var_param = false # Whether to indent continued class variable constructors one indent level,
|
||||||
|
# rather than aligning parameters under the open parenthesis.
|
||||||
|
indent_func_def_param = true # Whether to indent continued function definition parameters one indent
|
||||||
|
# level, rather than aligning parameters under the open parenthesis.
|
||||||
|
nl_fdef_brace = add # Add or remove newline between function signature and '{'.
|
||||||
|
nl_func_call_end_multi_line = true # Whether to add a newline before ')' in a function call if '(' and ')' are
|
||||||
|
# in different lines.
|
||||||
|
nl_func_call_paren = remove # Add or remove newline between a function name and the opening '(' in the
|
||||||
|
# call.
|
||||||
|
nl_func_call_start_multi_line = true # Whether to add a newline after '(' in a function call if '(' and ')' are
|
||||||
|
# in different lines.
|
||||||
|
nl_func_decl_args = force # Add or remove newline after each ',' in a function declaration.
|
||||||
|
nl_func_decl_empty = add # Add or remove newline between '()' in a function declaration.
|
||||||
|
nl_func_def_args = force # Add or remove newline after each ',' in a function definition.
|
||||||
|
nl_func_def_empty = add # Add or remove newline between '()' in a function definition.
|
||||||
|
nl_func_def_paren = remove # Add or remove newline between a function name and the opening '('
|
||||||
|
# in the definition.
|
||||||
|
nl_func_paren = remove # Add or remove newline between a function name and the opening '(' in
|
||||||
|
# the declaration.
|
||||||
|
nl_func_type_name = add # Add or remove newline between return type and function name in a function
|
||||||
|
# definition.
|
||||||
|
sp_fparen_brace = force # Add or remove space between ')' and '{' of function.
|
||||||
|
use_indent_func_call_param = true # indent_func_call_param will be used
|
||||||
|
|
||||||
|
# Additional Newline Rules
|
||||||
|
nl_after_brace_open = true # Whether to add a newline after '{'. This also adds a newline
|
||||||
|
# before the matching '}'.
|
||||||
|
nl_after_brace_open_cmt = true # Whether to add a newline between the open brace and a
|
||||||
|
# trailing single-line comment.
|
||||||
|
# Requires nl_after_brace_open = true.
|
||||||
|
nl_after_do = add # Add or remove blank line after 'do/while' statement.
|
||||||
|
nl_after_for = add # Add or remove blank line after 'for' statement.
|
||||||
|
nl_after_func_body = 2 # The number of newlines after '}' of a multi-line function body
|
||||||
|
nl_after_func_body_one_liner = 2
|
||||||
|
nl_after_func_proto = 2
|
||||||
|
nl_after_func_proto_group = 2
|
||||||
|
nl_after_if = add
|
||||||
|
nl_after_multiline_comment = false
|
||||||
|
nl_after_return = false
|
||||||
|
nl_after_struct = 2
|
||||||
|
nl_after_switch = add
|
||||||
|
nl_after_vbrace_close = true
|
||||||
|
nl_after_vbrace_open = true
|
||||||
|
nl_after_vbrace_open_empty = true
|
||||||
|
nl_after_while = add
|
||||||
|
nl_assign_leave_one_liners = true
|
||||||
|
nl_before_block_comment = 2
|
||||||
|
nl_before_case = false
|
||||||
|
nl_before_do = ignore
|
||||||
|
nl_before_for = ignore
|
||||||
|
nl_before_if = ignore
|
||||||
|
nl_before_switch = ignore
|
||||||
|
nl_before_while = ignore
|
||||||
|
nl_before_whole_file_ifdef = 2
|
||||||
|
nl_brace_brace = force
|
||||||
|
nl_brace_struct_var = remove
|
||||||
|
nl_case_colon_brace = add
|
||||||
|
nl_class_leave_one_liners = false
|
||||||
|
nl_collapse_empty_body = false
|
||||||
|
nl_comment_func_def = 1
|
||||||
|
nl_create_for_one_liner = false
|
||||||
|
nl_create_if_one_liner = false
|
||||||
|
nl_create_while_one_liner = false
|
||||||
|
nl_define_macro = false
|
||||||
|
nl_ds_struct_enum_close_brace = true
|
||||||
|
nl_ds_struct_enum_cmt = false
|
||||||
|
nl_enum_leave_one_liners = false
|
||||||
|
nl_func_decl_end = add
|
||||||
|
nl_func_decl_start = add
|
||||||
|
nl_func_def_end = add
|
||||||
|
nl_func_def_start = add
|
||||||
|
nl_func_leave_one_liners = false
|
||||||
|
nl_func_proto_type_name = add
|
||||||
|
nl_func_var_def_blk = 1
|
||||||
|
nl_getset_leave_one_liners = false
|
||||||
|
nl_if_leave_one_liners = false
|
||||||
|
nl_multi_line_define = false
|
||||||
|
nl_squeeze_ifdef = false
|
||||||
|
nl_var_def_blk_end = 0
|
||||||
|
nl_var_def_blk_start = 0
|
||||||
|
|
||||||
|
# Preprocessor Rules
|
||||||
|
pp_define_at_level = true
|
||||||
|
pp_if_indent_code = false
|
||||||
|
pp_indent_func_def = false
|
||||||
|
pp_indent_extern = false
|
||||||
|
pp_ignore_define_body = true # Workaround: Turn off processing for #define body
|
||||||
|
# (current rules do not work for some defines)
|
||||||
|
pp_indent = add
|
||||||
|
pp_indent_at_level = true
|
||||||
|
pp_indent_count = 2
|
||||||
|
pp_indent_if = 2
|
||||||
|
pp_indent_region = 2
|
||||||
|
pp_region_indent_code = false
|
||||||
|
pp_space = remove
|
||||||
|
|
||||||
|
#
|
||||||
|
# The tokens below are assigned specific types so they are always recognized properly.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Explicitly define EDK II qualifiers
|
||||||
|
set QUALIFIER CONST
|
||||||
|
set QUALIFIER EFIAPI
|
||||||
|
set QUALIFIER IN
|
||||||
|
set QUALIFIER OPTIONAL
|
||||||
|
set QUALIFIER OUT
|
||||||
|
|
||||||
|
# Explicitly define EDK II types
|
||||||
|
set TYPE EFI_STATUS
|
||||||
|
set TYPE VOID
|
16
.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml
Normal file
16
.pytool/Plugin/UncrustifyCheck/uncrustify_ext_dep.yaml
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
## @file
|
||||||
|
# Downloads the Uncrustify application from a Project Mu NuGet package.
|
||||||
|
#
|
||||||
|
# Copyright (c) Microsoft Corporation.
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
##
|
||||||
|
{
|
||||||
|
"id": "uncrustify-ci-1",
|
||||||
|
"scope": "cibuild",
|
||||||
|
"type": "nuget",
|
||||||
|
"name": "mu-uncrustify-release",
|
||||||
|
"source": "https://pkgs.dev.azure.com/projectmu/Uncrustify/_packaging/mu_uncrustify/nuget/v3/index.json",
|
||||||
|
"version": "73.0.3",
|
||||||
|
"flags": ["set_shell_var", "host_specific"],
|
||||||
|
"var_name": "UNCRUSTIFY_CI_PATH"
|
||||||
|
}
|
11
.pytool/Plugin/UncrustifyCheck/uncrustify_plug_in.yaml
Normal file
11
.pytool/Plugin/UncrustifyCheck/uncrustify_plug_in.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
## @file
|
||||||
|
# CiBuildPlugin used to check coding standard compliance of EDK II style C source code
|
||||||
|
#
|
||||||
|
# Copyright (c) Microsoft Corporation.
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
##
|
||||||
|
{
|
||||||
|
"scope": "cibuild",
|
||||||
|
"name": "Uncrustify Coding Standard Test",
|
||||||
|
"module": "UncrustifyCheck"
|
||||||
|
}
|
@@ -82,7 +82,7 @@ easily and consistently running locally and in a cloud ci environment. To do
|
|||||||
that a few steps should be followed. Details of EDKII Tools can be found in the
|
that a few steps should be followed. Details of EDKII Tools can be found in the
|
||||||
[docs folder here](https://github.com/tianocore/edk2-pytool-extensions/tree/master/docs)
|
[docs folder here](https://github.com/tianocore/edk2-pytool-extensions/tree/master/docs)
|
||||||
|
|
||||||
### Prerequisets
|
### Prerequisites
|
||||||
|
|
||||||
1. A supported toolchain (others might work but this is what is tested and validated)
|
1. A supported toolchain (others might work but this is what is tested and validated)
|
||||||
* Windows 10:
|
* Windows 10:
|
||||||
@@ -95,7 +95,7 @@ that a few steps should be followed. Details of EDKII Tools can be found in the
|
|||||||
2. Python 3.7.x or newer on path
|
2. Python 3.7.x or newer on path
|
||||||
3. git on path
|
3. git on path
|
||||||
4. Recommended to setup and activate a python virtual environment
|
4. Recommended to setup and activate a python virtual environment
|
||||||
5. Install the requirements `pip install --upgrade pip-requirements.txt`
|
5. Install the requirements `pip install --upgrade -r pip-requirements.txt`
|
||||||
|
|
||||||
### Running CI
|
### Running CI
|
||||||
|
|
||||||
@@ -264,6 +264,10 @@ BSD-2-Clause-Patent.
|
|||||||
Run the Ecc tool on the package. The Ecc tool is available in the BaseTools
|
Run the Ecc tool on the package. The Ecc tool is available in the BaseTools
|
||||||
package. It checks that the code complies to the EDKII coding standard.
|
package. It checks that the code complies to the EDKII coding standard.
|
||||||
|
|
||||||
|
### Coding Standard Compliance - UncrustifyCheck
|
||||||
|
|
||||||
|
Runs the Uncrustify application to check for coding standard compliance issues.
|
||||||
|
|
||||||
## PyTool Scopes
|
## PyTool Scopes
|
||||||
|
|
||||||
Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning
|
Scopes are how the PyTool ext_dep, path_env, and plugins are activated. Meaning
|
||||||
|
@@ -19,7 +19,10 @@
|
|||||||
],
|
],
|
||||||
## Both file path and directory path are accepted.
|
## Both file path and directory path are accepted.
|
||||||
"IgnoreFiles": [
|
"IgnoreFiles": [
|
||||||
"Library/ArmSoftFloatLib/berkeley-softfloat-3"
|
"Library/ArmSoftFloatLib/berkeley-softfloat-3",
|
||||||
|
"Library/ArmSoftFloatLib/ArmSoftFloatLib.c",
|
||||||
|
"Library/CompilerIntrinsicsLib",
|
||||||
|
"Universal/Smbios/SmbiosMiscDxe"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -84,7 +87,7 @@
|
|||||||
|
|
||||||
## options defined .pytool/Plugin/SpellCheck
|
## options defined .pytool/Plugin/SpellCheck
|
||||||
"SpellCheck": {
|
"SpellCheck": {
|
||||||
"AuditOnly": False,
|
"AuditOnly": True,
|
||||||
"IgnoreFiles": [
|
"IgnoreFiles": [
|
||||||
"Library/ArmSoftFloatLib/berkeley-softfloat-3/**"
|
"Library/ArmSoftFloatLib/berkeley-softfloat-3/**"
|
||||||
], # use gitignore syntax to ignore errors
|
], # use gitignore syntax to ignore errors
|
||||||
|
@@ -2,7 +2,8 @@
|
|||||||
# ARM processor package.
|
# ARM processor package.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
||||||
# Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.
|
# Copyright (c) 2011 - 2022, ARM Limited. All rights reserved.
|
||||||
|
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -70,6 +71,11 @@
|
|||||||
#
|
#
|
||||||
ArmSvcLib|Include/Library/ArmSvcLib.h
|
ArmSvcLib|Include/Library/ArmSvcLib.h
|
||||||
|
|
||||||
|
## @libraryclass Provides a Monitor Call interface that will use the
|
||||||
|
# default conduit (HVC or SMC).
|
||||||
|
#
|
||||||
|
ArmMonitorLib|Include/Library/ArmMonitorLib.h
|
||||||
|
|
||||||
## @libraryclass Provides a default exception handler.
|
## @libraryclass Provides a default exception handler.
|
||||||
#
|
#
|
||||||
DefaultExceptionHandlerLib|Include/Library/DefaultExceptionHandlerLib.h
|
DefaultExceptionHandlerLib|Include/Library/DefaultExceptionHandlerLib.h
|
||||||
@@ -98,6 +104,8 @@
|
|||||||
# Include/Guid/ArmMpCoreInfo.h
|
# Include/Guid/ArmMpCoreInfo.h
|
||||||
gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
||||||
|
|
||||||
|
gArmMmuReplaceLiveTranslationEntryFuncGuid = { 0xa8b50ff3, 0x08ec, 0x4dd3, {0xbf, 0x04, 0x28, 0xbf, 0x71, 0x75, 0xc7, 0x4a} }
|
||||||
|
|
||||||
[Protocols.common]
|
[Protocols.common]
|
||||||
## Arm System Control and Management Interface(SCMI) Base protocol
|
## Arm System Control and Management Interface(SCMI) Base protocol
|
||||||
## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
|
## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
|
||||||
@@ -131,6 +139,11 @@
|
|||||||
# Define if the GICv3 controller should use the GICv2 legacy
|
# Define if the GICv3 controller should use the GICv2 legacy
|
||||||
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE|BOOLEAN|0x00000042
|
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE|BOOLEAN|0x00000042
|
||||||
|
|
||||||
|
## Define the conduit to use for monitor calls.
|
||||||
|
# Default PcdMonitorConduitHvc = FALSE, conduit = SMC
|
||||||
|
# If PcdMonitorConduitHvc = TRUE, conduit = HVC
|
||||||
|
gArmTokenSpaceGuid.PcdMonitorConduitHvc|FALSE|BOOLEAN|0x00000047
|
||||||
|
|
||||||
[PcdsFeatureFlag.ARM]
|
[PcdsFeatureFlag.ARM]
|
||||||
# Whether to map normal memory as non-shareable. FALSE is the safe choice, but
|
# Whether to map normal memory as non-shareable. FALSE is the safe choice, but
|
||||||
# TRUE may be appropriate to fix performance problems if you don't care about
|
# TRUE may be appropriate to fix performance problems if you don't care about
|
||||||
@@ -337,9 +350,9 @@
|
|||||||
# UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
|
# UINT64 Mmio32CpuBase; // mapping target in 64-bit cpu-physical space
|
||||||
# UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
|
# UINT64 Mmio64CpuBase; // mapping target in 64-bit cpu-physical space
|
||||||
#
|
#
|
||||||
# PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
|
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation = IoCpuBase - PcdPciIoBase;
|
||||||
# PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
|
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation = Mmio32CpuBase - (UINT64)PcdPciMmio32Base;
|
||||||
# PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
|
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation = Mmio64CpuBase - PcdPciMmio64Base;
|
||||||
#
|
#
|
||||||
# because (a) the target address space (ie. the cpu-physical space) is
|
# because (a) the target address space (ie. the cpu-physical space) is
|
||||||
# 64-bit, and (b) the translation values are meant as offsets for *modular*
|
# 64-bit, and (b) the translation values are meant as offsets for *modular*
|
||||||
@@ -356,11 +369,11 @@
|
|||||||
# UINT64 TranslatedMmio64Address; // output parameter
|
# UINT64 TranslatedMmio64Address; // output parameter
|
||||||
#
|
#
|
||||||
# TranslatedIoAddress = UntranslatedIoAddress +
|
# TranslatedIoAddress = UntranslatedIoAddress +
|
||||||
# PcdPciIoTranslation;
|
# gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation;
|
||||||
# TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
|
# TranslatedMmio32Address = (UINT64)UntranslatedMmio32Address +
|
||||||
# PcdPciMmio32Translation;
|
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio32Translation;
|
||||||
# TranslatedMmio64Address = UntranslatedMmio64Address +
|
# TranslatedMmio64Address = UntranslatedMmio64Address +
|
||||||
# PcdPciMmio64Translation;
|
# gEfiMdePkgTokenSpaceGuid.PcdPciMmio64Translation;
|
||||||
#
|
#
|
||||||
# The modular arithmetic performed in UINT64 ensures that the translation
|
# The modular arithmetic performed in UINT64 ensures that the translation
|
||||||
# works correctly regardless of the relation between IoCpuBase and
|
# works correctly regardless of the relation between IoCpuBase and
|
||||||
@@ -369,16 +382,20 @@
|
|||||||
#
|
#
|
||||||
gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
|
gArmTokenSpaceGuid.PcdPciIoBase|0x0|UINT64|0x00000050
|
||||||
gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
|
gArmTokenSpaceGuid.PcdPciIoSize|0x0|UINT64|0x00000051
|
||||||
gArmTokenSpaceGuid.PcdPciIoTranslation|0x0|UINT64|0x00000052
|
|
||||||
gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
|
gArmTokenSpaceGuid.PcdPciMmio32Base|0x0|UINT32|0x00000053
|
||||||
gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
|
gArmTokenSpaceGuid.PcdPciMmio32Size|0x0|UINT32|0x00000054
|
||||||
gArmTokenSpaceGuid.PcdPciMmio32Translation|0x0|UINT64|0x00000055
|
|
||||||
gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
|
gArmTokenSpaceGuid.PcdPciMmio64Base|0x0|UINT64|0x00000056
|
||||||
gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
|
gArmTokenSpaceGuid.PcdPciMmio64Size|0x0|UINT64|0x00000057
|
||||||
gArmTokenSpaceGuid.PcdPciMmio64Translation|0x0|UINT64|0x00000058
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Inclusive range of allowed PCI buses.
|
# Inclusive range of allowed PCI buses.
|
||||||
#
|
#
|
||||||
gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
|
gArmTokenSpaceGuid.PcdPciBusMin|0x0|UINT32|0x00000059
|
||||||
gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
|
gArmTokenSpaceGuid.PcdPciBusMax|0x0|UINT32|0x0000005A
|
||||||
|
|
||||||
|
[PcdsDynamicEx]
|
||||||
|
#
|
||||||
|
# This dynamic PCD hold the GUID of a firmware FFS which contains
|
||||||
|
# the LinuxBoot payload.
|
||||||
|
#
|
||||||
|
gArmTokenSpaceGuid.PcdLinuxBootFileGuid|{0x0}|VOID*|0x0000005C
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
# Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
# Copyright (c) 2011 - 2021, Arm Limited. All rights reserved.<BR>
|
||||||
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
||||||
# Copyright (c) Microsoft Corporation.<BR>
|
# Copyright (c) Microsoft Corporation.<BR>
|
||||||
|
# Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
#
|
#
|
||||||
@@ -130,9 +131,12 @@
|
|||||||
ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
|
ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
|
||||||
ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.inf
|
ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.inf
|
||||||
|
|
||||||
|
ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
|
||||||
|
ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
|
||||||
|
ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
|
||||||
|
ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
|
||||||
ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
|
ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
|
||||||
ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
|
ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
|
||||||
ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
|
|
||||||
ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
|
ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
|
||||||
ArmPkg/Library/OpteeLib/OpteeLib.inf
|
ArmPkg/Library/OpteeLib/OpteeLib.inf
|
||||||
|
|
||||||
@@ -150,6 +154,7 @@
|
|||||||
ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
|
ArmPkg/Library/ArmSmcPsciResetSystemLib/ArmSmcPsciResetSystemLib.inf
|
||||||
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
|
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
|
||||||
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
||||||
|
ArmPkg/Library/LinuxBootBootManagerLib/LinuxBootBootManagerLib.inf
|
||||||
|
|
||||||
ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
|
ArmPkg/Drivers/ArmCrashDumpDxe/ArmCrashDumpDxe.inf
|
||||||
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
|
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
|
||||||
|
@@ -26,7 +26,9 @@ ArmCrashDumpDxeInitialize (
|
|||||||
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
|
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
return mCpu->RegisterInterruptHandler (mCpu,
|
return mCpu->RegisterInterruptHandler (
|
||||||
|
mCpu,
|
||||||
EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
|
EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
|
||||||
&DefaultExceptionHandler);
|
&DefaultExceptionHandler
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,6 @@ UINTN mGicNumInterrupts = 0;
|
|||||||
|
|
||||||
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
HARDWARE_INTERRUPT_HANDLER *gRegisteredInterruptHandlers = NULL;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Calculate GICD_ICFGRn base address and corresponding bit
|
Calculate GICD_ICFGRn base address and corresponding bit
|
||||||
field Int_config[1] of the GIC distributor register.
|
field Int_config[1] of the GIC distributor register.
|
||||||
@@ -71,8 +70,6 @@ GicGetDistributorIcfgBaseAndBit (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Register Handler for the specified interrupt source.
|
Register Handler for the specified interrupt source.
|
||||||
|
|
||||||
@@ -137,17 +134,28 @@ CpuArchEventProtocolNotify (
|
|||||||
// Unregister the default exception handler.
|
// Unregister the default exception handler.
|
||||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
DEBUG ((
|
||||||
__FUNCTION__, Status));
|
DEBUG_ERROR,
|
||||||
|
"%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register to receive interrupts
|
// Register to receive interrupts
|
||||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ,
|
Status = Cpu->RegisterInterruptHandler (
|
||||||
Context);
|
Cpu,
|
||||||
|
ARM_ARCH_EXCEPTION_IRQ,
|
||||||
|
Context
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
DEBUG ((
|
||||||
__FUNCTION__, Status));
|
DEBUG_ERROR,
|
||||||
|
"%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||||
|
__FUNCTION__,
|
||||||
|
Status
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->CloseEvent (Event);
|
gBS->CloseEvent (Event);
|
||||||
@@ -191,7 +199,8 @@ InstallAndRegisterInterruptService (
|
|||||||
TPL_CALLBACK,
|
TPL_CALLBACK,
|
||||||
CpuArchEventProtocolNotify,
|
CpuArchEventProtocolNotify,
|
||||||
InterruptHandler,
|
InterruptHandler,
|
||||||
&mCpuArchProtocolNotifyEventRegistration);
|
&mCpuArchProtocolNotifyEventRegistration
|
||||||
|
);
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
// Register for an ExitBootServicesEvent
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
|
@@ -55,7 +55,6 @@ GicV3DxeInitialize (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// Shared code
|
// Shared code
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -230,7 +230,8 @@ ArmGicSetInterruptPriority (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source)) {
|
SourceIsSpi (Source))
|
||||||
|
{
|
||||||
MmioAndThenOr32 (
|
MmioAndThenOr32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
|
GicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
|
||||||
~(0xff << RegShift),
|
~(0xff << RegShift),
|
||||||
@@ -273,7 +274,8 @@ ArmGicEnableInterrupt (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source)) {
|
SourceIsSpi (Source))
|
||||||
|
{
|
||||||
// Write set-enable register
|
// Write set-enable register
|
||||||
MmioWrite32 (
|
MmioWrite32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
|
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset),
|
||||||
@@ -317,7 +319,8 @@ ArmGicDisableInterrupt (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source)) {
|
SourceIsSpi (Source))
|
||||||
|
{
|
||||||
// Write clear-enable register
|
// Write clear-enable register
|
||||||
MmioWrite32 (
|
MmioWrite32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
|
GicDistributorBase + ARM_GIC_ICDICER + (4 * RegOffset),
|
||||||
@@ -361,11 +364,11 @@ ArmGicIsInterruptEnabled (
|
|||||||
Revision = ArmGicGetSupportedArchRevision ();
|
Revision = ArmGicGetSupportedArchRevision ();
|
||||||
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
if ((Revision == ARM_GIC_ARCH_REVISION_2) ||
|
||||||
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
FeaturePcdGet (PcdArmGicV3WithV2Legacy) ||
|
||||||
SourceIsSpi (Source)) {
|
SourceIsSpi (Source))
|
||||||
Interrupts = ((MmioRead32 (
|
{
|
||||||
|
Interrupts = MmioRead32 (
|
||||||
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
|
GicDistributorBase + ARM_GIC_ICDISER + (4 * RegOffset)
|
||||||
)
|
);
|
||||||
& (1 << RegShift)) != 0);
|
|
||||||
} else {
|
} else {
|
||||||
GicCpuRedistributorBase = GicGetCpuRedistributorBase (
|
GicCpuRedistributorBase = GicGetCpuRedistributorBase (
|
||||||
GicRedistributorBase,
|
GicRedistributorBase,
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
[Sources.ARM]
|
[Sources.ARM]
|
||||||
GicV3/Arm/ArmGicV3.S | GCC
|
GicV3/Arm/ArmGicV3.S | GCC
|
||||||
GicV3/Arm/ArmGicV3.asm | RVCT
|
|
||||||
|
|
||||||
[Sources.AARCH64]
|
[Sources.AARCH64]
|
||||||
GicV3/AArch64/ArmGicV3.S
|
GicV3/AArch64/ArmGicV3.S
|
||||||
|
@@ -261,9 +261,13 @@ GicV2SetTriggerType (
|
|||||||
BOOLEAN SourceEnabled;
|
BOOLEAN SourceEnabled;
|
||||||
|
|
||||||
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
||||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
|
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
|
||||||
DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
|
{
|
||||||
TriggerType));
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
|
"Invalid interrupt trigger type: %d\n", \
|
||||||
|
TriggerType
|
||||||
|
));
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@@ -10,7 +10,6 @@
|
|||||||
#include <Library/IoLib.h>
|
#include <Library/IoLib.h>
|
||||||
#include <Library/ArmGicLib.h>
|
#include <Library/ArmGicLib.h>
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGicV2EnableInterruptInterface (
|
ArmGicV2EnableInterruptInterface (
|
||||||
|
@@ -1,82 +0,0 @@
|
|||||||
//
|
|
||||||
// Copyright (c) 2014, ARM Limited. All rights reserved.
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// For the moment we assume this will run in SVC mode on ARMv7
|
|
||||||
|
|
||||||
|
|
||||||
INCLUDE AsmMacroExport.inc
|
|
||||||
|
|
||||||
//UINT32
|
|
||||||
//EFIAPI
|
|
||||||
//ArmGicGetControlSystemRegisterEnable (
|
|
||||||
// VOID
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3GetControlSystemRegisterEnable
|
|
||||||
mrc p15, 0, r0, c12, c12, 5 // ICC_SRE
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//VOID
|
|
||||||
//EFIAPI
|
|
||||||
//ArmGicSetControlSystemRegisterEnable (
|
|
||||||
// IN UINT32 ControlSystemRegisterEnable
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3SetControlSystemRegisterEnable
|
|
||||||
mcr p15, 0, r0, c12, c12, 5 // ICC_SRE
|
|
||||||
isb
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//VOID
|
|
||||||
//ArmGicV3EnableInterruptInterface (
|
|
||||||
// VOID
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3EnableInterruptInterface
|
|
||||||
mov r0, #1
|
|
||||||
mcr p15, 0, r0, c12, c12, 7 // ICC_IGRPEN1
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//VOID
|
|
||||||
//ArmGicV3DisableInterruptInterface (
|
|
||||||
// VOID
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3DisableInterruptInterface
|
|
||||||
mov r0, #0
|
|
||||||
mcr p15, 0, r0, c12, c12, 7 // ICC_IGRPEN1
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//VOID
|
|
||||||
//ArmGicV3EndOfInterrupt (
|
|
||||||
// IN UINTN InterruptId
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3EndOfInterrupt
|
|
||||||
mcr p15, 0, r0, c12, c12, 1 //ICC_EOIR1
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//UINTN
|
|
||||||
//ArmGicV3AcknowledgeInterrupt (
|
|
||||||
// VOID
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3AcknowledgeInterrupt
|
|
||||||
mrc p15, 0, r0, c12, c12, 0 //ICC_IAR1
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//VOID
|
|
||||||
//ArmGicV3SetPriorityMask (
|
|
||||||
// IN UINTN Priority
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3SetPriorityMask
|
|
||||||
mcr p15, 0, r0, c4, c6, 0 //ICC_PMR
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
//VOID
|
|
||||||
//ArmGicV3SetBinaryPointer (
|
|
||||||
// IN UINTN BinaryPoint
|
|
||||||
// );
|
|
||||||
RVCT_ASM_EXPORT ArmGicV3SetBinaryPointer
|
|
||||||
mcr p15, 0, r0, c12, c12, 3 //ICC_BPR1
|
|
||||||
bx lr
|
|
||||||
|
|
||||||
END
|
|
@@ -255,9 +255,13 @@ GicV3SetTriggerType (
|
|||||||
BOOLEAN SourceEnabled;
|
BOOLEAN SourceEnabled;
|
||||||
|
|
||||||
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
if ( (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING)
|
||||||
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH)) {
|
&& (TriggerType != EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH))
|
||||||
DEBUG ((DEBUG_ERROR, "Invalid interrupt trigger type: %d\n", \
|
{
|
||||||
TriggerType));
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
|
"Invalid interrupt trigger type: %d\n", \
|
||||||
|
TriggerType
|
||||||
|
));
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@@ -344,10 +348,6 @@ GicV3ExitBootServicesEvent (
|
|||||||
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < mGicNumInterrupts; Index++) {
|
|
||||||
GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable Gic Interface
|
// Disable Gic Interface
|
||||||
ArmGicV3DisableInterruptInterface ();
|
ArmGicV3DisableInterruptInterface ();
|
||||||
|
|
||||||
@@ -434,8 +434,8 @@ GicV3DxeInitialize (
|
|||||||
|
|
||||||
if ((MmioRead32 (
|
if ((MmioRead32 (
|
||||||
mGicDistributorBase + ARM_GIC_ICDDCR
|
mGicDistributorBase + ARM_GIC_ICDDCR
|
||||||
) & ARM_GIC_ICDDCR_DS) != 0) {
|
) & ARM_GIC_ICDDCR_DS) != 0)
|
||||||
|
{
|
||||||
// If the Disable Security (DS) control bit is set, we are dealing with a
|
// If the Disable Security (DS) control bit is set, we are dealing with a
|
||||||
// GIC that has only one security state. In this case, let's assume we are
|
// GIC that has only one security state. In this case, let's assume we are
|
||||||
// executing in non-secure state (which is appropriate for DXE modules)
|
// executing in non-secure state (which is appropriate for DXE modules)
|
||||||
|
@@ -117,7 +117,7 @@ CpuIoCheckParameter (
|
|||||||
// For FIFO type, the target address won't increase during the access,
|
// For FIFO type, the target address won't increase during the access,
|
||||||
// so treat Count as 1
|
// so treat Count as 1
|
||||||
//
|
//
|
||||||
if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
|
if ((Width >= EfiCpuIoWidthFifoUint8) && (Width <= EfiCpuIoWidthFifoUint64)) {
|
||||||
Count = 1;
|
Count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +161,7 @@ CpuIoCheckParameter (
|
|||||||
if (MaxCount < (Count - 1)) {
|
if (MaxCount < (Count - 1)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
|
if (Address > LShiftU64 (MaxCount - Count + 1, Width)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@@ -254,6 +255,7 @@ CpuMemoryServiceRead (
|
|||||||
*((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
|
*((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,6 +337,7 @@ CpuMemoryServiceWrite (
|
|||||||
MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
|
MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,7 +524,6 @@ STATIC EFI_CPU_IO2_PROTOCOL mCpuIo2 = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
|
The user Entry Point for module CpuIo2Dxe. The user code starts with this function.
|
||||||
|
|
||||||
@@ -544,7 +546,8 @@ ArmPciCpuIo2Initialize (
|
|||||||
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
|
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiCpuIo2ProtocolGuid);
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&mHandle,
|
&mHandle,
|
||||||
&gEfiCpuIo2ProtocolGuid, &mCpuIo2,
|
&gEfiCpuIo2ProtocolGuid,
|
||||||
|
&mCpuIo2,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
@@ -38,7 +38,7 @@
|
|||||||
UefiBootServicesTableLib
|
UefiBootServicesTableLib
|
||||||
|
|
||||||
[Pcd]
|
[Pcd]
|
||||||
gArmTokenSpaceGuid.PcdPciIoTranslation
|
gEfiMdePkgTokenSpaceGuid.PcdPciIoTranslation
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiCpuIo2ProtocolGuid ## PRODUCES
|
gEfiCpuIo2ProtocolGuid ## PRODUCES
|
||||||
|
@@ -53,7 +53,6 @@ typedef struct {
|
|||||||
CLOCK_RATE_DWORD Rate;
|
CLOCK_RATE_DWORD Rate;
|
||||||
} CLOCK_RATE_SET_ATTRIBUTES;
|
} CLOCK_RATE_SET_ATTRIBUTES;
|
||||||
|
|
||||||
|
|
||||||
// Message parameters for CLOCK_CONFIG_SET command.
|
// Message parameters for CLOCK_CONFIG_SET command.
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 ClockId;
|
UINT32 ClockId;
|
||||||
|
@@ -124,7 +124,9 @@ ScmiCommandExecute (
|
|||||||
Response = (SCMI_MESSAGE_RESPONSE *)MtlGetChannelPayload (Channel);
|
Response = (SCMI_MESSAGE_RESPONSE *)MtlGetChannelPayload (Channel);
|
||||||
|
|
||||||
if (Response->Status != ScmiSuccess) {
|
if (Response->Status != ScmiSuccess) {
|
||||||
DEBUG ((DEBUG_ERROR, "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
|
"SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
||||||
Command->ProtocolId,
|
Command->ProtocolId,
|
||||||
Command->MessageId,
|
Command->MessageId,
|
||||||
Response->Status
|
Response->Status
|
||||||
@@ -143,8 +145,8 @@ ScmiCommandExecute (
|
|||||||
|
|
||||||
/** Internal common function useful for common protocol discovery messages.
|
/** Internal common function useful for common protocol discovery messages.
|
||||||
|
|
||||||
@param[in] ProtocolId Protocol Id of the the protocol.
|
@param[in] ProtocolId Protocol Id of the protocol.
|
||||||
@param[in] MesaageId Message Id of the message.
|
@param[in] MessageId Message Id of the message.
|
||||||
|
|
||||||
@param[out] ReturnValues SCMI response return values.
|
@param[out] ReturnValues SCMI response return values.
|
||||||
|
|
||||||
|
@@ -256,7 +256,6 @@ BaseDiscoverListProtocols (
|
|||||||
Skip = 0;
|
Skip = 0;
|
||||||
|
|
||||||
while (Skip < TotalProtocols) {
|
while (Skip < TotalProtocols) {
|
||||||
|
|
||||||
*MessageParams = Skip;
|
*MessageParams = Skip;
|
||||||
|
|
||||||
// Note PayloadLength is a IN/OUT parameter.
|
// Note PayloadLength is a IN/OUT parameter.
|
||||||
|
@@ -135,6 +135,7 @@ ClockGetClockAttributes (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TRUE if bit 0 of ClockAttributes->Attributes is set.
|
// TRUE if bit 0 of ClockAttributes->Attributes is set.
|
||||||
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
|
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
|
||||||
|
|
||||||
@@ -209,7 +210,6 @@ ClockDescribeRates (
|
|||||||
*MessageParams++ = ClockId;
|
*MessageParams++ = ClockId;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
*MessageParams = RateIndex;
|
*MessageParams = RateIndex;
|
||||||
|
|
||||||
// Set Payload length, note PayloadLength is a IN/OUT parameter.
|
// Set Payload length, note PayloadLength is a IN/OUT parameter.
|
||||||
|
@@ -88,7 +88,8 @@ ArmScmiDxeEntryPoint (
|
|||||||
|
|
||||||
// Accept any version between SCMI v1.0 and SCMI v2.0
|
// Accept any version between SCMI v1.0 and SCMI v2.0
|
||||||
if ((Version < BASE_PROTOCOL_VERSION_V1) ||
|
if ((Version < BASE_PROTOCOL_VERSION_V1) ||
|
||||||
(Version > BASE_PROTOCOL_VERSION_V2)) {
|
(Version > BASE_PROTOCOL_VERSION_V2))
|
||||||
|
{
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@@ -130,7 +131,8 @@ ArmScmiDxeEntryPoint (
|
|||||||
|
|
||||||
// Install supported protocol on ImageHandle.
|
// Install supported protocol on ImageHandle.
|
||||||
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
|
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
|
||||||
ProtocolIndex++) {
|
ProtocolIndex++)
|
||||||
|
{
|
||||||
for (Index = 0; Index < NumProtocols; Index++) {
|
for (Index = 0; Index < NumProtocols; Index++) {
|
||||||
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
|
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
|
||||||
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
|
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
|
||||||
@@ -138,6 +140,7 @@ ArmScmiDxeEntryPoint (
|
|||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef SCMI_DXE_H_
|
#ifndef SCMI_DXE_H_
|
||||||
#define SCMI_DXE_H_
|
#define SCMI_DXE_H_
|
||||||
|
|
||||||
|
@@ -183,7 +183,6 @@ PerformanceDescribeLevels (
|
|||||||
Cmd.MessageId = ScmiMessageIdPerformanceDescribeLevels;
|
Cmd.MessageId = ScmiMessageIdPerformanceDescribeLevels;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
*MessageParams = LevelIndex;
|
*MessageParams = LevelIndex;
|
||||||
|
|
||||||
// Note, PayloadLength is an IN/OUT parameter.
|
// Note, PayloadLength is an IN/OUT parameter.
|
||||||
@@ -219,7 +218,6 @@ PerformanceDescribeLevels (
|
|||||||
sizeof (SCMI_PERFORMANCE_LEVEL)
|
sizeof (SCMI_PERFORMANCE_LEVEL)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (ReturnRemainNumLevels != 0);
|
} while (ReturnRemainNumLevels != 0);
|
||||||
|
|
||||||
*LevelArraySize = RequiredSize;
|
*LevelArraySize = RequiredSize;
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef SCMI_PRIVATE_H_
|
#ifndef SCMI_PRIVATE_H_
|
||||||
#define SCMI_PRIVATE_H_
|
#define SCMI_PRIVATE_H_
|
||||||
|
|
||||||
|
@@ -52,9 +52,11 @@ PageAttributeToGcdAttribute (
|
|||||||
GcdAttributes = EFI_MEMORY_WB;
|
GcdAttributes = EFI_MEMORY_WB;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DEBUG ((DEBUG_ERROR,
|
DEBUG ((
|
||||||
|
DEBUG_ERROR,
|
||||||
"PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
|
"PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
|
||||||
PageAttributes));
|
PageAttributes
|
||||||
|
));
|
||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
// The Global Coherency Domain (GCD) value is defined as a bit set.
|
// The Global Coherency Domain (GCD) value is defined as a bit set.
|
||||||
// Returning 0 means no attribute has been set.
|
// Returning 0 means no attribute has been set.
|
||||||
@@ -63,7 +65,8 @@ PageAttributeToGcdAttribute (
|
|||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
|
if (((PageAttributes & TT_AP_MASK) == TT_AP_NO_RO) ||
|
||||||
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO)) {
|
((PageAttributes & TT_AP_MASK) == TT_AP_RO_RO))
|
||||||
|
{
|
||||||
// Read only cases map to write-protect
|
// Read only cases map to write-protect
|
||||||
GcdAttributes |= EFI_MEMORY_RO;
|
GcdAttributes |= EFI_MEMORY_RO;
|
||||||
}
|
}
|
||||||
@@ -88,7 +91,7 @@ GetFirstPageAttribute (
|
|||||||
// Get the first entry of the table
|
// Get the first entry of the table
|
||||||
FirstEntry = *FirstLevelTableAddress;
|
FirstEntry = *FirstLevelTableAddress;
|
||||||
|
|
||||||
if ((TableLevel != 3) && (FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY) {
|
if ((TableLevel != 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_TABLE_ENTRY)) {
|
||||||
// Only valid for Levels 0, 1 and 2
|
// Only valid for Levels 0, 1 and 2
|
||||||
|
|
||||||
// Get the attribute of the subsequent table
|
// Get the attribute of the subsequent table
|
||||||
@@ -138,14 +141,18 @@ GetNextEntryAttribute (
|
|||||||
|
|
||||||
// If Entry is a Table Descriptor type entry then go through the sub-level table
|
// If Entry is a Table Descriptor type entry then go through the sub-level table
|
||||||
if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
|
if ((EntryType == TT_TYPE_BLOCK_ENTRY) ||
|
||||||
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3))) {
|
((TableLevel == 3) && (EntryType == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
|
||||||
|
{
|
||||||
if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) {
|
if ((*PrevEntryAttribute == INVALID_ENTRY) || (EntryAttribute != *PrevEntryAttribute)) {
|
||||||
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
||||||
// Update GCD with the last region
|
// Update GCD with the last region
|
||||||
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
SetGcdMemorySpaceAttributes (
|
||||||
|
MemorySpaceMap,
|
||||||
|
NumberOfDescriptors,
|
||||||
*StartGcdRegion,
|
*StartGcdRegion,
|
||||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
|
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
|
||||||
PageAttributeToGcdAttribute (*PrevEntryAttribute));
|
PageAttributeToGcdAttribute (*PrevEntryAttribute)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start of the new region
|
// Start of the new region
|
||||||
@@ -159,17 +166,24 @@ GetNextEntryAttribute (
|
|||||||
ASSERT (TableLevel < 3);
|
ASSERT (TableLevel < 3);
|
||||||
|
|
||||||
// Increase the level number and scan the sub-level table
|
// Increase the level number and scan the sub-level table
|
||||||
GetNextEntryAttribute ((UINT64*)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
|
GetNextEntryAttribute (
|
||||||
TT_ENTRY_COUNT, TableLevel + 1,
|
(UINT64 *)(Entry & TT_ADDRESS_MASK_DESCRIPTION_TABLE),
|
||||||
|
TT_ENTRY_COUNT,
|
||||||
|
TableLevel + 1,
|
||||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))),
|
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))),
|
||||||
PrevEntryAttribute, StartGcdRegion);
|
PrevEntryAttribute,
|
||||||
|
StartGcdRegion
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
if (*PrevEntryAttribute != INVALID_ENTRY) {
|
||||||
// Update GCD with the last region
|
// Update GCD with the last region
|
||||||
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
SetGcdMemorySpaceAttributes (
|
||||||
|
MemorySpaceMap,
|
||||||
|
NumberOfDescriptors,
|
||||||
*StartGcdRegion,
|
*StartGcdRegion,
|
||||||
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
|
(BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
|
||||||
PageAttributeToGcdAttribute (*PrevEntryAttribute));
|
PageAttributeToGcdAttribute (*PrevEntryAttribute)
|
||||||
|
);
|
||||||
|
|
||||||
// Start of the new region
|
// Start of the new region
|
||||||
*StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel));
|
*StartGcdRegion = BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel));
|
||||||
@@ -232,17 +246,24 @@ SyncCacheConfig (
|
|||||||
|
|
||||||
// We scan from the start of the memory map (ie: at the address 0x0)
|
// We scan from the start of the memory map (ie: at the address 0x0)
|
||||||
BaseAddressGcdRegion = 0x0;
|
BaseAddressGcdRegion = 0x0;
|
||||||
EndAddressGcdRegion = GetNextEntryAttribute (FirstLevelTableAddress,
|
EndAddressGcdRegion = GetNextEntryAttribute (
|
||||||
TableCount, TableLevel,
|
FirstLevelTableAddress,
|
||||||
|
TableCount,
|
||||||
|
TableLevel,
|
||||||
BaseAddressGcdRegion,
|
BaseAddressGcdRegion,
|
||||||
&PageAttribute, &BaseAddressGcdRegion);
|
&PageAttribute,
|
||||||
|
&BaseAddressGcdRegion
|
||||||
|
);
|
||||||
|
|
||||||
// Update GCD with the last region if valid
|
// Update GCD with the last region if valid
|
||||||
if (PageAttribute != INVALID_ENTRY) {
|
if (PageAttribute != INVALID_ENTRY) {
|
||||||
SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors,
|
SetGcdMemorySpaceAttributes (
|
||||||
|
MemorySpaceMap,
|
||||||
|
NumberOfDescriptors,
|
||||||
BaseAddressGcdRegion,
|
BaseAddressGcdRegion,
|
||||||
EndAddressGcdRegion - BaseAddressGcdRegion,
|
EndAddressGcdRegion - BaseAddressGcdRegion,
|
||||||
PageAttributeToGcdAttribute (PageAttribute));
|
PageAttributeToGcdAttribute (PageAttribute)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (MemorySpaceMap);
|
FreePool (MemorySpaceMap);
|
||||||
@@ -264,6 +285,7 @@ EfiAttributeToArmAttribute (
|
|||||||
} else {
|
} else {
|
||||||
ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
|
ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_UXN_MASK | TT_PXN_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case EFI_MEMORY_WC:
|
case EFI_MEMORY_WC:
|
||||||
ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
|
ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
|
||||||
@@ -283,7 +305,7 @@ EfiAttributeToArmAttribute (
|
|||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
||||||
ArmAttributes |= TT_AP_RO_RO;
|
ArmAttributes |= TT_AP_NO_RO;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process eXecute Never attribute
|
// Process eXecute Never attribute
|
||||||
@@ -330,7 +352,10 @@ GetMemoryRegionRec (
|
|||||||
NextTranslationTable, // Address of the next level page table
|
NextTranslationTable, // Address of the next level page table
|
||||||
TableLevel + 1, // Next Page Table level
|
TableLevel + 1, // Next Page Table level
|
||||||
(UINTN *)TT_LAST_BLOCK_ADDRESS (NextTranslationTable, TT_ENTRY_COUNT),
|
(UINTN *)TT_LAST_BLOCK_ADDRESS (NextTranslationTable, TT_ENTRY_COUNT),
|
||||||
BaseAddress, RegionLength, RegionAttributes);
|
BaseAddress,
|
||||||
|
RegionLength,
|
||||||
|
RegionAttributes
|
||||||
|
);
|
||||||
|
|
||||||
// In case of 'Success', it means the end of the block region has been found into the upper
|
// In case of 'Success', it means the end of the block region has been found into the upper
|
||||||
// level translation table
|
// level translation table
|
||||||
@@ -358,6 +383,7 @@ GetMemoryRegionRec (
|
|||||||
// In case we have found the end of the region we return success
|
// In case we have found the end of the region we return success
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockEntry++;
|
BlockEntry++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,9 +414,14 @@ GetMemoryRegion (
|
|||||||
// Get the Table info from T0SZ
|
// Get the Table info from T0SZ
|
||||||
GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
|
GetRootTranslationTableInfo (T0SZ, &TableLevel, &EntryCount);
|
||||||
|
|
||||||
Status = GetMemoryRegionRec (TranslationTable, TableLevel,
|
Status = GetMemoryRegionRec (
|
||||||
|
TranslationTable,
|
||||||
|
TableLevel,
|
||||||
(UINTN *)TT_LAST_BLOCK_ADDRESS (TranslationTable, EntryCount),
|
(UINTN *)TT_LAST_BLOCK_ADDRESS (TranslationTable, EntryCount),
|
||||||
BaseAddress, RegionLength, RegionAttributes);
|
BaseAddress,
|
||||||
|
RegionLength,
|
||||||
|
RegionAttributes
|
||||||
|
);
|
||||||
|
|
||||||
// If the region continues up to the end of the root table then GetMemoryRegionRec()
|
// If the region continues up to the end of the root table then GetMemoryRegionRec()
|
||||||
// will return EFI_NOT_FOUND
|
// will return EFI_NOT_FOUND
|
||||||
|
@@ -206,6 +206,7 @@ SyncCacheConfigPage (
|
|||||||
*NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
|
*NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
|
||||||
NextPageAttributes = 0;
|
NextPageAttributes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
*NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
|
*NextRegionLength += TT_DESCRIPTOR_PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,7 +234,6 @@ SyncCacheConfig (
|
|||||||
UINTN NumberOfDescriptors;
|
UINTN NumberOfDescriptors;
|
||||||
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
|
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;
|
||||||
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
|
DEBUG ((DEBUG_PAGE, "SyncCacheConfig()\n"));
|
||||||
|
|
||||||
// This code assumes MMU is enabled and filed with section translations
|
// This code assumes MMU is enabled and filed with section translations
|
||||||
@@ -246,7 +246,6 @@ SyncCacheConfig (
|
|||||||
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
|
Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
|
||||||
// The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs
|
// The GCD implementation maintains its own copy of the state of memory space attributes. GCD needs
|
||||||
// to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a
|
// to know what the initial memory space attributes are. The CPU Arch. Protocol does not provide a
|
||||||
// GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
|
// GetMemoryAttributes function for GCD to get this so we must resort to calling GCD (as if we were
|
||||||
@@ -284,6 +283,7 @@ SyncCacheConfig (
|
|||||||
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||||
NextSectionAttributes = SectionAttributes;
|
NextSectionAttributes = SectionAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
||||||
} else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (FirstLevelTable[i])) {
|
} else if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (FirstLevelTable[i])) {
|
||||||
// In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
|
// In this case any bits set in the 'NextSectionAttributes' are garbage and were set from
|
||||||
@@ -292,9 +292,14 @@ SyncCacheConfig (
|
|||||||
// section attributes into page attributes
|
// section attributes into page attributes
|
||||||
NextSectionAttributes = 0;
|
NextSectionAttributes = 0;
|
||||||
Status = SyncCacheConfigPage (
|
Status = SyncCacheConfigPage (
|
||||||
i,FirstLevelTable[i],
|
i,
|
||||||
NumberOfDescriptors, MemorySpaceMap,
|
FirstLevelTable[i],
|
||||||
&NextRegionBase,&NextRegionLength,&NextSectionAttributes);
|
NumberOfDescriptors,
|
||||||
|
MemorySpaceMap,
|
||||||
|
&NextRegionBase,
|
||||||
|
&NextRegionLength,
|
||||||
|
&NextSectionAttributes
|
||||||
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
} else {
|
} else {
|
||||||
// We do not support yet 16MB sections
|
// We do not support yet 16MB sections
|
||||||
@@ -313,6 +318,7 @@ SyncCacheConfig (
|
|||||||
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
NextRegionBase = TT_DESCRIPTOR_SECTION_BASE_ADDRESS (i << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||||
NextSectionAttributes = 0;
|
NextSectionAttributes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
NextRegionLength += TT_DESCRIPTOR_SECTION_SIZE;
|
||||||
}
|
}
|
||||||
} // section entry loop
|
} // section entry loop
|
||||||
@@ -494,7 +500,8 @@ GetMemoryRegion (
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
|
} else if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
|
||||||
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION)) {
|
((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION))
|
||||||
|
{
|
||||||
if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
|
if ((SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK) != *RegionAttributes) {
|
||||||
// If the attributes of the section differ from the one targeted then we exit the loop
|
// If the attributes of the section differ from the one targeted then we exit the loop
|
||||||
break;
|
break;
|
||||||
|
@@ -49,7 +49,6 @@ CpuFlushCpuDataCache (
|
|||||||
IN EFI_CPU_FLUSH_TYPE FlushType
|
IN EFI_CPU_FLUSH_TYPE FlushType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (FlushType) {
|
switch (FlushType) {
|
||||||
case EfiCpuFlushTypeWriteBack:
|
case EfiCpuFlushTypeWriteBack:
|
||||||
WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
|
WriteBackDataCacheRange ((VOID *)(UINTN)Start, (UINTN)Length);
|
||||||
@@ -67,7 +66,6 @@ CpuFlushCpuDataCache (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function enables interrupt processing by the processor.
|
This function enables interrupt processing by the processor.
|
||||||
|
|
||||||
@@ -88,7 +86,6 @@ CpuEnableInterrupt (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function disables interrupt processing by the processor.
|
This function disables interrupt processing by the processor.
|
||||||
|
|
||||||
@@ -109,7 +106,6 @@ CpuDisableInterrupt (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function retrieves the processor's current interrupt state a returns it in
|
This function retrieves the processor's current interrupt state a returns it in
|
||||||
State. If interrupts are currently enabled, then TRUE is returned. If interrupts
|
State. If interrupts are currently enabled, then TRUE is returned. If interrupts
|
||||||
@@ -138,7 +134,6 @@ CpuGetInterruptState (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function generates an INIT on the processor. If this function succeeds, then the
|
This function generates an INIT on the processor. If this function succeeds, then the
|
||||||
processor will be reset, and control will not be returned to the caller. If InitType is
|
processor will be reset, and control will not be returned to the caller. If InitType is
|
||||||
@@ -247,7 +242,8 @@ CpuDxeInitialize (
|
|||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&mCpuHandle,
|
&mCpuHandle,
|
||||||
&gEfiCpuArchProtocolGuid, &mCpu,
|
&gEfiCpuArchProtocolGuid,
|
||||||
|
&mCpu,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -260,12 +256,6 @@ CpuDxeInitialize (
|
|||||||
SyncCacheConfig (&mCpu);
|
SyncCacheConfig (&mCpu);
|
||||||
mIsFlushingGCD = FALSE;
|
mIsFlushingGCD = FALSE;
|
||||||
|
|
||||||
// If the platform is a MPCore system then install the Configuration Table describing the
|
|
||||||
// secondary core states
|
|
||||||
if (ArmIsMpCore()) {
|
|
||||||
PublishArmProcessorTable();
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Setup a callback for idle events
|
// Setup a callback for idle events
|
||||||
//
|
//
|
||||||
|
@@ -59,7 +59,6 @@ RegisterInterruptHandler (
|
|||||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function registers and enables the handler specified by InterruptHandler for a processor
|
This function registers and enables the handler specified by InterruptHandler for a processor
|
||||||
interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
|
interrupt or exception type specified by InterruptType. If InterruptHandler is NULL, then the
|
||||||
@@ -86,7 +85,6 @@ RegisterDebuggerInterruptHandler (
|
|||||||
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
CpuSetMemoryAttributes (
|
CpuSetMemoryAttributes (
|
||||||
@@ -106,21 +104,6 @@ SyncCacheConfig (
|
|||||||
IN EFI_CPU_ARCH_PROTOCOL *CpuProtocol
|
IN EFI_CPU_ARCH_PROTOCOL *CpuProtocol
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Publish ARM Processor Data table in UEFI SYSTEM Table.
|
|
||||||
* @param HobStart Pointer to the beginning of the HOB List from PEI.
|
|
||||||
*
|
|
||||||
* Description : This function iterates through HOB list and finds ARM processor Table Entry HOB.
|
|
||||||
* If the ARM processor Table Entry HOB is found, the HOB data is copied to run-time memory
|
|
||||||
* and a pointer is assigned to it in ARM processor table. Then the ARM processor table is
|
|
||||||
* installed in EFI configuration table.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
PublishArmProcessorTable(
|
|
||||||
VOID
|
|
||||||
);
|
|
||||||
|
|
||||||
// The ARM Attributes might be defined on 64-bit (case of the long format description table)
|
// The ARM Attributes might be defined on 64-bit (case of the long format description table)
|
||||||
UINT64
|
UINT64
|
||||||
EfiAttributeToArmAttribute (
|
EfiAttributeToArmAttribute (
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
[Sources.Common]
|
[Sources.Common]
|
||||||
CpuDxe.c
|
CpuDxe.c
|
||||||
CpuDxe.h
|
CpuDxe.h
|
||||||
CpuMpCore.c
|
|
||||||
CpuMmuCommon.c
|
CpuMmuCommon.c
|
||||||
Exception.c
|
Exception.c
|
||||||
|
|
||||||
|
@@ -43,19 +43,22 @@ SearchGcdMemorySpaces (
|
|||||||
*EndIndex = 0;
|
*EndIndex = 0;
|
||||||
for (Index = 0; Index < NumberOfDescriptors; Index++) {
|
for (Index = 0; Index < NumberOfDescriptors; Index++) {
|
||||||
if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
|
if ((BaseAddress >= MemorySpaceMap[Index].BaseAddress) &&
|
||||||
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
|
(BaseAddress < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
|
||||||
|
{
|
||||||
*StartIndex = Index;
|
*StartIndex = Index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
|
if (((BaseAddress + Length - 1) >= MemorySpaceMap[Index].BaseAddress) &&
|
||||||
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length))) {
|
((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)))
|
||||||
|
{
|
||||||
*EndIndex = Index;
|
*EndIndex = Index;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the attributes for a specified range in Gcd Memory Space Map.
|
Sets the attributes for a specified range in Gcd Memory Space Map.
|
||||||
|
|
||||||
@@ -88,14 +91,21 @@ SetGcdMemorySpaceAttributes (
|
|||||||
EFI_PHYSICAL_ADDRESS RegionStart;
|
EFI_PHYSICAL_ADDRESS RegionStart;
|
||||||
UINT64 RegionLength;
|
UINT64 RegionLength;
|
||||||
|
|
||||||
DEBUG ((DEBUG_GCD, "SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
|
DEBUG ((
|
||||||
BaseAddress, BaseAddress + Length, Attributes));
|
DEBUG_GCD,
|
||||||
|
"SetGcdMemorySpaceAttributes[0x%lX; 0x%lX] = 0x%lX\n",
|
||||||
|
BaseAddress,
|
||||||
|
BaseAddress + Length,
|
||||||
|
Attributes
|
||||||
|
));
|
||||||
|
|
||||||
// We do not support a smaller granularity than 4KB on ARM Architecture
|
// We do not support a smaller granularity than 4KB on ARM Architecture
|
||||||
if ((Length & EFI_PAGE_MASK) != 0) {
|
if ((Length & EFI_PAGE_MASK) != 0) {
|
||||||
DEBUG ((DEBUG_WARN,
|
DEBUG ((
|
||||||
|
DEBUG_WARN,
|
||||||
"Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
|
"Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
|
||||||
Length));
|
Length
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -120,6 +130,7 @@ SetGcdMemorySpaceAttributes (
|
|||||||
if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
|
if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Calculate the start and end address of the overlapping range
|
// Calculate the start and end address of the overlapping range
|
||||||
//
|
//
|
||||||
@@ -128,11 +139,13 @@ SetGcdMemorySpaceAttributes (
|
|||||||
} else {
|
} else {
|
||||||
RegionStart = MemorySpaceMap[Index].BaseAddress;
|
RegionStart = MemorySpaceMap[Index].BaseAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
|
if ((BaseAddress + Length - 1) < (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length)) {
|
||||||
RegionLength = BaseAddress + Length - RegionStart;
|
RegionLength = BaseAddress + Length - RegionStart;
|
||||||
} else {
|
} else {
|
||||||
RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
|
RegionLength = MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - RegionStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set memory attributes according to MTRR attribute and the original attribute of descriptor
|
// Set memory attributes according to MTRR attribute and the original attribute of descriptor
|
||||||
//
|
//
|
||||||
|
@@ -1,97 +0,0 @@
|
|||||||
/** @file
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
*
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
|
||||||
#include <Library/BaseMemoryLib.h>
|
|
||||||
#include <Library/HobLib.h>
|
|
||||||
#include <Library/DebugLib.h>
|
|
||||||
#include <Library/MemoryAllocationLib.h>
|
|
||||||
|
|
||||||
#include <Guid/ArmMpCoreInfo.h>
|
|
||||||
|
|
||||||
ARM_PROCESSOR_TABLE mArmProcessorTableTemplate = {
|
|
||||||
{
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_SIGNATURE,
|
|
||||||
0,
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_REVISION,
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_OEM_ID,
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_OEM_TABLE_ID,
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_OEM_REVISION,
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_CREATOR_ID,
|
|
||||||
EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION,
|
|
||||||
{ 0 },
|
|
||||||
0
|
|
||||||
}, //ARM Processor table header
|
|
||||||
0, // Number of entries in ARM processor Table
|
|
||||||
NULL // ARM Processor Table
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Publish ARM Processor Data table in UEFI SYSTEM Table.
|
|
||||||
* @param HobStart Pointer to the beginning of the HOB List from PEI.
|
|
||||||
*
|
|
||||||
* Description : This function iterates through HOB list and finds ARM processor Table Entry HOB.
|
|
||||||
* If the ARM processor Table Entry HOB is found, the HOB data is copied to run-time memory
|
|
||||||
* and a pointer is assigned to it in ARM processor table. Then the ARM processor table is
|
|
||||||
* installed in EFI configuration table.
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
PublishArmProcessorTable (
|
|
||||||
VOID
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_PEI_HOB_POINTERS Hob;
|
|
||||||
|
|
||||||
Hob.Raw = GetHobList ();
|
|
||||||
|
|
||||||
// Iterate through the HOBs and find if there is ARM PROCESSOR ENTRY HOB
|
|
||||||
for (; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {
|
|
||||||
// Check for Correct HOB type
|
|
||||||
if ((GET_HOB_TYPE (Hob)) == EFI_HOB_TYPE_GUID_EXTENSION) {
|
|
||||||
// Check for correct GUID type
|
|
||||||
if (CompareGuid(&(Hob.Guid->Name), &gArmMpCoreInfoGuid)) {
|
|
||||||
ARM_PROCESSOR_TABLE *ArmProcessorTable;
|
|
||||||
EFI_STATUS Status;
|
|
||||||
|
|
||||||
// Allocate Runtime memory for ARM processor table
|
|
||||||
ArmProcessorTable = (ARM_PROCESSOR_TABLE*)AllocateRuntimePool(sizeof(ARM_PROCESSOR_TABLE));
|
|
||||||
|
|
||||||
// Check if the memory allocation is successful or not
|
|
||||||
ASSERT(NULL != ArmProcessorTable);
|
|
||||||
|
|
||||||
// Set ARM processor table to default values
|
|
||||||
CopyMem(ArmProcessorTable,&mArmProcessorTableTemplate,sizeof(ARM_PROCESSOR_TABLE));
|
|
||||||
|
|
||||||
// Fill in Length fields of ARM processor table
|
|
||||||
ArmProcessorTable->Header.Length = sizeof(ARM_PROCESSOR_TABLE);
|
|
||||||
ArmProcessorTable->Header.DataLen = GET_GUID_HOB_DATA_SIZE(Hob);
|
|
||||||
|
|
||||||
// Fill in Identifier(ARM processor table GUID)
|
|
||||||
ArmProcessorTable->Header.Identifier = gArmMpCoreInfoGuid;
|
|
||||||
|
|
||||||
// Set Number of ARM core entries in the Table
|
|
||||||
ArmProcessorTable->NumberOfEntries = GET_GUID_HOB_DATA_SIZE(Hob)/sizeof(ARM_CORE_INFO);
|
|
||||||
|
|
||||||
// Allocate runtime memory for ARM processor Table entries
|
|
||||||
ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool (
|
|
||||||
ArmProcessorTable->NumberOfEntries * sizeof(ARM_CORE_INFO));
|
|
||||||
|
|
||||||
// Check if the memory allocation is successful or not
|
|
||||||
ASSERT(NULL != ArmProcessorTable->ArmCpus);
|
|
||||||
|
|
||||||
// Copy ARM Processor Table data from HOB list to newly allocated memory
|
|
||||||
CopyMem(ArmProcessorTable->ArmCpus,GET_GUID_HOB_DATA(Hob), ArmProcessorTable->Header.DataLen);
|
|
||||||
|
|
||||||
// Install the ARM Processor table into EFI system configuration table
|
|
||||||
Status = gBS->InstallConfigurationTable (&gArmMpCoreInfoGuid, ArmProcessorTable);
|
|
||||||
|
|
||||||
ASSERT_EFI_ERROR (Status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -24,7 +24,7 @@ InitializeExceptions (
|
|||||||
|
|
||||||
VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
|
VectorInfo = (EFI_VECTOR_HANDOFF_INFO *)NULL;
|
||||||
Status = EfiGetSystemConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
|
Status = EfiGetSystemConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID **)&VectorInfoList);
|
||||||
if (Status == EFI_SUCCESS && VectorInfoList != NULL) {
|
if ((Status == EFI_SUCCESS) && (VectorInfoList != NULL)) {
|
||||||
VectorInfo = VectorInfoList;
|
VectorInfo = VectorInfoList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,8 +16,6 @@ Abstract:
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The package level header files this module uses
|
// The package level header files this module uses
|
||||||
//
|
//
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef GENERIC_WATCHDOG_H_
|
#ifndef GENERIC_WATCHDOG_H_
|
||||||
#define GENERIC_WATCHDOG_H_
|
#define GENERIC_WATCHDOG_H_
|
||||||
|
|
||||||
|
@@ -119,8 +119,12 @@ WatchdogInterruptHandler (
|
|||||||
mWatchdogNotify (TimerPeriod + 1);
|
mWatchdogNotify (TimerPeriod + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
gRT->ResetSystem (EfiResetCold, EFI_TIMEOUT, StrSize (ResetString),
|
gRT->ResetSystem (
|
||||||
(CHAR16 *)ResetString);
|
EfiResetCold,
|
||||||
|
EFI_TIMEOUT,
|
||||||
|
StrSize (ResetString),
|
||||||
|
(CHAR16 *)ResetString
|
||||||
|
);
|
||||||
|
|
||||||
// If we got here then the reset didn't work
|
// If we got here then the reset didn't work
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@@ -158,11 +162,11 @@ WatchdogRegisterHandler (
|
|||||||
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (mWatchdogNotify == NULL && NotifyFunction == NULL) {
|
if ((mWatchdogNotify == NULL) && (NotifyFunction == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mWatchdogNotify != NULL && NotifyFunction != NULL) {
|
if ((mWatchdogNotify != NULL) && (NotifyFunction != NULL)) {
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,8 +311,11 @@ GenericWatchdogEntry (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
|
|
||||||
Status = gBS->LocateProtocol (&gHardwareInterrupt2ProtocolGuid, NULL,
|
Status = gBS->LocateProtocol (
|
||||||
(VOID **)&mInterruptProtocol);
|
&gHardwareInterrupt2ProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
(VOID **)&mInterruptProtocol
|
||||||
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
/* Make sure the Watchdog Timer Architectural Protocol has not been installed
|
/* Make sure the Watchdog Timer Architectural Protocol has not been installed
|
||||||
@@ -320,33 +327,44 @@ GenericWatchdogEntry (
|
|||||||
ASSERT (mTimerFrequencyHz != 0);
|
ASSERT (mTimerFrequencyHz != 0);
|
||||||
|
|
||||||
// Install interrupt handler
|
// Install interrupt handler
|
||||||
Status = mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
Status = mInterruptProtocol->RegisterInterruptSource (
|
||||||
|
mInterruptProtocol,
|
||||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||||
WatchdogInterruptHandler);
|
WatchdogInterruptHandler
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = mInterruptProtocol->SetTriggerType (mInterruptProtocol,
|
Status = mInterruptProtocol->SetTriggerType (
|
||||||
|
mInterruptProtocol,
|
||||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||||
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING);
|
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto UnregisterHandler;
|
goto UnregisterHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Install the Timer Architectural Protocol onto a new handle
|
// Install the Timer Architectural Protocol onto a new handle
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
|
&Handle,
|
||||||
NULL);
|
&gEfiWatchdogTimerArchProtocolGuid,
|
||||||
|
&mWatchdogTimer,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto UnregisterHandler;
|
goto UnregisterHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register for an ExitBootServicesEvent
|
// Register for an ExitBootServicesEvent
|
||||||
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
|
Status = gBS->CreateEvent (
|
||||||
WatchdogExitBootServicesEvent, NULL,
|
EVT_SIGNAL_EXIT_BOOT_SERVICES,
|
||||||
&mEfiExitBootServicesEvent);
|
TPL_NOTIFY,
|
||||||
|
WatchdogExitBootServicesEvent,
|
||||||
|
NULL,
|
||||||
|
&mEfiExitBootServicesEvent
|
||||||
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
mNumTimerTicks = 0;
|
mNumTimerTicks = 0;
|
||||||
@@ -356,8 +374,10 @@ GenericWatchdogEntry (
|
|||||||
|
|
||||||
UnregisterHandler:
|
UnregisterHandler:
|
||||||
// Unregister the handler
|
// Unregister the handler
|
||||||
mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
mInterruptProtocol->RegisterInterruptSource (
|
||||||
|
mInterruptProtocol,
|
||||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||||
NULL);
|
NULL
|
||||||
|
);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@@ -42,14 +42,20 @@ STATIC EFI_HANDLE mMmCommunicateHandle;
|
|||||||
This function provides a service to send and receive messages from a registered UEFI service.
|
This function provides a service to send and receive messages from a registered UEFI service.
|
||||||
|
|
||||||
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance.
|
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance.
|
||||||
@param[in] CommBufferPhysical Physical address of the MM communication buffer
|
@param[in, out] CommBufferPhysical Physical address of the MM communication buffer
|
||||||
@param[in] CommBufferVirtual Virtual address of the MM communication buffer
|
@param[in, out] CommBufferVirtual Virtual address of the MM communication buffer
|
||||||
@param[in] CommSize The size of the data buffer being passed in. On exit, the size of data
|
@param[in, out] CommSize The size of the data buffer being passed in. On input,
|
||||||
being returned. Zero if the handler does not wish to reply with any data.
|
when not omitted, the buffer should cover EFI_MM_COMMUNICATE_HEADER
|
||||||
This parameter is optional and may be NULL.
|
and the value of MessageLength field. On exit, the size
|
||||||
|
of data being returned. Zero if the handler does not
|
||||||
|
wish to reply with any data. This parameter is optional
|
||||||
|
and may be NULL.
|
||||||
|
|
||||||
@retval EFI_SUCCESS The message was successfully posted.
|
@retval EFI_SUCCESS The message was successfully posted.
|
||||||
@retval EFI_INVALID_PARAMETER CommBufferPhysical was NULL or CommBufferVirtual was NULL.
|
@retval EFI_INVALID_PARAMETER CommBufferPhysical or CommBufferVirtual was NULL, or
|
||||||
|
integer value pointed by CommSize does not cover
|
||||||
|
EFI_MM_COMMUNICATE_HEADER and the value of MessageLength
|
||||||
|
field.
|
||||||
@retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation.
|
@retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM implementation.
|
||||||
If this error is returned, the MessageLength field
|
If this error is returned, the MessageLength field
|
||||||
in the CommBuffer header or the integer pointed by
|
in the CommBuffer header or the integer pointed by
|
||||||
@@ -82,10 +88,11 @@ MmCommunication2Communicate (
|
|||||||
//
|
//
|
||||||
// Check parameters
|
// Check parameters
|
||||||
//
|
//
|
||||||
if (CommBufferVirtual == NULL) {
|
if ((CommBufferVirtual == NULL) || (CommBufferPhysical == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
CommunicateHeader = CommBufferVirtual;
|
CommunicateHeader = CommBufferVirtual;
|
||||||
// CommBuffer is a mandatory parameter. Hence, Rely on
|
// CommBuffer is a mandatory parameter. Hence, Rely on
|
||||||
// MessageLength + Header to ascertain the
|
// MessageLength + Header to ascertain the
|
||||||
@@ -95,33 +102,41 @@ MmCommunication2Communicate (
|
|||||||
sizeof (CommunicateHeader->HeaderGuid) +
|
sizeof (CommunicateHeader->HeaderGuid) +
|
||||||
sizeof (CommunicateHeader->MessageLength);
|
sizeof (CommunicateHeader->MessageLength);
|
||||||
|
|
||||||
// If the length of the CommBuffer is 0 then return the expected length.
|
// If CommSize is not omitted, perform size inspection before proceeding.
|
||||||
if (CommSize != 0) {
|
if (CommSize != NULL) {
|
||||||
// This case can be used by the consumer of this driver to find out the
|
// This case can be used by the consumer of this driver to find out the
|
||||||
// max size that can be used for allocating CommBuffer.
|
// max size that can be used for allocating CommBuffer.
|
||||||
if ((*CommSize == 0) ||
|
if ((*CommSize == 0) ||
|
||||||
(*CommSize > mNsCommBuffMemRegion.Length)) {
|
(*CommSize > mNsCommBuffMemRegion.Length))
|
||||||
|
{
|
||||||
*CommSize = mNsCommBuffMemRegion.Length;
|
*CommSize = mNsCommBuffMemRegion.Length;
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
Status = EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
// CommSize should cover at least MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
||||||
//
|
//
|
||||||
if (*CommSize != BufferSize) {
|
if (*CommSize < BufferSize) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If the buffer size is 0 or greater than what can be tolerated by the MM
|
// If the message length is 0 or greater than what can be tolerated by the MM
|
||||||
// environment then return the expected size.
|
// environment then return the expected size.
|
||||||
//
|
//
|
||||||
if ((BufferSize == 0) ||
|
if ((CommunicateHeader->MessageLength == 0) ||
|
||||||
(BufferSize > mNsCommBuffMemRegion.Length)) {
|
(BufferSize > mNsCommBuffMemRegion.Length))
|
||||||
|
{
|
||||||
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
|
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
|
||||||
sizeof (CommunicateHeader->HeaderGuid) -
|
sizeof (CommunicateHeader->HeaderGuid) -
|
||||||
sizeof (CommunicateHeader->MessageLength);
|
sizeof (CommunicateHeader->MessageLength);
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
Status = EFI_BAD_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// MessageLength or CommSize check has failed, return here.
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// SMC Function ID
|
// SMC Function ID
|
||||||
@@ -219,15 +234,19 @@ NotifySetVirtualAddressMap (
|
|||||||
(VOID **)&mNsCommBuffMemRegion.VirtualBase
|
(VOID **)&mNsCommBuffMemRegion.VirtualBase
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "NotifySetVirtualAddressMap():"
|
DEBUG ((
|
||||||
" Unable to convert MM runtime pointer. Status:0x%r\n", Status));
|
DEBUG_ERROR,
|
||||||
|
"NotifySetVirtualAddressMap():"
|
||||||
|
" Unable to convert MM runtime pointer. Status:0x%r\n",
|
||||||
|
Status
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC
|
STATIC
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetMmCompatibility ()
|
GetMmCompatibility (
|
||||||
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 MmVersion;
|
UINT32 MmVersion;
|
||||||
@@ -241,13 +260,24 @@ GetMmCompatibility ()
|
|||||||
MmVersion = MmVersionArgs.Arg0;
|
MmVersion = MmVersionArgs.Arg0;
|
||||||
|
|
||||||
if ((MM_MAJOR_VER (MmVersion) == MM_CALLER_MAJOR_VER) &&
|
if ((MM_MAJOR_VER (MmVersion) == MM_CALLER_MAJOR_VER) &&
|
||||||
(MM_MINOR_VER(MmVersion) >= MM_CALLER_MINOR_VER)) {
|
(MM_MINOR_VER (MmVersion) >= MM_CALLER_MINOR_VER))
|
||||||
DEBUG ((DEBUG_INFO, "MM Version: Major=0x%x, Minor=0x%x\n",
|
{
|
||||||
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion)));
|
DEBUG ((
|
||||||
|
DEBUG_INFO,
|
||||||
|
"MM Version: Major=0x%x, Minor=0x%x\n",
|
||||||
|
MM_MAJOR_VER (MmVersion),
|
||||||
|
MM_MINOR_VER (MmVersion)
|
||||||
|
));
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((DEBUG_ERROR, "Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
DEBUG ((
|
||||||
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion), MM_CALLER_MAJOR_VER, MM_CALLER_MINOR_VER));
|
DEBUG_ERROR,
|
||||||
|
"Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
||||||
|
MM_MAJOR_VER (MmVersion),
|
||||||
|
MM_MINOR_VER (MmVersion),
|
||||||
|
MM_CALLER_MAJOR_VER,
|
||||||
|
MM_CALLER_MINOR_VER
|
||||||
|
));
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,8 +369,11 @@ MmCommunication2Initialize (
|
|||||||
EFI_MEMORY_RUNTIME
|
EFI_MEMORY_RUNTIME
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
DEBUG ((
|
||||||
"Failed to add MM-NS Buffer Memory Space\n"));
|
DEBUG_ERROR,
|
||||||
|
"MmCommunicateInitialize: "
|
||||||
|
"Failed to add MM-NS Buffer Memory Space\n"
|
||||||
|
));
|
||||||
goto ReturnErrorStatus;
|
goto ReturnErrorStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,8 +383,11 @@ MmCommunication2Initialize (
|
|||||||
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
|
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
DEBUG ((
|
||||||
"Failed to set MM-NS Buffer Memory attributes\n"));
|
DEBUG_ERROR,
|
||||||
|
"MmCommunicateInitialize: "
|
||||||
|
"Failed to set MM-NS Buffer Memory attributes\n"
|
||||||
|
));
|
||||||
goto CleanAddedMemorySpace;
|
goto CleanAddedMemorySpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -363,8 +399,11 @@ MmCommunication2Initialize (
|
|||||||
&mMmCommunication2
|
&mMmCommunication2
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
|
DEBUG ((
|
||||||
"Failed to install MM communication protocol\n"));
|
DEBUG_ERROR,
|
||||||
|
"MmCommunicationInitialize: "
|
||||||
|
"Failed to install MM communication protocol\n"
|
||||||
|
));
|
||||||
goto CleanAddedMemorySpace;
|
goto CleanAddedMemorySpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,17 +420,24 @@ MmCommunication2Initialize (
|
|||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
|
for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
|
||||||
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
|
Status = gBS->CreateEventEx (
|
||||||
MmGuidedEventNotify, mGuidedEventGuid[Index],
|
EVT_NOTIFY_SIGNAL,
|
||||||
mGuidedEventGuid[Index], &mGuidedEvent[Index]);
|
TPL_CALLBACK,
|
||||||
|
MmGuidedEventNotify,
|
||||||
|
mGuidedEventGuid[Index],
|
||||||
|
mGuidedEventGuid[Index],
|
||||||
|
&mGuidedEvent[Index]
|
||||||
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
while (Index-- > 0) {
|
while (Index-- > 0) {
|
||||||
gBS->CloseEvent (mGuidedEvent[Index]);
|
gBS->CloseEvent (mGuidedEvent[Index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto UninstallProtocol;
|
goto UninstallProtocol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
UninstallProtocol:
|
UninstallProtocol:
|
||||||
|
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <PiDxe.h>
|
#include <PiDxe.h>
|
||||||
|
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
@@ -306,7 +305,6 @@ TimerInterruptHandler (
|
|||||||
|
|
||||||
// Check if the timer interrupt is active
|
// Check if the timer interrupt is active
|
||||||
if ((ArmGenericTimerGetTimerCtrlReg ()) & ARM_ARCH_TIMER_ISTATUS) {
|
if ((ArmGenericTimerGetTimerCtrlReg ()) & ARM_ARCH_TIMER_ISTATUS) {
|
||||||
|
|
||||||
if (mTimerNotifyFunction != 0) {
|
if (mTimerNotifyFunction != 0) {
|
||||||
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
|
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
|
||||||
}
|
}
|
||||||
@@ -338,7 +336,6 @@ TimerInterruptHandler (
|
|||||||
gBS->RestoreTPL (OriginalTPL);
|
gBS->RestoreTPL (OriginalTPL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the state information for the Timer Architectural Protocol and
|
Initialize the state information for the Timer Architectural Protocol and
|
||||||
the Timer Debug support protocol that allows the debugger to break into a
|
the Timer Debug support protocol that allows the debugger to break into a
|
||||||
@@ -412,7 +409,8 @@ TimerInitialize (
|
|||||||
// Install the Timer Architectural Protocol onto a new handle
|
// Install the Timer Architectural Protocol onto a new handle
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&Handle,
|
&Handle,
|
||||||
&gEfiTimerArchProtocolGuid, &gTimer,
|
&gEfiTimerArchProtocolGuid,
|
||||||
|
&gTimer,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
@@ -60,10 +60,12 @@ typedef struct {
|
|||||||
|
|
||||||
SEMIHOST_DEVICE_PATH gDevicePath = {
|
SEMIHOST_DEVICE_PATH gDevicePath = {
|
||||||
{
|
{
|
||||||
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 } },
|
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH), 0 }
|
||||||
|
},
|
||||||
EFI_CALLER_ID_GUID
|
EFI_CALLER_ID_GUID
|
||||||
},
|
},
|
||||||
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } }
|
{ END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -115,8 +117,6 @@ FreeFCB (
|
|||||||
FreePool (Fcb);
|
FreePool (Fcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
VolumeOpen (
|
VolumeOpen (
|
||||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
|
||||||
@@ -193,12 +193,14 @@ FileOpen (
|
|||||||
|
|
||||||
if ((OpenMode != EFI_FILE_MODE_READ) &&
|
if ((OpenMode != EFI_FILE_MODE_READ) &&
|
||||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
|
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE)) &&
|
||||||
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)) ) {
|
(OpenMode != (EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
|
if (((OpenMode & EFI_FILE_MODE_CREATE) != 0) &&
|
||||||
((Attributes & EFI_FILE_DIRECTORY) != 0)) {
|
((Attributes & EFI_FILE_DIRECTORY) != 0))
|
||||||
|
{
|
||||||
return EFI_WRITE_PROTECTED;
|
return EFI_WRITE_PROTECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,13 +209,15 @@ FileOpen (
|
|||||||
if (AsciiFileName == NULL) {
|
if (AsciiFileName == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
|
UnicodeStrToAsciiStrS (FileName, AsciiFileName, Length);
|
||||||
|
|
||||||
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
|
// Opening '/', '\', '.', or the NULL pathname is trying to open the root directory
|
||||||
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
|
if ((AsciiStrCmp (AsciiFileName, "\\") == 0) ||
|
||||||
(AsciiStrCmp (AsciiFileName, "/") == 0) ||
|
(AsciiStrCmp (AsciiFileName, "/") == 0) ||
|
||||||
(AsciiStrCmp (AsciiFileName, "") == 0) ||
|
(AsciiStrCmp (AsciiFileName, "") == 0) ||
|
||||||
(AsciiStrCmp (AsciiFileName, ".") == 0) ) {
|
(AsciiStrCmp (AsciiFileName, ".") == 0))
|
||||||
|
{
|
||||||
FreePool (AsciiFileName);
|
FreePool (AsciiFileName);
|
||||||
return (VolumeOpen (&gSemihostFs, NewHandle));
|
return (VolumeOpen (&gSemihostFs, NewHandle));
|
||||||
}
|
}
|
||||||
@@ -232,6 +236,7 @@ FileOpen (
|
|||||||
} else {
|
} else {
|
||||||
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
|
SemihostMode = SEMIHOST_FILE_MODE_READ | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
|
Return = SemihostFileOpen (AsciiFileName, SemihostMode, &SemihostHandle);
|
||||||
|
|
||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
@@ -346,6 +351,7 @@ TruncateFile (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
Remaining -= ToRead;
|
Remaining -= ToRead;
|
||||||
Read += ToRead;
|
Read += ToRead;
|
||||||
}
|
}
|
||||||
@@ -379,12 +385,12 @@ Error:
|
|||||||
if (FileHandle != 0) {
|
if (FileHandle != 0) {
|
||||||
SemihostFileClose (FileHandle);
|
SemihostFileClose (FileHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Buffer != NULL) {
|
if (Buffer != NULL) {
|
||||||
FreePool (Buffer);
|
FreePool (Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (Status);
|
return (Status);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -420,6 +426,7 @@ FileClose (
|
|||||||
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
|
if (Fcb->Info.FileSize < Fcb->Info.PhysicalSize) {
|
||||||
TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
|
TruncateFile (Fcb->FileName, Fcb->Info.FileSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Fcb->FileName);
|
FreePool (Fcb->FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,6 +478,7 @@ FileDelete (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_WARN_DELETE_FAILURE;
|
return EFI_WARN_DELETE_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
return EFI_WARN_DELETE_FAILURE;
|
return EFI_WARN_DELETE_FAILURE;
|
||||||
@@ -574,6 +582,7 @@ ExtendFile (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Remaining -= WriteNb;
|
Remaining -= WriteNb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,7 +627,8 @@ FileWrite (
|
|||||||
|
|
||||||
// We cannot write a read-only file
|
// We cannot write a read-only file
|
||||||
if ( (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
if ( (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
||||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
|
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
|
||||||
|
{
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,6 +642,7 @@ FileWrite (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.FileSize = Fcb->Position;
|
Fcb->Info.FileSize = Fcb->Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -650,6 +661,7 @@ FileWrite (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.PhysicalSize = Length;
|
Fcb->Info.PhysicalSize = Length;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@@ -718,8 +730,7 @@ FileSetPosition (
|
|||||||
if (Position != 0) {
|
if (Position != 0) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
//
|
//
|
||||||
// UEFI Spec section 12.5:
|
// UEFI Spec section 12.5:
|
||||||
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
|
// "Seeking to position 0xFFFFFFFFFFFFFFFF causes the current position to
|
||||||
@@ -728,6 +739,7 @@ FileSetPosition (
|
|||||||
if (Position == 0xFFFFFFFFFFFFFFFF) {
|
if (Position == 0xFFFFFFFFFFFFFFFF) {
|
||||||
Position = Fcb->Info.FileSize;
|
Position = Fcb->Info.FileSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
|
Return = SemihostFileSeek (Fcb->SemihostHandle, MIN (Position, Fcb->Info.FileSize));
|
||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
@@ -889,7 +901,8 @@ FileGetInfo (
|
|||||||
if ((This == NULL) ||
|
if ((This == NULL) ||
|
||||||
(InformationType == NULL) ||
|
(InformationType == NULL) ||
|
||||||
(BufferSize == NULL) ||
|
(BufferSize == NULL) ||
|
||||||
((Buffer == NULL) && (*BufferSize > 0)) ) {
|
((Buffer == NULL) && (*BufferSize > 0)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -968,6 +981,7 @@ SetFileInfo (
|
|||||||
if (AsciiFileName == NULL) {
|
if (AsciiFileName == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
|
UnicodeStrToAsciiStrS (Info->FileName, AsciiFileName, Length);
|
||||||
|
|
||||||
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
|
FileSizeIsDifferent = (Info->FileSize != Fcb->Info.FileSize);
|
||||||
@@ -985,7 +999,8 @@ SetFileInfo (
|
|||||||
// description.
|
// description.
|
||||||
//
|
//
|
||||||
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||
|
if ((Fcb->OpenMode == EFI_FILE_MODE_READ) ||
|
||||||
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY) ) {
|
(Fcb->Info.Attribute & EFI_FILE_READ_ONLY))
|
||||||
|
{
|
||||||
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
|
if (FileSizeIsDifferent || FileNameIsDifferent || ReadOnlyIsDifferent) {
|
||||||
Status = EFI_ACCESS_DENIED;
|
Status = EFI_ACCESS_DENIED;
|
||||||
goto Error;
|
goto Error;
|
||||||
@@ -1006,6 +1021,7 @@ SetFileInfo (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The read/write position from the host file system point of view
|
// The read/write position from the host file system point of view
|
||||||
// is at the end of the file. If the position from this module
|
// is at the end of the file. If the position from this module
|
||||||
@@ -1016,12 +1032,14 @@ SetFileInfo (
|
|||||||
FileSetPosition (&Fcb->File, Fcb->Position);
|
FileSetPosition (&Fcb->File, Fcb->Position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.FileSize = FileSize;
|
Fcb->Info.FileSize = FileSize;
|
||||||
|
|
||||||
Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
|
Return = SemihostFileLength (Fcb->SemihostHandle, &Length);
|
||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fcb->Info.PhysicalSize = Length;
|
Fcb->Info.PhysicalSize = Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1048,6 +1066,7 @@ SetFileInfo (
|
|||||||
if (RETURN_ERROR (Return)) {
|
if (RETURN_ERROR (Return)) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Fcb->FileName);
|
FreePool (Fcb->FileName);
|
||||||
Fcb->FileName = AsciiFileName;
|
Fcb->FileName = AsciiFileName;
|
||||||
AsciiFileName = NULL;
|
AsciiFileName = NULL;
|
||||||
@@ -1119,19 +1138,24 @@ FileSetInfo (
|
|||||||
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
|
if (Info->Size < (SIZE_OF_EFI_FILE_INFO + StrSize (Info->FileName))) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize < Info->Size) {
|
if (BufferSize < Info->Size) {
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SetFileInfo (Fcb, Info);
|
return SetFileInfo (Fcb, Info);
|
||||||
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
|
} else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
|
||||||
SystemInfo = Buffer;
|
SystemInfo = Buffer;
|
||||||
if (SystemInfo->Size <
|
if (SystemInfo->Size <
|
||||||
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel))) {
|
(SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SystemInfo->VolumeLabel)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize < SystemInfo->Size) {
|
if (BufferSize < SystemInfo->Size) {
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
return EFI_BAD_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Buffer = SystemInfo->VolumeLabel;
|
Buffer = SystemInfo->VolumeLabel;
|
||||||
|
|
||||||
if (StrSize (Buffer) > 0) {
|
if (StrSize (Buffer) > 0) {
|
||||||
@@ -1166,7 +1190,8 @@ FileFlush (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
if ( (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
if ( (Fcb->Info.Attribute & EFI_FILE_READ_ONLY)
|
||||||
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE)) {
|
|| !(Fcb->OpenMode & EFI_FILE_MODE_WRITE))
|
||||||
|
{
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
} else {
|
} else {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@@ -1192,8 +1217,10 @@ SemihostFsEntryPoint (
|
|||||||
|
|
||||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
&gInstallHandle,
|
&gInstallHandle,
|
||||||
&gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,
|
&gEfiSimpleFileSystemProtocolGuid,
|
||||||
&gEfiDevicePathProtocolGuid, &gDevicePath,
|
&gSemihostFs,
|
||||||
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
&gDevicePath,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -243,4 +243,3 @@ FileFlush (
|
|||||||
);
|
);
|
||||||
|
|
||||||
#endif // SEMIHOST_FS_H_
|
#endif // SEMIHOST_FS_H_
|
||||||
|
|
||||||
|
@@ -1,23 +0,0 @@
|
|||||||
;%HEADER%
|
|
||||||
;/** @file
|
|
||||||
; Macros to centralize the EXPORT, AREA, and definition of an assembly
|
|
||||||
; function. The AREA prefix is required to put the function in its own
|
|
||||||
; section so that removal of unused functions in the final link is performed.
|
|
||||||
; This provides equivalent functionality to the compiler's --split-sections
|
|
||||||
; option.
|
|
||||||
;
|
|
||||||
; Copyright (c) 2015 HP Development Company, L.P.
|
|
||||||
;
|
|
||||||
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
;
|
|
||||||
;**/
|
|
||||||
|
|
||||||
|
|
||||||
MACRO
|
|
||||||
RVCT_ASM_EXPORT $func
|
|
||||||
EXPORT $func
|
|
||||||
AREA s_$func, CODE, READONLY
|
|
||||||
$func
|
|
||||||
MEND
|
|
||||||
|
|
||||||
END
|
|
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#ifndef ASM_MACRO_IO_LIB_H_
|
#ifndef ASM_MACRO_IO_LIB_H_
|
||||||
#define ASM_MACRO_IO_LIB_H_
|
#define ASM_MACRO_IO_LIB_H_
|
||||||
|
|
||||||
|
@@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#ifndef ASM_MACRO_IO_LIBV8_H_
|
#ifndef ASM_MACRO_IO_LIBV8_H_
|
||||||
#define ASM_MACRO_IO_LIBV8_H_
|
#define ASM_MACRO_IO_LIBV8_H_
|
||||||
|
|
||||||
@@ -24,7 +23,6 @@
|
|||||||
cbnz SAFE_XREG, 1f ;\
|
cbnz SAFE_XREG, 1f ;\
|
||||||
b . ;// We should never get here
|
b . ;// We should never get here
|
||||||
|
|
||||||
|
|
||||||
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
// CurrentEL : 0xC = EL3; 8 = EL2; 4 = EL1
|
||||||
// This only selects between EL1 and EL2 and EL3, else we die.
|
// This only selects between EL1 and EL2 and EL3, else we die.
|
||||||
// Provide the Macro with a safe temp xreg to use.
|
// Provide the Macro with a safe temp xreg to use.
|
||||||
|
@@ -152,7 +152,6 @@
|
|||||||
#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD)
|
#define TCR_EL1_TBI0_MASK (0x01UL << TCR_EL1_TBI0_FIELD)
|
||||||
#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD)
|
#define TCR_EL1_TBI1_MASK (0x01UL << TCR_EL1_TBI1_FIELD)
|
||||||
|
|
||||||
|
|
||||||
#define TCR_EL23_T0SZ_FIELD (0)
|
#define TCR_EL23_T0SZ_FIELD (0)
|
||||||
#define TCR_EL23_IRGN0_FIELD (8)
|
#define TCR_EL23_IRGN0_FIELD (8)
|
||||||
#define TCR_EL23_ORGN0_FIELD (10)
|
#define TCR_EL23_ORGN0_FIELD (10)
|
||||||
@@ -166,7 +165,6 @@
|
|||||||
#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD)
|
#define TCR_EL23_TG0_MASK (0x01UL << TCR_EL23_TG0_FIELD)
|
||||||
#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD)
|
#define TCR_EL23_PS_MASK (0x07UL << TCR_EL23_PS_FIELD)
|
||||||
|
|
||||||
|
|
||||||
#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10)
|
#define TCR_RGN_OUTER_NON_CACHEABLE (0x0UL << 10)
|
||||||
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10)
|
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC (0x1UL << 10)
|
||||||
#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10)
|
#define TCR_RGN_OUTER_WRITE_THROUGH (0x2UL << 10)
|
||||||
@@ -195,4 +193,3 @@
|
|||||||
// Uses LPAE Page Table format
|
// Uses LPAE Page Table format
|
||||||
|
|
||||||
#endif // AARCH64_MMU_H_
|
#endif // AARCH64_MMU_H_
|
||||||
|
|
||||||
|
@@ -48,7 +48,6 @@
|
|||||||
#define A9_SCU_SACR_OFFSET 0x50
|
#define A9_SCU_SACR_OFFSET 0x50
|
||||||
#define A9_SCU_SSACR_OFFSET 0x54
|
#define A9_SCU_SSACR_OFFSET 0x54
|
||||||
|
|
||||||
|
|
||||||
UINTN
|
UINTN
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGetScuBaseAddress (
|
ArmGetScuBaseAddress (
|
||||||
@@ -56,4 +55,3 @@ ArmGetScuBaseAddress (
|
|||||||
);
|
);
|
||||||
|
|
||||||
#endif // ARM_CORTEX_A9_H_
|
#endif // ARM_CORTEX_A9_H_
|
||||||
|
|
||||||
|
@@ -41,7 +41,6 @@
|
|||||||
#define CPSR_IRQ (1 << 7)
|
#define CPSR_IRQ (1 << 7)
|
||||||
#define CPSR_FIQ (1 << 6)
|
#define CPSR_FIQ (1 << 6)
|
||||||
|
|
||||||
|
|
||||||
// CPACR - Coprocessor Access Control Register definitions
|
// CPACR - Coprocessor Access Control Register definitions
|
||||||
#define CPACR_CP_DENIED(cp) 0x00
|
#define CPACR_CP_DENIED(cp) 0x00
|
||||||
#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)
|
#define CPACR_CP_PRIV(cp) ((0x1 << ((cp) << 1)) & 0x0FFFFFFF)
|
||||||
|
@@ -33,7 +33,6 @@
|
|||||||
#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE )
|
#define TTBR_MP_NON_CACHEABLE ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_RGN_INNER_NON_CACHEABLE )
|
||||||
#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
|
#define TTBR_MP_WRITE_BACK_ALLOC ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_RGN_INNER_WRITE_BACK_ALLOC | TTBR_SHAREABLE)
|
||||||
|
|
||||||
|
|
||||||
#define TRANSLATION_TABLE_SECTION_COUNT 4096
|
#define TRANSLATION_TABLE_SECTION_COUNT 4096
|
||||||
#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
#define TRANSLATION_TABLE_SECTION_SIZE (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
||||||
#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
#define TRANSLATION_TABLE_SECTION_ALIGNMENT (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
|
||||||
|
@@ -14,8 +14,7 @@
|
|||||||
#define MPIDR_U_BIT_MASK 0x40000000
|
#define MPIDR_U_BIT_MASK 0x40000000
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 ClusterId;
|
UINT64 Mpidr;
|
||||||
UINT32 CoreId;
|
|
||||||
|
|
||||||
// MP Core Mailbox
|
// MP Core Mailbox
|
||||||
EFI_PHYSICAL_ADDRESS MailboxSetAddress;
|
EFI_PHYSICAL_ADDRESS MailboxSetAddress;
|
||||||
@@ -24,37 +23,9 @@ typedef struct {
|
|||||||
UINT64 MailboxClearValue;
|
UINT64 MailboxClearValue;
|
||||||
} ARM_CORE_INFO;
|
} ARM_CORE_INFO;
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
UINT64 Signature;
|
|
||||||
UINT32 Length;
|
|
||||||
UINT32 Revision;
|
|
||||||
UINT64 OemId;
|
|
||||||
UINT64 OemTableId;
|
|
||||||
UINTN OemRevision;
|
|
||||||
UINTN CreatorId;
|
|
||||||
UINTN CreatorRevision;
|
|
||||||
EFI_GUID Identifier;
|
|
||||||
UINTN DataLen;
|
|
||||||
} ARM_PROCESSOR_TABLE_HEADER;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
ARM_PROCESSOR_TABLE_HEADER Header;
|
|
||||||
UINTN NumberOfEntries;
|
|
||||||
ARM_CORE_INFO *ArmCpus;
|
|
||||||
} ARM_PROCESSOR_TABLE;
|
|
||||||
|
|
||||||
|
|
||||||
#define ARM_MP_CORE_INFO_GUID \
|
#define ARM_MP_CORE_INFO_GUID \
|
||||||
{ 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
{ 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
||||||
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_SIGNATURE SIGNATURE_64 ('C', 'P', 'U', 'T', 'A', 'B', 'L', 'E')
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_REVISION 0x00010000 //1.0
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_OEM_ID SIGNATURE_64('A','R','M',' ', 'L', 't', 'd', ' ')
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_OEM_TABLE_ID SIGNATURE_64('V', 'E', 'R', 'S', 'A', 'T', 'I', 'L')
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_OEM_REVISION 0x00000001
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_CREATOR_ID 0xA5A5A5A5
|
|
||||||
#define EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION 0x01000001
|
|
||||||
|
|
||||||
extern EFI_GUID gArmMpCoreInfoGuid;
|
extern EFI_GUID gArmMpCoreInfoGuid;
|
||||||
|
|
||||||
#endif /* ARM_MP_CORE_INFO_GUID_H_ */
|
#endif /* ARM_MP_CORE_INFO_GUID_H_ */
|
||||||
|
@@ -27,8 +27,7 @@ typedef union {
|
|||||||
} CSSELR_DATA;
|
} CSSELR_DATA;
|
||||||
|
|
||||||
/// The cache type values for the InD field of the CSSELR register
|
/// The cache type values for the InD field of the CSSELR register
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
/// Select the data or unified cache
|
/// Select the data or unified cache
|
||||||
CsselrCacheTypeDataOrUnified = 0,
|
CsselrCacheTypeDataOrUnified = 0,
|
||||||
/// Select the instruction cache
|
/// Select the instruction cache
|
||||||
|
@@ -1,13 +1,20 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
* Copyright (c) 2020, NUVIA Inc. All rights reserved.<BR>
|
* Copyright (c) 2020, NUVIA Inc. All rights reserved.<BR>
|
||||||
* Copyright (c) 2012-2017, ARM Limited. All rights reserved.
|
* Copyright (c) 2012 - 2022, Arm Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
* @par Revision Reference:
|
* @par Revision Reference:
|
||||||
* - SMC Calling Convention version 1.2
|
* - [1] SMC Calling Convention version 1.2
|
||||||
* (https://developer.arm.com/documentation/den0028/c/?lang=en)
|
* (https://developer.arm.com/documentation/den0028/c/?lang=en)
|
||||||
|
* - [2] Arm True Random Number Generator Firmware, Interface 1.0,
|
||||||
|
* Platform Design Document.
|
||||||
|
* (https://developer.arm.com/documentation/den0098/latest/)
|
||||||
|
*
|
||||||
|
* @par Glossary:
|
||||||
|
* - TRNG - True Random Number Generator
|
||||||
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef ARM_STD_SMC_H_
|
#ifndef ARM_STD_SMC_H_
|
||||||
@@ -93,6 +100,8 @@
|
|||||||
#define ARM_SMC_ID_PSCI_MIGRATE_AARCH32 0x84000005
|
#define ARM_SMC_ID_PSCI_MIGRATE_AARCH32 0x84000005
|
||||||
#define ARM_SMC_ID_PSCI_SYSTEM_OFF 0x84000008
|
#define ARM_SMC_ID_PSCI_SYSTEM_OFF 0x84000008
|
||||||
#define ARM_SMC_ID_PSCI_SYSTEM_RESET 0x84000009
|
#define ARM_SMC_ID_PSCI_SYSTEM_RESET 0x84000009
|
||||||
|
#define ARM_SMC_ID_PSCI_FEATURES 0x8400000A
|
||||||
|
#define ARM_SMC_ID_PSCI_SYSTEM_RESET2_AARCH64 0xC4000012
|
||||||
|
|
||||||
/* The current PSCI version is: 0.2 */
|
/* The current PSCI version is: 0.2 */
|
||||||
#define ARM_SMC_PSCI_VERSION_MAJOR 0
|
#define ARM_SMC_PSCI_VERSION_MAJOR 0
|
||||||
@@ -137,4 +146,102 @@
|
|||||||
/* 0xbf00ff02 is reserved */
|
/* 0xbf00ff02 is reserved */
|
||||||
#define ARM_SMC_ID_TOS_REVISION 0xbf00ff03
|
#define ARM_SMC_ID_TOS_REVISION 0xbf00ff03
|
||||||
|
|
||||||
|
// Firmware TRNG interface Function IDs
|
||||||
|
|
||||||
|
/*
|
||||||
|
SMC/HVC call to get the version of the TRNG backend,
|
||||||
|
Cf. [2], 2.1 TRNG_VERSION
|
||||||
|
Input values:
|
||||||
|
W0 0x8400_0050
|
||||||
|
W1-W7 Reserved (MBZ)
|
||||||
|
Return values:
|
||||||
|
Success (W0 > 0) W0[31] MBZ
|
||||||
|
W0[30:16] Major revision
|
||||||
|
W0[15:0] Minor revision
|
||||||
|
W1 - W3 Reserved (MBZ)
|
||||||
|
Error (W0 < 0)
|
||||||
|
NOT_SUPPORTED Function not implemented
|
||||||
|
*/
|
||||||
|
#define ARM_SMC_ID_TRNG_VERSION 0x84000050
|
||||||
|
|
||||||
|
/*
|
||||||
|
SMC/HVC call to check if a TRNG function ID is implemented by the backend,
|
||||||
|
Cf. [2], Section 2.2 TRNG_FEATURES
|
||||||
|
Input Values
|
||||||
|
W0 0x8400_0051
|
||||||
|
W1 trng_func_id
|
||||||
|
W2-W7 Reserved (MBZ)
|
||||||
|
Return values:
|
||||||
|
Success (W0 >= 0):
|
||||||
|
SUCCESS Function is implemented.
|
||||||
|
> 0 Function is implemented and
|
||||||
|
has specific capabilities,
|
||||||
|
see function definition.
|
||||||
|
Error (W0 < 0)
|
||||||
|
NOT_SUPPORTED Function with FID=trng_func_id
|
||||||
|
is not implemented
|
||||||
|
*/
|
||||||
|
#define ARM_SMC_ID_TRNG_FEATURES 0x84000051
|
||||||
|
|
||||||
|
/*
|
||||||
|
SMC/HVC call to get the UUID of the TRNG backend,
|
||||||
|
Cf. [2], Section 2.3 TRNG_GET_UUID
|
||||||
|
Input Values:
|
||||||
|
W0 0x8400_0052
|
||||||
|
W1-W7 Reserved (MBZ)
|
||||||
|
Return Values:
|
||||||
|
Success (W0 != -1)
|
||||||
|
W0 UUID[31:0]
|
||||||
|
W1 UUID[63:32]
|
||||||
|
W2 UUID[95:64]
|
||||||
|
W3 UUID[127:96]
|
||||||
|
Error (W0 = -1)
|
||||||
|
W0 NOT_SUPPORTED
|
||||||
|
*/
|
||||||
|
#define ARM_SMC_ID_TRNG_GET_UUID 0x84000052
|
||||||
|
|
||||||
|
/*
|
||||||
|
AARCH32 SMC/HVC call to get entropy bits, Cf. [2], Section 2.4 TRNG_RND.
|
||||||
|
Input values:
|
||||||
|
W0 0x8400_0053
|
||||||
|
W2-W7 Reserved (MBZ)
|
||||||
|
Return values:
|
||||||
|
Success (W0 = 0):
|
||||||
|
W0 MBZ
|
||||||
|
W1 Entropy[95:64]
|
||||||
|
W2 Entropy[63:32]
|
||||||
|
W3 Entropy[31:0]
|
||||||
|
Error (W0 < 0)
|
||||||
|
W0 NOT_SUPPORTED
|
||||||
|
NO_ENTROPY
|
||||||
|
INVALID_PARAMETERS
|
||||||
|
W1 - W3 Reserved (MBZ)
|
||||||
|
*/
|
||||||
|
#define ARM_SMC_ID_TRNG_RND_AARCH32 0x84000053
|
||||||
|
|
||||||
|
/*
|
||||||
|
AARCH64 SMC/HVC call to get entropy bits, Cf. [2], Section 2.4 TRNG_RND.
|
||||||
|
Input values:
|
||||||
|
X0 0xC400_0053
|
||||||
|
X2-X7 Reserved (MBZ)
|
||||||
|
Return values:
|
||||||
|
Success (X0 = 0):
|
||||||
|
X0 MBZ
|
||||||
|
X1 Entropy[191:128]
|
||||||
|
X2 Entropy[127:64]
|
||||||
|
X3 Entropy[63:0]
|
||||||
|
Error (X0 < 0)
|
||||||
|
X0 NOT_SUPPORTED
|
||||||
|
NO_ENTROPY
|
||||||
|
INVALID_PARAMETERS
|
||||||
|
X1 - X3 Reserved (MBZ)
|
||||||
|
*/
|
||||||
|
#define ARM_SMC_ID_TRNG_RND_AARCH64 0xC4000053
|
||||||
|
|
||||||
|
// Firmware TRNG status codes
|
||||||
|
#define TRNG_STATUS_SUCCESS (INT32)(0)
|
||||||
|
#define TRNG_STATUS_NOT_SUPPORTED (INT32)(-1)
|
||||||
|
#define TRNG_STATUS_INVALID_PARAMETER (INT32)(-2)
|
||||||
|
#define TRNG_STATUS_NO_ENTROPY (INT32)(-3)
|
||||||
|
|
||||||
#endif // ARM_STD_SMC_H_
|
#endif // ARM_STD_SMC_H_
|
||||||
|
@@ -17,7 +17,6 @@ typedef enum {
|
|||||||
ARM_GIC_ARCH_REVISION_3
|
ARM_GIC_ARCH_REVISION_3
|
||||||
} ARM_GIC_ARCH_REVISION;
|
} ARM_GIC_ARCH_REVISION;
|
||||||
|
|
||||||
|
|
||||||
ARM_GIC_ARCH_REVISION
|
ARM_GIC_ARCH_REVISION
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGicGetSupportedArchRevision (
|
ArmGicGetSupportedArchRevision (
|
||||||
|
@@ -52,7 +52,6 @@
|
|||||||
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt
|
#define ARM_GIC_ICDICFR_LEVEL_TRIGGERED 0x0 // Level triggered interrupt
|
||||||
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt
|
#define ARM_GIC_ICDICFR_EDGE_TRIGGERED 0x1 // Edge triggered interrupt
|
||||||
|
|
||||||
|
|
||||||
// GIC Redistributor
|
// GIC Redistributor
|
||||||
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
|
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
|
||||||
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
|
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
|
||||||
|
@@ -59,8 +59,12 @@ typedef struct {
|
|||||||
ARM_MEMORY_REGION_ATTRIBUTES Attributes;
|
ARM_MEMORY_REGION_ATTRIBUTES Attributes;
|
||||||
} ARM_MEMORY_REGION_DESCRIPTOR;
|
} ARM_MEMORY_REGION_DESCRIPTOR;
|
||||||
|
|
||||||
typedef VOID (*CACHE_OPERATION)(VOID);
|
typedef VOID (*CACHE_OPERATION)(
|
||||||
typedef VOID (*LINE_OPERATION)(UINTN);
|
VOID
|
||||||
|
);
|
||||||
|
typedef VOID (*LINE_OPERATION)(
|
||||||
|
UINTN
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARM Processor Mode
|
// ARM Processor Mode
|
||||||
@@ -107,6 +111,10 @@ typedef enum {
|
|||||||
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)
|
#define GET_CORE_ID(MpId) ((MpId) & ARM_CORE_MASK)
|
||||||
#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)
|
#define GET_CLUSTER_ID(MpId) (((MpId) & ARM_CLUSTER_MASK) >> 8)
|
||||||
#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))
|
#define GET_MPID(ClusterId, CoreId) (((ClusterId) << 8) | (CoreId))
|
||||||
|
#define GET_MPIDR_AFF0(MpId) ((MpId) & ARM_CORE_AFF0)
|
||||||
|
#define GET_MPIDR_AFF1(MpId) (((MpId) & ARM_CORE_AFF1) >> 8)
|
||||||
|
#define GET_MPIDR_AFF2(MpId) (((MpId) & ARM_CORE_AFF2) >> 16)
|
||||||
|
#define GET_MPIDR_AFF3(MpId) (((MpId) & ARM_CORE_AFF3) >> 32)
|
||||||
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
|
#define PRIMARY_CORE_ID (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
|
||||||
|
|
||||||
/** Reads the CCSIDR register for the specified cache.
|
/** Reads the CCSIDR register for the specified cache.
|
||||||
@@ -183,7 +191,6 @@ ArmInvalidateDataCache (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmCleanInvalidateDataCache (
|
ArmCleanInvalidateDataCache (
|
||||||
@@ -573,7 +580,6 @@ ArmWriteHVBar (
|
|||||||
IN UINTN HypModeVectorBase
|
IN UINTN HypModeVectorBase
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Helper functions for accessing CPU ACTLR
|
// Helper functions for accessing CPU ACTLR
|
||||||
//
|
//
|
||||||
@@ -736,7 +742,6 @@ ArmGetPhysicalAddressBits (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// ID Register Helper functions
|
/// ID Register Helper functions
|
||||||
///
|
///
|
||||||
@@ -768,6 +773,7 @@ ArmHasCcidx (
|
|||||||
///
|
///
|
||||||
/// AArch32-only ID Register Helper functions
|
/// AArch32-only ID Register Helper functions
|
||||||
///
|
///
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether the CPU supports the Security extensions
|
Check whether the CPU supports the Security extensions
|
||||||
|
|
||||||
@@ -779,6 +785,7 @@ EFIAPI
|
|||||||
ArmHasSecurityExtensions (
|
ArmHasSecurityExtensions (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif // MDE_CPU_ARM
|
#endif // MDE_CPU_ARM
|
||||||
|
|
||||||
#endif // ARM_LIB_H_
|
#endif // ARM_LIB_H_
|
||||||
|
@@ -54,7 +54,8 @@ EFIAPI
|
|||||||
ArmReplaceLiveTranslationEntry (
|
ArmReplaceLiveTranslationEntry (
|
||||||
IN UINT64 *Entry,
|
IN UINT64 *Entry,
|
||||||
IN UINT64 Value,
|
IN UINT64 Value,
|
||||||
IN UINT64 RegionStart
|
IN UINT64 RegionStart,
|
||||||
|
IN BOOLEAN DisableMmu
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
|
42
ArmPkg/Include/Library/ArmMonitorLib.h
Normal file
42
ArmPkg/Include/Library/ArmMonitorLib.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/** @file
|
||||||
|
|
||||||
|
Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
|
||||||
|
|
||||||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef ARM_MONITOR_LIB_H_
|
||||||
|
#define ARM_MONITOR_LIB_H_
|
||||||
|
|
||||||
|
/** The size of the SMC arguments is different between AArch64 and AArch32.
|
||||||
|
|
||||||
|
The native size is used for the arguments.
|
||||||
|
It will be casted to either HVC or SMC args.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
UINTN Arg0;
|
||||||
|
UINTN Arg1;
|
||||||
|
UINTN Arg2;
|
||||||
|
UINTN Arg3;
|
||||||
|
UINTN Arg4;
|
||||||
|
UINTN Arg5;
|
||||||
|
UINTN Arg6;
|
||||||
|
UINTN Arg7;
|
||||||
|
} ARM_MONITOR_ARGS;
|
||||||
|
|
||||||
|
/** Monitor call.
|
||||||
|
|
||||||
|
An HyperVisor Call (HVC) or System Monitor Call (SMC) will be issued
|
||||||
|
depending on the default conduit. PcdMonitorConduitHvc determines the type
|
||||||
|
of the call: if true, do an HVC.
|
||||||
|
|
||||||
|
@param [in,out] Args Arguments for the HVC/SMC.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ArmMonitorCall (
|
||||||
|
IN OUT ARM_MONITOR_ARGS *Args
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif // ARM_MONITOR_LIB_H_
|
@@ -128,4 +128,3 @@ MtlReceiveMessage (
|
|||||||
);
|
);
|
||||||
|
|
||||||
#endif /* ARM_MTL_LIB_H_ */
|
#endif /* ARM_MTL_LIB_H_ */
|
||||||
|
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
|
||||||
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
* Copyright (c) 2012-2014, ARM Limited. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
@@ -37,4 +38,76 @@ ArmCallSmc (
|
|||||||
IN OUT ARM_SMC_ARGS *Args
|
IN OUT ARM_SMC_ARGS *Args
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/** Trigger an SMC call with 3 arguments.
|
||||||
|
|
||||||
|
@param Function The SMC function.
|
||||||
|
@param Arg1 Argument/result.
|
||||||
|
@param Arg2 Argument/result.
|
||||||
|
@param Arg3 Argument/result.
|
||||||
|
|
||||||
|
@return The SMC error code.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
ArmCallSmc3 (
|
||||||
|
IN UINTN Function,
|
||||||
|
IN OUT UINTN *Arg1 OPTIONAL,
|
||||||
|
IN OUT UINTN *Arg2 OPTIONAL,
|
||||||
|
IN OUT UINTN *Arg3 OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Trigger an SMC call with 2 arguments.
|
||||||
|
|
||||||
|
@param Function The SMC function.
|
||||||
|
@param Arg1 Argument/result.
|
||||||
|
@param Arg2 Argument/result.
|
||||||
|
@param Arg3 Result.
|
||||||
|
|
||||||
|
@return The SMC error code.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
ArmCallSmc2 (
|
||||||
|
IN UINTN Function,
|
||||||
|
IN OUT UINTN *Arg1 OPTIONAL,
|
||||||
|
IN OUT UINTN *Arg2 OPTIONAL,
|
||||||
|
OUT UINTN *Arg3 OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Trigger an SMC call with 1 argument.
|
||||||
|
|
||||||
|
@param Function The SMC function.
|
||||||
|
@param Arg1 Argument/result.
|
||||||
|
@param Arg2 Result.
|
||||||
|
@param Arg3 Result.
|
||||||
|
|
||||||
|
@return The SMC error code.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
ArmCallSmc1 (
|
||||||
|
IN UINTN Function,
|
||||||
|
IN OUT UINTN *Arg1 OPTIONAL,
|
||||||
|
OUT UINTN *Arg2 OPTIONAL,
|
||||||
|
OUT UINTN *Arg3 OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Trigger an SMC call with 0 arguments.
|
||||||
|
|
||||||
|
@param Function The SMC function.
|
||||||
|
@param Arg1 Result.
|
||||||
|
@param Arg2 Result.
|
||||||
|
@param Arg3 Result.
|
||||||
|
|
||||||
|
@return The SMC error code.
|
||||||
|
|
||||||
|
**/
|
||||||
|
UINTN
|
||||||
|
ArmCallSmc0 (
|
||||||
|
IN UINTN Function,
|
||||||
|
OUT UINTN *Arg1 OPTIONAL,
|
||||||
|
OUT UINTN *Arg2 OPTIONAL,
|
||||||
|
OUT UINTN *Arg3 OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
#endif // ARM_SMC_LIB_H_
|
#endif // ARM_SMC_LIB_H_
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
*
|
*
|
||||||
|
* Copyright (c) 2022, Ampere Computing LLC. All rights reserved.
|
||||||
* Copyright (c) 2021, NUVIA Inc. All rights reserved.
|
* Copyright (c) 2021, NUVIA Inc. All rights reserved.
|
||||||
* Copyright (c) 2015, Hisilicon Limited. All rights reserved.
|
* Copyright (c) 2015, Hisilicon Limited. All rights reserved.
|
||||||
* Copyright (c) 2015, Linaro Limited. All rights reserved.
|
* Copyright (c) 2015, Linaro Limited. All rights reserved.
|
||||||
@@ -8,15 +9,13 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#ifndef OEM_MISC_LIB_H_
|
#ifndef OEM_MISC_LIB_H_
|
||||||
#define OEM_MISC_LIB_H_
|
#define OEM_MISC_LIB_H_
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
#include <IndustryStandard/SmBios.h>
|
#include <IndustryStandard/SmBios.h>
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
CpuCacheL1 = 1,
|
CpuCacheL1 = 1,
|
||||||
CpuCacheL2,
|
CpuCacheL2,
|
||||||
CpuCacheL3,
|
CpuCacheL3,
|
||||||
@@ -27,8 +26,7 @@ typedef enum
|
|||||||
CpuCacheLevelMax
|
CpuCacheLevelMax
|
||||||
} OEM_MISC_CPU_CACHE_LEVEL;
|
} OEM_MISC_CPU_CACHE_LEVEL;
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
UINT8 Voltage; ///< Processor voltage
|
UINT8 Voltage; ///< Processor voltage
|
||||||
UINT16 CurrentSpeed; ///< Current clock speed in MHz
|
UINT16 CurrentSpeed; ///< Current clock speed in MHz
|
||||||
UINT16 MaxSpeed; ///< Maximum clock speed in MHz
|
UINT16 MaxSpeed; ///< Maximum clock speed in MHz
|
||||||
@@ -38,17 +36,20 @@ typedef struct
|
|||||||
UINT16 ThreadCount; ///< Number of threads per processor
|
UINT16 ThreadCount; ///< Number of threads per processor
|
||||||
} OEM_MISC_PROCESSOR_DATA;
|
} OEM_MISC_PROCESSOR_DATA;
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
BiosVersionType00,
|
||||||
ProductNameType01,
|
ProductNameType01,
|
||||||
SerialNumType01,
|
SerialNumType01,
|
||||||
UuidType01,
|
UuidType01,
|
||||||
SystemManufacturerType01,
|
SystemManufacturerType01,
|
||||||
|
VersionType01,
|
||||||
SkuNumberType01,
|
SkuNumberType01,
|
||||||
FamilyType01,
|
FamilyType01,
|
||||||
AssertTagType02,
|
AssetTagType02,
|
||||||
SerialNumberType02,
|
SerialNumberType02,
|
||||||
BoardManufacturerType02,
|
BoardManufacturerType02,
|
||||||
|
ProductNameType02,
|
||||||
|
VersionType02,
|
||||||
SkuNumberType02,
|
SkuNumberType02,
|
||||||
ChassisLocationType02,
|
ChassisLocationType02,
|
||||||
AssetTagType03,
|
AssetTagType03,
|
||||||
@@ -57,6 +58,9 @@ typedef enum
|
|||||||
ChassisTypeType03,
|
ChassisTypeType03,
|
||||||
ManufacturerType03,
|
ManufacturerType03,
|
||||||
SkuNumberType03,
|
SkuNumberType03,
|
||||||
|
ProcessorPartNumType04,
|
||||||
|
ProcessorSerialNumType04,
|
||||||
|
ProcessorVersionType04,
|
||||||
SmbiosHiiStringFieldMax
|
SmbiosHiiStringFieldMax
|
||||||
} OEM_MISC_SMBIOS_HII_STRING_FIELD;
|
} OEM_MISC_SMBIOS_HII_STRING_FIELD;
|
||||||
|
|
||||||
@@ -232,4 +236,36 @@ OemGetChassisNumPowerCords (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Fetches the system UUID.
|
||||||
|
|
||||||
|
@param[out] SystemUuid The pointer to the buffer to store the System UUID.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
OemGetSystemUuid (
|
||||||
|
OUT GUID *SystemUuid
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Fetches the BIOS release.
|
||||||
|
|
||||||
|
@return The BIOS release.
|
||||||
|
**/
|
||||||
|
UINT16
|
||||||
|
EFIAPI
|
||||||
|
OemGetBiosRelease (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
/** Fetches the embedded controller firmware release.
|
||||||
|
|
||||||
|
@return The embedded controller firmware release.
|
||||||
|
**/
|
||||||
|
UINT16
|
||||||
|
EFIAPI
|
||||||
|
OemGetEmbeddedControllerFirmwareRelease (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
#endif // OEM_MISC_LIB_H_
|
#endif // OEM_MISC_LIB_H_
|
||||||
|
@@ -18,4 +18,3 @@
|
|||||||
#define SCMI_MAX_STR_LEN 16
|
#define SCMI_MAX_STR_LEN 16
|
||||||
|
|
||||||
#endif /* ARM_SCMI_H_ */
|
#endif /* ARM_SCMI_H_ */
|
||||||
|
|
||||||
|
@@ -215,4 +215,3 @@ typedef struct _SCMI_CLOCK_PROTOCOL {
|
|||||||
} SCMI_CLOCK_PROTOCOL;
|
} SCMI_CLOCK_PROTOCOL;
|
||||||
|
|
||||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
|
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
|
||||||
|
|
||||||
|
@@ -256,4 +256,3 @@ typedef enum {
|
|||||||
} SCMI_MESSAGE_ID_PERFORMANCE;
|
} SCMI_MESSAGE_ID_PERFORMANCE;
|
||||||
|
|
||||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
|
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
|
||||||
|
|
||||||
|
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include <Base.h>
|
#include <Base.h>
|
||||||
#include <Library/ArmLib.h>
|
#include <Library/ArmLib.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
@@ -25,7 +24,6 @@
|
|||||||
#define MULT_U64_X_N MultU64x64
|
#define MULT_U64_X_N MultU64x64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
RETURN_STATUS
|
RETURN_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TimerConstructor (
|
TimerConstructor (
|
||||||
@@ -36,7 +34,6 @@ TimerConstructor (
|
|||||||
// Check if the ARM Generic Timer Extension is implemented.
|
// Check if the ARM Generic Timer Extension is implemented.
|
||||||
//
|
//
|
||||||
if (ArmIsArchTimerImplemented ()) {
|
if (ArmIsArchTimerImplemented ()) {
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check if Architectural Timer frequency is pre-determined by the platform
|
// Check if Architectural Timer frequency is pre-determined by the platform
|
||||||
// (ie. nonzero).
|
// (ie. nonzero).
|
||||||
@@ -59,6 +56,7 @@ TimerConstructor (
|
|||||||
if (ArmHasSecurityExtensions ()) {
|
if (ArmHasSecurityExtensions ()) {
|
||||||
ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz));
|
ArmGenericTimerSetTimerFreq (PcdGet32 (PcdArmArchTimerFreqInHz));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,9 +66,8 @@ TimerConstructor (
|
|||||||
// If the reset value (0) is returned, just ASSERT.
|
// If the reset value (0) is returned, just ASSERT.
|
||||||
//
|
//
|
||||||
ASSERT (ArmGenericTimerGetTimerFreq () != 0);
|
ASSERT (ArmGenericTimerGetTimerFreq () != 0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
DEBUG ((EFI_D_ERROR, "ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n"));
|
DEBUG ((DEBUG_ERROR, "ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n"));
|
||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,10 +93,10 @@ GetPlatformTimerFreq (
|
|||||||
if (TimerFreq == 0) {
|
if (TimerFreq == 0) {
|
||||||
TimerFreq = ArmGenericTimerGetTimerFreq ();
|
TimerFreq = ArmGenericTimerGetTimerFreq ();
|
||||||
}
|
}
|
||||||
|
|
||||||
return TimerFreq;
|
return TimerFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stalls the CPU for the number of microseconds specified by MicroSeconds.
|
Stalls the CPU for the number of microseconds specified by MicroSeconds.
|
||||||
|
|
||||||
@@ -141,7 +138,6 @@ MicroSecondDelay (
|
|||||||
return MicroSeconds;
|
return MicroSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stalls the CPU for at least the given number of nanoseconds.
|
Stalls the CPU for at least the given number of nanoseconds.
|
||||||
|
|
||||||
@@ -219,7 +215,7 @@ GetPerformanceCounter (
|
|||||||
UINT64
|
UINT64
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetPerformanceCounterProperties (
|
GetPerformanceCounterProperties (
|
||||||
OUT UINT64 *StartValue, OPTIONAL
|
OUT UINT64 *StartValue OPTIONAL,
|
||||||
OUT UINT64 *EndValue OPTIONAL
|
OUT UINT64 *EndValue OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@@ -267,7 +263,8 @@ GetTimeInNanoSecond (
|
|||||||
DivU64x32Remainder (
|
DivU64x32Remainder (
|
||||||
Ticks,
|
Ticks,
|
||||||
TimerFreq,
|
TimerFreq,
|
||||||
&Remainder),
|
&Remainder
|
||||||
|
),
|
||||||
1000000000U
|
1000000000U
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -278,7 +275,8 @@ GetTimeInNanoSecond (
|
|||||||
NanoSeconds += DivU64x32 (
|
NanoSeconds += DivU64x32 (
|
||||||
MULT_U64_X_N (
|
MULT_U64_X_N (
|
||||||
(UINT64)Remainder,
|
(UINT64)Remainder,
|
||||||
1000000000U),
|
1000000000U
|
||||||
|
),
|
||||||
TimerFreq
|
TimerFreq
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -34,6 +34,7 @@ CacheRangeOperation (
|
|||||||
LineOperation (AlignedAddress);
|
LineOperation (AlignedAddress);
|
||||||
AlignedAddress += LineLength;
|
AlignedAddress += LineLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
ArmDataSynchronizationBarrier ();
|
ArmDataSynchronizationBarrier ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,11 +63,18 @@ InvalidateInstructionCacheRange (
|
|||||||
IN UINTN Length
|
IN UINTN Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CacheRangeOperation (Address, Length, ArmCleanDataCacheEntryToPoUByMVA,
|
CacheRangeOperation (
|
||||||
ArmDataCacheLineLength ());
|
Address,
|
||||||
CacheRangeOperation (Address, Length,
|
Length,
|
||||||
|
ArmCleanDataCacheEntryToPoUByMVA,
|
||||||
|
ArmDataCacheLineLength ()
|
||||||
|
);
|
||||||
|
CacheRangeOperation (
|
||||||
|
Address,
|
||||||
|
Length,
|
||||||
ArmInvalidateInstructionCacheEntryToPoUByMVA,
|
ArmInvalidateInstructionCacheEntryToPoUByMVA,
|
||||||
ArmInstructionCacheLineLength ());
|
ArmInstructionCacheLineLength ()
|
||||||
|
);
|
||||||
|
|
||||||
ArmInstructionSynchronizationBarrier ();
|
ArmInstructionSynchronizationBarrier ();
|
||||||
|
|
||||||
@@ -89,8 +97,12 @@ WriteBackInvalidateDataCacheRange (
|
|||||||
IN UINTN Length
|
IN UINTN Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
|
CacheRangeOperation (
|
||||||
ArmDataCacheLineLength ());
|
Address,
|
||||||
|
Length,
|
||||||
|
ArmCleanInvalidateDataCacheEntryByMVA,
|
||||||
|
ArmDataCacheLineLength ()
|
||||||
|
);
|
||||||
return Address;
|
return Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +122,12 @@ WriteBackDataCacheRange (
|
|||||||
IN UINTN Length
|
IN UINTN Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
|
CacheRangeOperation (
|
||||||
ArmDataCacheLineLength ());
|
Address,
|
||||||
|
Length,
|
||||||
|
ArmCleanDataCacheEntryByMVA,
|
||||||
|
ArmDataCacheLineLength ()
|
||||||
|
);
|
||||||
return Address;
|
return Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,7 +138,11 @@ InvalidateDataCacheRange (
|
|||||||
IN UINTN Length
|
IN UINTN Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
|
CacheRangeOperation (
|
||||||
ArmDataCacheLineLength ());
|
Address,
|
||||||
|
Length,
|
||||||
|
ArmInvalidateDataCacheEntryByMVA,
|
||||||
|
ArmDataCacheLineLength ()
|
||||||
|
);
|
||||||
return Address;
|
return Address;
|
||||||
}
|
}
|
||||||
|
@@ -69,7 +69,6 @@ CHAR8 *gLdmStack[] = {
|
|||||||
|
|
||||||
#define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)])
|
#define LDM_EXT(_reg, _off) ((_reg == 13) ? gLdmStack[(_off)] : gLdmAdr[(_off)])
|
||||||
|
|
||||||
|
|
||||||
#define SIGN(_U) ((_U) ? "" : "-")
|
#define SIGN(_U) ((_U) ? "" : "-")
|
||||||
#define WRITE(_Write) ((_Write) ? "!" : "")
|
#define WRITE(_Write) ((_Write) ? "!" : "")
|
||||||
#define BYTE(_B) ((_B) ? "B":"")
|
#define BYTE(_B) ((_B) ? "B":"")
|
||||||
@@ -110,9 +109,11 @@ MRegList (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (First) {
|
if (First) {
|
||||||
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR");
|
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "ERROR");
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}");
|
AsciiStrCatS (mMregListStr, sizeof mMregListStr, "}");
|
||||||
|
|
||||||
// BugBug: Make caller pass in buffer it is cleaner
|
// BugBug: Make caller pass in buffer it is cleaner
|
||||||
@@ -136,7 +137,6 @@ RotateRight (
|
|||||||
return (Op >> Shift) | (Op << (32 - Shift));
|
return (Op >> Shift) | (Op << (32 - Shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
||||||
point to next instruction.
|
point to next instruction.
|
||||||
@@ -181,7 +181,6 @@ DisassembleArmInstruction (
|
|||||||
Rd = (OpCode >> 12) & 0xf;
|
Rd = (OpCode >> 12) & 0xf;
|
||||||
Rm = (OpCode & 0xf);
|
Rm = (OpCode & 0xf);
|
||||||
|
|
||||||
|
|
||||||
if (Extended) {
|
if (Extended) {
|
||||||
Index = AsciiSPrint (Buf, Size, "0x%08x ", OpCode);
|
Index = AsciiSPrint (Buf, Size, "0x%08x ", OpCode);
|
||||||
Buf += Index;
|
Buf += Index;
|
||||||
@@ -197,6 +196,7 @@ DisassembleArmInstruction (
|
|||||||
// A4.1.103 STREX{<cond>} <Rd>, <Rm>, [<Rn>]
|
// A4.1.103 STREX{<cond>} <Rd>, <Rm>, [<Rn>]
|
||||||
AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]);
|
AsciiSPrint (Buf, Size, "STREX%a %a, %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn], gReg[Rn]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,6 +212,7 @@ DisassembleArmInstruction (
|
|||||||
// A4.1.98 STM{<cond>}<addressing_mode> <Rn>, <registers>^
|
// A4.1.98 STM{<cond>}<addressing_mode> <Rn>, <registers>^
|
||||||
AsciiSPrint (Buf, Size, "STM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn, (OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
|
AsciiSPrint (Buf, Size, "STM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn, (OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,6 +224,7 @@ DisassembleArmInstruction (
|
|||||||
} else {
|
} else {
|
||||||
Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T" : "", gReg[Rd]);
|
Index = AsciiSPrint (Buf, Size, "%a%a%a%a %a, ", Load ? "LDR" : "STR", COND (OpCode), BYTE (WriteBack), (!(Pre) && Write) ? "T" : "", gReg[Rd]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Pre) {
|
if (Pre) {
|
||||||
if (!Imm) {
|
if (!Imm) {
|
||||||
// A5.2.2 [<Rn>, #+/-<offset_12>]
|
// A5.2.2 [<Rn>, #+/-<offset_12>]
|
||||||
@@ -255,7 +257,8 @@ DisassembleArmInstruction (
|
|||||||
|
|
||||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%a, %a, #%d]%a", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm, WRITE (Write));
|
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%a, %a, #%d]%a", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm, WRITE (Write));
|
||||||
}
|
}
|
||||||
} else { // !Pre
|
} else {
|
||||||
|
// !Pre
|
||||||
if (!Imm) {
|
if (!Imm) {
|
||||||
// A5.2.8 [<Rn>], #+/-<offset_12>
|
// A5.2.8 [<Rn>], #+/-<offset_12>
|
||||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x", gReg[Rn], SIGN (Up), Offset12);
|
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x", gReg[Rn], SIGN (Up), Offset12);
|
||||||
@@ -287,6 +290,7 @@ DisassembleArmInstruction (
|
|||||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a, %a, #%d", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm);
|
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a, %a, #%d", gReg[Rn], SIGN (Up), gReg[Rm], Type, ShiftImm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,6 +341,7 @@ DisassembleArmInstruction (
|
|||||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]);
|
AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%a", gReg[Rn], SIGN (Up), gReg[Rm]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,15 +376,20 @@ DisassembleArmInstruction (
|
|||||||
AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f));
|
AsciiSPrint (Buf, Size, "CPS #0x%x", (OpCode & 0x2f));
|
||||||
} else {
|
} else {
|
||||||
IMod = (OpCode >> 18) & 0x3;
|
IMod = (OpCode >> 18) & 0x3;
|
||||||
Index = AsciiSPrint (Buf, Size, "CPS%a %a%a%a",
|
Index = AsciiSPrint (
|
||||||
|
Buf,
|
||||||
|
Size,
|
||||||
|
"CPS%a %a%a%a",
|
||||||
(IMod == 3) ? "ID" : "IE",
|
(IMod == 3) ? "ID" : "IE",
|
||||||
((OpCode & BIT8) != 0) ? "A" : "",
|
((OpCode & BIT8) != 0) ? "A" : "",
|
||||||
((OpCode & BIT7) != 0) ? "I" : "",
|
((OpCode & BIT7) != 0) ? "I" : "",
|
||||||
((OpCode & BIT6) != 0) ? "F":"");
|
((OpCode & BIT6) != 0) ? "F" : ""
|
||||||
|
);
|
||||||
if ((OpCode & BIT17) != 0) {
|
if ((OpCode & BIT17) != 0) {
|
||||||
AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f);
|
AsciiSPrint (&Buf[Index], Size - Index, ", #0x%x", OpCode & 0x1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,7 +405,6 @@ DisassembleArmInstruction (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((OpCode & 0x0db00000) == 0x01200000) {
|
if ((OpCode & 0x0db00000) == 0x01200000) {
|
||||||
// A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
|
// A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
|
||||||
if (Imm) {
|
if (Imm) {
|
||||||
@@ -405,6 +414,7 @@ DisassembleArmInstruction (
|
|||||||
// MSR{<cond>} CPSR_<fields>, <Rm>
|
// MSR{<cond>} CPSR_<fields>, <Rm>
|
||||||
AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]);
|
AsciiSPrint (Buf, Size, "MRS%a %a_%a, %a", COND (OpCode), WriteBack ? "SPSR" : "CPSR", gReg[Rd]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -434,7 +444,6 @@ DisassembleArmInstruction (
|
|||||||
// A5.5.5.2 [<Rn>, #+/-<offset_8>*4 ]!
|
// A5.5.5.2 [<Rn>, #+/-<offset_8>*4 ]!
|
||||||
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a0x%x*4]%a", gReg[Rn], SIGN (Up), OpCode & 0xff, WRITE (Write));
|
AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a0x%x*4]%a", gReg[Rn], SIGN (Up), OpCode & 0xff, WRITE (Write));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((OpCode & 0x0f000010) == 0x0e000010) {
|
if ((OpCode & 0x0f000010) == 0x0e000010) {
|
||||||
@@ -454,4 +463,3 @@ DisassembleArmInstruction (
|
|||||||
*OpCodePtr += 1;
|
*OpCodePtr += 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -93,9 +93,6 @@ extern CHAR8 *gReg[];
|
|||||||
#define THUMB2_MRS 235
|
#define THUMB2_MRS 235
|
||||||
#define THUMB2_MSR 236
|
#define THUMB2_MSR 236
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CHAR8 *Start;
|
CHAR8 *Start;
|
||||||
UINT32 OpCode;
|
UINT32 OpCode;
|
||||||
@@ -202,7 +199,6 @@ THUMB_INSTRUCTIONS gOpThumb[] = {
|
|||||||
{ "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 },
|
{ "UXTH", 0xb280, 0xffc0, DATA_FORMAT5 },
|
||||||
|
|
||||||
{ "IT", 0xbf00, 0xff00, IT_BLOCK }
|
{ "IT", 0xbf00, 0xff00, IT_BLOCK }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
THUMB_INSTRUCTIONS gOpThumb2[] = {
|
THUMB_INSTRUCTIONS gOpThumb2[] = {
|
||||||
@@ -281,7 +277,6 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
|
|||||||
{ "MLA", 0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
|
{ "MLA", 0xfb000000, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
{ "MLS", 0xfb000010, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
|
{ "MLS", 0xfb000010, 0xfff000f0, THUMB2_4REGS }, // MLA <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
|
|
||||||
|
|
||||||
{ "SMLABB", 0xfb100000, 0xfff000f0, THUMB2_4REGS }, // SMLABB <Rd>, <Rn>, <Rm>, <Ra>
|
{ "SMLABB", 0xfb100000, 0xfff000f0, THUMB2_4REGS }, // SMLABB <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
{ "SMLABT", 0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT <Rd>, <Rn>, <Rm>, <Ra>
|
{ "SMLABT", 0xfb100010, 0xfff000f0, THUMB2_4REGS }, // SMLABT <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
{ "SMLABB", 0xfb100020, 0xfff000f0, THUMB2_4REGS }, // SMLATB <Rd>, <Rn>, <Rm>, <Ra>
|
{ "SMLABB", 0xfb100020, 0xfff000f0, THUMB2_4REGS }, // SMLATB <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
@@ -298,7 +293,6 @@ THUMB_INSTRUCTIONS gOpThumb2[] = {
|
|||||||
{ "SMLAD", 0xfb200000, 0xfff000f0, THUMB2_4REGS }, // SMLAD <Rd>, <Rn>, <Rm>, <Ra>
|
{ "SMLAD", 0xfb200000, 0xfff000f0, THUMB2_4REGS }, // SMLAD <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
{ "SMLADX", 0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX <Rd>, <Rn>, <Rm>, <Ra>
|
{ "SMLADX", 0xfb200010, 0xfff000f0, THUMB2_4REGS }, // SMLADX <Rd>, <Rn>, <Rm>, <Ra>
|
||||||
|
|
||||||
|
|
||||||
{ "B", 0xf0008000, 0xf800d000, B_T3 }, // B<c> <label>
|
{ "B", 0xf0008000, 0xf800d000, B_T3 }, // B<c> <label>
|
||||||
{ "B", 0xf0009000, 0xf800d000, B_T4 }, // B<c> <label>
|
{ "B", 0xf0009000, 0xf800d000, B_T4 }, // B<c> <label>
|
||||||
{ "BL", 0xf000d000, 0xf800d000, B_T4 }, // BL<c> <label>
|
{ "BL", 0xf000d000, 0xf800d000, B_T4 }, // BL<c> <label>
|
||||||
@@ -419,9 +413,11 @@ ThumbMRegList (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (First) {
|
if (First) {
|
||||||
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR");
|
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "ERROR");
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}");
|
AsciiStrCatS (mThumbMregListStr, sizeof mThumbMregListStr, "}");
|
||||||
|
|
||||||
// BugBug: Make caller pass in buffer it is cleaner
|
// BugBug: Make caller pass in buffer it is cleaner
|
||||||
@@ -521,6 +517,7 @@ DisassembleThumbInstruction (
|
|||||||
*OpCodePtrPtr += 1;
|
*OpCodePtrPtr += 1;
|
||||||
|
|
||||||
// Manage IT Block ItFlag TRUE means we are in an IT block
|
// Manage IT Block ItFlag TRUE means we are in an IT block
|
||||||
|
|
||||||
/*if (*ItBlock != 0) {
|
/*if (*ItBlock != 0) {
|
||||||
ItFlag = TRUE;
|
ItFlag = TRUE;
|
||||||
*ItBlock -= 1;
|
*ItBlock -= 1;
|
||||||
@@ -535,6 +532,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start);
|
Offset = AsciiSPrint (Buf, Size, "%-6a", gOpThumb[Index].Start);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (gOpThumb[Index].AddressMode) {
|
switch (gOpThumb[Index].AddressMode) {
|
||||||
case LOAD_STORE_FORMAT1:
|
case LOAD_STORE_FORMAT1:
|
||||||
// A6.5.1 <Rd>, [<Rn>, #<5_bit_offset>]
|
// A6.5.1 <Rd>, [<Rn>, #<5_bit_offset>]
|
||||||
@@ -579,7 +577,6 @@ DisassembleThumbInstruction (
|
|||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", ThumbMRegList ((OpCode & 0xff) | ((OpCode & BIT8) == BIT8 ? BIT14 : 0)));
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", ThumbMRegList ((OpCode & 0xff) | ((OpCode & BIT8) == BIT8 ? BIT14 : 0)));
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
case IMMED_8:
|
case IMMED_8:
|
||||||
// A6.7 <immed_8>
|
// A6.7 <immed_8>
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " 0x%x", OpCode & 0xff);
|
||||||
@@ -684,13 +681,13 @@ DisassembleThumbInstruction (
|
|||||||
} else if ((OpCode & 0xf) == 0x8) {
|
} else if ((OpCode & 0xf) == 0x8) {
|
||||||
*ItBlock = 1;
|
*ItBlock = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a", gCondition[(OpCode >> 4) & 0xf]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Thumb2 are 32-bit instructions
|
// Thumb2 are 32-bit instructions
|
||||||
*OpCodePtrPtr += 1;
|
*OpCodePtrPtr += 1;
|
||||||
Rt = (OpCode32 >> 12) & 0xf;
|
Rt = (OpCode32 >> 12) & 0xf;
|
||||||
@@ -705,6 +702,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
Offset = AsciiSPrint (Buf, Size, " %-6a", gOpThumb2[Index].Start);
|
Offset = AsciiSPrint (Buf, Size, " %-6a", gOpThumb2[Index].Start);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (gOpThumb2[Index].AddressMode) {
|
switch (gOpThumb2[Index].AddressMode) {
|
||||||
case B_T3:
|
case B_T3:
|
||||||
Cond = gCondition[(OpCode32 >> 22) & 0xf];
|
Cond = gCondition[(OpCode32 >> 22) & 0xf];
|
||||||
@@ -767,6 +765,7 @@ DisassembleThumbInstruction (
|
|||||||
// U == 0 means subtrack, U == 1 means add
|
// U == 0 means subtrack, U == 1 means add
|
||||||
Target = -Target;
|
Target = -Target;
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a", gReg[(OpCode32 >> 12) & 0xf], PcAlign4 (Pc) + Target);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -778,6 +777,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL #%d]", (OpCode32 >> 4) & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case LDM_REG_IMM12:
|
case LDM_REG_IMM12:
|
||||||
@@ -788,6 +788,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ", #0x%x]", OpCode32 & 0xfff);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case LDM_REG_IMM8:
|
case LDM_REG_IMM8:
|
||||||
@@ -805,6 +806,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd ? "" : "-", OpCode32 & 0xff);
|
AsciiSPrint (&Buf[Offset], Size - Offset, "], #%a0x%x", UAdd ? "" : "-", OpCode32 & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case LDRD_REG_IMM8_SIGNED:
|
case LDRD_REG_IMM8_SIGNED:
|
||||||
@@ -824,6 +826,7 @@ DisassembleThumbInstruction (
|
|||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd ? "" : "-", (OpCode32 & 0xff) << 2);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ", #%a0x%x", UAdd ? "" : "-", (OpCode32 & 0xff) << 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case LDRD_REG_IMM8:
|
case LDRD_REG_IMM8:
|
||||||
@@ -833,6 +836,7 @@ DisassembleThumbInstruction (
|
|||||||
// U == 0 means subtrack, U == 1 means add
|
// U == 0 means subtrack, U == 1 means add
|
||||||
Target = -Target;
|
Target = -Target;
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rt], gReg[Rt2], Pc + 4 + Target);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -863,6 +867,7 @@ DisassembleThumbInstruction (
|
|||||||
if ((OpCode32 & BIT20) == BIT20) {
|
if ((OpCode32 & BIT20) == BIT20) {
|
||||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||||
}
|
}
|
||||||
|
|
||||||
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
|
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #0x%x", gReg[Rd], gReg[Rn], Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #0x%x", gReg[Rd], gReg[Rn], Target);
|
||||||
return;
|
return;
|
||||||
@@ -872,6 +877,7 @@ DisassembleThumbInstruction (
|
|||||||
if ((OpCode32 & BIT20) == BIT20) {
|
if ((OpCode32 & BIT20) == BIT20) {
|
||||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||||
}
|
}
|
||||||
|
|
||||||
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
|
Target = (OpCode32 & 0xff) | ((OpCode32 >> 4) & 0x700) | ((OpCode & BIT26) == BIT26 ? BIT11 : 0);
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, #0x%x", gReg[Rd], Target);
|
||||||
return;
|
return;
|
||||||
@@ -888,11 +894,13 @@ DisassembleThumbInstruction (
|
|||||||
if ((OpCode32 & BIT20) == BIT20) {
|
if ((OpCode32 & BIT20) == BIT20) {
|
||||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||||
}
|
}
|
||||||
|
|
||||||
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
|
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
|
||||||
Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]);
|
Offset += AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, %a", gReg[Rd], gReg[Rn], gReg[Rm]);
|
||||||
if (Target != 0) {
|
if (Target != 0) {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case ADD_IMM5_2REG:
|
case ADD_IMM5_2REG:
|
||||||
@@ -903,12 +911,12 @@ DisassembleThumbInstruction (
|
|||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ", LSL %d", gShiftType[(OpCode >> 5) & 3], Target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
case ASR_IMM5:
|
case ASR_IMM5:
|
||||||
// ARS <Rd>, <Rm> #<const>} imm3:imm2
|
// ARS <Rd>, <Rm> #<const>} imm3:imm2
|
||||||
if ((OpCode32 & BIT20) == BIT20) {
|
if ((OpCode32 & BIT20) == BIT20) {
|
||||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||||
}
|
}
|
||||||
|
|
||||||
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
|
Target = ((OpCode32 >> 6) & 3) | ((OpCode32 >> 10) & 0x1c0);
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a #%d", gReg[Rd], gReg[Rm], Target);
|
||||||
return;
|
return;
|
||||||
@@ -918,6 +926,7 @@ DisassembleThumbInstruction (
|
|||||||
if ((OpCode32 & BIT20) == BIT20) {
|
if ((OpCode32 & BIT20) == BIT20) {
|
||||||
Buf[Offset - 3] = 'S'; // assume %-6a
|
Buf[Offset - 3] = 'S'; // assume %-6a
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a %a", gReg[Rd], gReg[Rn], gReg[Rm]);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -929,6 +938,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
Target = PcAlign4 (Pc) + Target;
|
Target = PcAlign4 (Pc) + Target;
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, 0x%08x", gReg[Rd], Target);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -950,6 +960,7 @@ DisassembleThumbInstruction (
|
|||||||
} else {
|
} else {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1);
|
AsciiSPrint (&Buf[Offset], Size - Offset, " %a, %a, #%d, #%d", gReg[Rd], gReg[Rn], LsBit, MsBit + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case CPD_THUMB2:
|
case CPD_THUMB2:
|
||||||
@@ -964,6 +975,7 @@ DisassembleThumbInstruction (
|
|||||||
if (Opc2 != 0) {
|
if (Opc2 != 0) {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case MRC_THUMB2:
|
case MRC_THUMB2:
|
||||||
@@ -977,6 +989,7 @@ DisassembleThumbInstruction (
|
|||||||
if (Opc2 != 0) {
|
if (Opc2 != 0) {
|
||||||
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
|
AsciiSPrint (&Buf[Offset], Size - Offset, ",#%d,", Opc2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case MRRC_THUMB2:
|
case MRRC_THUMB2:
|
||||||
@@ -1019,8 +1032,6 @@ DisassembleThumbInstruction (
|
|||||||
AsciiSPrint (Buf, Size, "0x%08x", OpCode32);
|
AsciiSPrint (Buf, Size, "0x%08x", OpCode32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DisassembleArmInstruction (
|
DisassembleArmInstruction (
|
||||||
IN UINT32 **OpCodePtr,
|
IN UINT32 **OpCodePtr,
|
||||||
@@ -1029,7 +1040,6 @@ DisassembleArmInstruction (
|
|||||||
IN BOOLEAN Extended
|
IN BOOLEAN Extended
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
Place a disassembly of **OpCodePtr into buffer, and update OpCodePtr to
|
||||||
point to next instruction.
|
point to next instruction.
|
||||||
@@ -1061,4 +1071,3 @@ DisassembleInstruction (
|
|||||||
DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);
|
DisassembleArmInstruction ((UINT32 **)OpCodePtr, Buf, Size, Extended);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -35,8 +35,7 @@ ArchVectorConfig (
|
|||||||
if (VectorBaseAddress == 0xFFFF0000) {
|
if (VectorBaseAddress == 0xFFFF0000) {
|
||||||
// set SCTLR.V to enable high vectors
|
// set SCTLR.V to enable high vectors
|
||||||
ArmSetHighVectors ();
|
ArmSetHighVectors ();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// Set SCTLR.V to 0 to enable VBAR to be used
|
// Set SCTLR.V to 0 to enable VBAR to be used
|
||||||
ArmSetLowVectors ();
|
ArmSetLowVectors ();
|
||||||
}
|
}
|
||||||
|
@@ -1,296 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Use ARMv6 instruction to operate on a single stack
|
|
||||||
//
|
|
||||||
// Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
|
|
||||||
// Copyright (c) 2014, ARM Limited. All rights reserved.<BR>
|
|
||||||
// Copyright (c) 2016 HP Development Company, L.P.<BR>
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
||||||
//
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#include <Library/PcdLib.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
This is the stack constructed by the exception handler (low address to high address)
|
|
||||||
# R0 - IFAR is EFI_SYSTEM_CONTEXT for ARM
|
|
||||||
Reg Offset
|
|
||||||
=== ======
|
|
||||||
R0 0x00 # stmfd SP!,{R0-R12}
|
|
||||||
R1 0x04
|
|
||||||
R2 0x08
|
|
||||||
R3 0x0c
|
|
||||||
R4 0x10
|
|
||||||
R5 0x14
|
|
||||||
R6 0x18
|
|
||||||
R7 0x1c
|
|
||||||
R8 0x20
|
|
||||||
R9 0x24
|
|
||||||
R10 0x28
|
|
||||||
R11 0x2c
|
|
||||||
R12 0x30
|
|
||||||
SP 0x34 # reserved via subtraction 0x20 (32) from SP
|
|
||||||
LR 0x38
|
|
||||||
PC 0x3c
|
|
||||||
CPSR 0x40
|
|
||||||
DFSR 0x44
|
|
||||||
DFAR 0x48
|
|
||||||
IFSR 0x4c
|
|
||||||
IFAR 0x50
|
|
||||||
|
|
||||||
LR 0x54 # SVC Link register (we need to restore it)
|
|
||||||
|
|
||||||
LR 0x58 # pushed by srsfd
|
|
||||||
CPSR 0x5c
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
EXPORT ExceptionHandlersStart
|
|
||||||
EXPORT ExceptionHandlersEnd
|
|
||||||
EXPORT CommonExceptionEntry
|
|
||||||
EXPORT AsmCommonExceptionEntry
|
|
||||||
IMPORT CommonCExceptionHandler
|
|
||||||
|
|
||||||
PRESERVE8
|
|
||||||
AREA DxeExceptionHandlers, CODE, READONLY, CODEALIGN, ALIGN=5
|
|
||||||
|
|
||||||
//
|
|
||||||
// This code gets copied to the ARM vector table
|
|
||||||
// ExceptionHandlersStart - ExceptionHandlersEnd gets copied
|
|
||||||
//
|
|
||||||
ExceptionHandlersStart
|
|
||||||
|
|
||||||
Reset
|
|
||||||
b ResetEntry
|
|
||||||
|
|
||||||
UndefinedInstruction
|
|
||||||
b UndefinedInstructionEntry
|
|
||||||
|
|
||||||
SoftwareInterrupt
|
|
||||||
b SoftwareInterruptEntry
|
|
||||||
|
|
||||||
PrefetchAbort
|
|
||||||
b PrefetchAbortEntry
|
|
||||||
|
|
||||||
DataAbort
|
|
||||||
b DataAbortEntry
|
|
||||||
|
|
||||||
ReservedException
|
|
||||||
b ReservedExceptionEntry
|
|
||||||
|
|
||||||
Irq
|
|
||||||
b IrqEntry
|
|
||||||
|
|
||||||
Fiq
|
|
||||||
b FiqEntry
|
|
||||||
|
|
||||||
ResetEntry
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
; We are already in SVC mode
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#0 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
UndefinedInstructionEntry
|
|
||||||
sub LR, LR, #4 ; Only -2 for Thumb, adjust in CommonExceptionEntry
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
cps #0x13 ; Switch to SVC for common stack
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#1 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry;
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
SoftwareInterruptEntry
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
; We are already in SVC mode
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#2 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
PrefetchAbortEntry
|
|
||||||
sub LR,LR,#4
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
cps #0x13 ; Switch to SVC for common stack
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#3 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
DataAbortEntry
|
|
||||||
sub LR,LR,#8
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
cps #0x13 ; Switch to SVC for common stack
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#4 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
ReservedExceptionEntry
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
cps #0x13 ; Switch to SVC for common stack
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#5 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
IrqEntry
|
|
||||||
sub LR,LR,#4
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
cps #0x13 ; Switch to SVC for common stack
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
|
|
||||||
mov R0,#6 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
FiqEntry
|
|
||||||
sub LR,LR,#4
|
|
||||||
srsfd #0x13! ; Store return state on SVC stack
|
|
||||||
cps #0x13 ; Switch to SVC for common stack
|
|
||||||
stmfd SP!,{LR} ; Store the link register for the current mode
|
|
||||||
sub SP,SP,#0x20 ; Save space for SP, LR, PC, IFAR - CPSR
|
|
||||||
stmfd SP!,{R0-R12} ; Store the register state
|
|
||||||
; Since we have already switch to SVC R8_fiq - R12_fiq
|
|
||||||
; never get used or saved
|
|
||||||
mov R0,#7 ; ExceptionType
|
|
||||||
ldr R1,CommonExceptionEntry
|
|
||||||
bx R1
|
|
||||||
|
|
||||||
//
|
|
||||||
// This gets patched by the C code that patches in the vector table
|
|
||||||
//
|
|
||||||
CommonExceptionEntry
|
|
||||||
dcd AsmCommonExceptionEntry
|
|
||||||
|
|
||||||
ExceptionHandlersEnd
|
|
||||||
|
|
||||||
//
|
|
||||||
// This code runs from CpuDxe driver loaded address. It is patched into
|
|
||||||
// CommonExceptionEntry.
|
|
||||||
//
|
|
||||||
AsmCommonExceptionEntry
|
|
||||||
mrc p15, 0, R1, c6, c0, 2 ; Read IFAR
|
|
||||||
str R1, [SP, #0x50] ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFAR
|
|
||||||
|
|
||||||
mrc p15, 0, R1, c5, c0, 1 ; Read IFSR
|
|
||||||
str R1, [SP, #0x4c] ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFSR
|
|
||||||
|
|
||||||
mrc p15, 0, R1, c6, c0, 0 ; Read DFAR
|
|
||||||
str R1, [SP, #0x48] ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFAR
|
|
||||||
|
|
||||||
mrc p15, 0, R1, c5, c0, 0 ; Read DFSR
|
|
||||||
str R1, [SP, #0x44] ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFSR
|
|
||||||
|
|
||||||
ldr R1, [SP, #0x5c] ; srsfd saved pre-exception CPSR on the stack
|
|
||||||
str R1, [SP, #0x40] ; Store it in EFI_SYSTEM_CONTEXT_ARM.CPSR
|
|
||||||
|
|
||||||
add R2, SP, #0x38 ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
|
|
||||||
and R3, R1, #0x1f ; Check CPSR to see if User or System Mode
|
|
||||||
cmp R3, #0x1f ; if ((CPSR == 0x10) || (CPSR == 0x1f))
|
|
||||||
cmpne R3, #0x10 ;
|
|
||||||
stmeqed R2, {lr}^ ; save unbanked lr
|
|
||||||
; else
|
|
||||||
stmneed R2, {lr} ; save SVC lr
|
|
||||||
|
|
||||||
|
|
||||||
ldr R5, [SP, #0x58] ; PC is the LR pushed by srsfd
|
|
||||||
; Check to see if we have to adjust for Thumb entry
|
|
||||||
sub r4, r0, #1 ; if (ExceptionType == 1 || ExceptionType == 2)) {
|
|
||||||
cmp r4, #1 ; // UND & SVC have different LR adjust for Thumb
|
|
||||||
bhi NoAdjustNeeded
|
|
||||||
|
|
||||||
tst r1, #0x20 ; if ((CPSR & T)) == T) { // Thumb Mode on entry
|
|
||||||
addne R5, R5, #2 ; PC += 2;
|
|
||||||
strne R5,[SP,#0x58] ; Update LR value pushed by srsfd
|
|
||||||
|
|
||||||
NoAdjustNeeded
|
|
||||||
|
|
||||||
str R5, [SP, #0x3c] ; Store it in EFI_SYSTEM_CONTEXT_ARM.PC
|
|
||||||
|
|
||||||
add R1, SP, #0x60 ; We pushed 0x60 bytes on the stack
|
|
||||||
str R1, [SP, #0x34] ; Store it in EFI_SYSTEM_CONTEXT_ARM.SP
|
|
||||||
|
|
||||||
; R0 is ExceptionType
|
|
||||||
mov R1,SP ; R1 is SystemContext
|
|
||||||
|
|
||||||
#if (FixedPcdGet32(PcdVFPEnabled))
|
|
||||||
vpush {d0-d15} ; save vstm registers in case they are used in optimizations
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mov R4, SP ; Save current SP
|
|
||||||
tst R4, #4
|
|
||||||
subne SP, SP, #4 ; Adjust SP if not 8-byte aligned
|
|
||||||
|
|
||||||
/*
|
|
||||||
VOID
|
|
||||||
EFIAPI
|
|
||||||
CommonCExceptionHandler (
|
|
||||||
IN EFI_EXCEPTION_TYPE ExceptionType, R0
|
|
||||||
IN OUT EFI_SYSTEM_CONTEXT SystemContext R1
|
|
||||||
)
|
|
||||||
|
|
||||||
*/
|
|
||||||
blx CommonCExceptionHandler ; Call exception handler
|
|
||||||
|
|
||||||
mov SP, R4 ; Restore SP
|
|
||||||
|
|
||||||
#if (FixedPcdGet32(PcdVFPEnabled))
|
|
||||||
vpop {d0-d15}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ldr R1, [SP, #0x4c] ; Restore EFI_SYSTEM_CONTEXT_ARM.IFSR
|
|
||||||
mcr p15, 0, R1, c5, c0, 1 ; Write IFSR
|
|
||||||
|
|
||||||
ldr R1, [SP, #0x44] ; Restore EFI_SYSTEM_CONTEXT_ARM.DFSR
|
|
||||||
mcr p15, 0, R1, c5, c0, 0 ; Write DFSR
|
|
||||||
|
|
||||||
ldr R1,[SP,#0x3c] ; EFI_SYSTEM_CONTEXT_ARM.PC
|
|
||||||
str R1,[SP,#0x58] ; Store it back to srsfd stack slot so it can be restored
|
|
||||||
|
|
||||||
ldr R1,[SP,#0x40] ; EFI_SYSTEM_CONTEXT_ARM.CPSR
|
|
||||||
str R1,[SP,#0x5c] ; Store it back to srsfd stack slot so it can be restored
|
|
||||||
|
|
||||||
add R3, SP, #0x54 ; Make R3 point to SVC LR saved on entry
|
|
||||||
add R2, SP, #0x38 ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
|
|
||||||
and R1, R1, #0x1f ; Check to see if User or System Mode
|
|
||||||
cmp R1, #0x1f ; if ((CPSR == 0x10) || (CPSR == 0x1f))
|
|
||||||
cmpne R1, #0x10 ;
|
|
||||||
ldmeqed R2, {lr}^ ; restore unbanked lr
|
|
||||||
; else
|
|
||||||
ldmneed R3, {lr} ; restore SVC lr, via ldmfd SP!, {LR}
|
|
||||||
|
|
||||||
ldmfd SP!,{R0-R12} ; Restore general purpose registers
|
|
||||||
; Exception handler can not change SP
|
|
||||||
|
|
||||||
add SP,SP,#0x20 ; Clear out the remaining stack space
|
|
||||||
ldmfd SP!,{LR} ; restore the link register for this context
|
|
||||||
rfefd SP! ; return from exception via srsfd stack slot
|
|
||||||
|
|
||||||
END
|
|
||||||
|
|
||||||
|
|
@@ -4,6 +4,7 @@
|
|||||||
* Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
* Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||||
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>
|
||||||
* Copyright (c) 2016 HP Development Company, L.P.
|
* Copyright (c) 2016 HP Development Company, L.P.
|
||||||
|
* Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
* SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
*
|
*
|
||||||
@@ -43,7 +44,8 @@ ExceptionHandlersEnd(
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
RETURN_STATUS ArchVectorConfig(
|
RETURN_STATUS
|
||||||
|
ArchVectorConfig (
|
||||||
IN UINTN VectorBaseAddress
|
IN UINTN VectorBaseAddress
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -66,7 +68,6 @@ STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;
|
|||||||
STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;
|
STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes all CPU exceptions entries and provides the default exception handlers.
|
Initializes all CPU exceptions entries and provides the default exception handlers.
|
||||||
|
|
||||||
@@ -96,12 +97,10 @@ InitializeCpuExceptionHandlers(
|
|||||||
|
|
||||||
// if we are requested to copy exception handlers to another location
|
// if we are requested to copy exception handlers to another location
|
||||||
if (gArmRelocateVectorTable) {
|
if (gArmRelocateVectorTable) {
|
||||||
|
|
||||||
VectorBase = PcdGet64 (PcdCpuVectorBaseAddress);
|
VectorBase = PcdGet64 (PcdCpuVectorBaseAddress);
|
||||||
Status = CopyExceptionHandlers (VectorBase);
|
Status = CopyExceptionHandlers (VectorBase);
|
||||||
|
} else {
|
||||||
}
|
// use VBAR to point to where our exception handlers are
|
||||||
else { // use VBAR to point to where our exception handlers are
|
|
||||||
|
|
||||||
// The vector table must be aligned for the architecture. If this
|
// The vector table must be aligned for the architecture. If this
|
||||||
// assertion fails ensure the appropriate FFS alignment is in effect,
|
// assertion fails ensure the appropriate FFS alignment is in effect,
|
||||||
@@ -180,12 +179,11 @@ CopyExceptionHandlers(
|
|||||||
//
|
//
|
||||||
for (Index = 0; Index <= gMaxExceptionNumber; Index++) {
|
for (Index = 0; Index <= gMaxExceptionNumber; Index++) {
|
||||||
if (!FeaturePcdGet (PcdDebuggerExceptionSupport) ||
|
if (!FeaturePcdGet (PcdDebuggerExceptionSupport) ||
|
||||||
(gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue)) {
|
(gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue))
|
||||||
|
{
|
||||||
Status = RegisterExceptionHandler (Index, NULL);
|
Status = RegisterExceptionHandler (Index, NULL);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// If the debugger has already hooked put its vector back
|
// If the debugger has already hooked put its vector back
|
||||||
VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];
|
VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];
|
||||||
}
|
}
|
||||||
@@ -197,33 +195,6 @@ CopyExceptionHandlers(
|
|||||||
return RETURN_SUCCESS;
|
return RETURN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
|
|
||||||
|
|
||||||
Caller should try to get an array of interrupt and/or exception vectors that are in use and need to
|
|
||||||
persist by EFI_VECTOR_HANDOFF_INFO defined in PI 1.3 specification.
|
|
||||||
If caller cannot get reserved vector list or it does not exists, set VectorInfo to NULL.
|
|
||||||
If VectorInfo is not NULL, the exception vectors will be initialized per vector attribute accordingly.
|
|
||||||
|
|
||||||
@param[in] VectorInfo Pointer to reserved vector list.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS All CPU interrupt/exception entries have been successfully initialized
|
|
||||||
with default interrupt/exception handlers.
|
|
||||||
@retval EFI_INVALID_PARAMETER VectorInfo includes the invalid content if VectorInfo is not NULL.
|
|
||||||
@retval EFI_UNSUPPORTED This function is not supported.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
InitializeCpuInterruptHandlers(
|
|
||||||
IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// not needed, this is what the CPU driver is for
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Registers a function to be called from the processor exception handler. (On ARM/AArch64 this only
|
Registers a function to be called from the processor exception handler. (On ARM/AArch64 this only
|
||||||
provides exception handlers, not interrupt handling which is provided through the Hardware Interrupt
|
provides exception handlers, not interrupt handling which is provided through the Hardware Interrupt
|
||||||
@@ -233,8 +204,8 @@ This function registers and enables the handler specified by ExceptionHandler fo
|
|||||||
interrupt or exception type specified by ExceptionType. If ExceptionHandler is NULL, then the
|
interrupt or exception type specified by ExceptionType. If ExceptionHandler is NULL, then the
|
||||||
handler for the processor interrupt or exception type specified by ExceptionType is uninstalled.
|
handler for the processor interrupt or exception type specified by ExceptionType is uninstalled.
|
||||||
The installed handler is called once for each processor interrupt or exception.
|
The installed handler is called once for each processor interrupt or exception.
|
||||||
NOTE: This function should be invoked after InitializeCpuExceptionHandlers() or
|
NOTE: This function should be invoked after InitializeCpuExceptionHandlers() is invoked,
|
||||||
InitializeCpuInterruptHandlers() invoked, otherwise EFI_UNSUPPORTED returned.
|
otherwise EFI_UNSUPPORTED returned.
|
||||||
|
|
||||||
@param[in] ExceptionType Defines which interrupt or exception to hook.
|
@param[in] ExceptionType Defines which interrupt or exception to hook.
|
||||||
@param[in] ExceptionHandler A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called
|
@param[in] ExceptionHandler A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called
|
||||||
@@ -307,9 +278,8 @@ CommonCExceptionHandler(
|
|||||||
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
|
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType));
|
||||||
DEBUG((EFI_D_ERROR, "Unknown exception type %d\n", ExceptionType));
|
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,34 +287,25 @@ CommonCExceptionHandler(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes all CPU exceptions entries with optional extra initializations.
|
Setup separate stacks for certain exception handlers.
|
||||||
|
If the input Buffer and BufferSize are both NULL, use global variable if possible.
|
||||||
|
|
||||||
By default, this method should include all functionalities implemented by
|
@param[in] Buffer Point to buffer used to separate exception stack.
|
||||||
InitializeCpuExceptionHandlers(), plus extra initialization works, if any.
|
@param[in, out] BufferSize On input, it indicates the byte size of Buffer.
|
||||||
This could be done by calling InitializeCpuExceptionHandlers() directly
|
If the size is not enough, the return status will
|
||||||
in this method besides the extra works.
|
be EFI_BUFFER_TOO_SMALL, and output BufferSize
|
||||||
|
will be the size it needs.
|
||||||
InitData is optional and its use and content are processor arch dependent.
|
|
||||||
The typical usage of it is to convey resources which have to be reserved
|
|
||||||
elsewhere and are necessary for the extra initializations of exception.
|
|
||||||
|
|
||||||
@param[in] VectorInfo Pointer to reserved vector list.
|
|
||||||
@param[in] InitData Pointer to data optional for extra initializations
|
|
||||||
of exception.
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The exceptions have been successfully
|
|
||||||
initialized.
|
|
||||||
@retval EFI_INVALID_PARAMETER VectorInfo or InitData contains invalid
|
|
||||||
content.
|
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The stacks are assigned successfully.
|
||||||
|
@retval EFI_UNSUPPORTED This function is not supported.
|
||||||
|
@retval EFI_BUFFER_TOO_SMALL This BufferSize is too small.
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeCpuExceptionHandlersEx (
|
InitializeSeparateExceptionStacks (
|
||||||
IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL,
|
IN VOID *Buffer,
|
||||||
IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL
|
IN OUT UINTN *BufferSize
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return InitializeCpuExceptionHandlers (VectorInfo);
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,7 +33,6 @@
|
|||||||
|
|
||||||
[Sources.Arm]
|
[Sources.Arm]
|
||||||
Arm/ArmException.c
|
Arm/ArmException.c
|
||||||
Arm/ExceptionSupport.asm | RVCT
|
|
||||||
Arm/ExceptionSupport.S | GCC
|
Arm/ExceptionSupport.S | GCC
|
||||||
|
|
||||||
[Sources.AARCH64]
|
[Sources.AARCH64]
|
||||||
|
@@ -28,7 +28,6 @@
|
|||||||
|
|
||||||
[Sources.Arm]
|
[Sources.Arm]
|
||||||
Arm/ArmException.c
|
Arm/ArmException.c
|
||||||
Arm/ExceptionSupport.asm | RVCT
|
|
||||||
Arm/ExceptionSupport.S | GCC
|
Arm/ExceptionSupport.S | GCC
|
||||||
|
|
||||||
[Sources.AARCH64]
|
[Sources.AARCH64]
|
||||||
|
@@ -71,7 +71,6 @@ ArmGenericTimerGetTimerVal (
|
|||||||
return ArmReadCntpTval ();
|
return ArmReadCntpTval ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArmGenericTimerSetTimerVal (
|
ArmGenericTimerSetTimerVal (
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user