Compare commits
	
		
			537 Commits
		
	
	
		
			bonw14-dis
			...
			edk2-stabl
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					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 | 
@@ -17,7 +17,7 @@ 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:
 | 
				
			||||||
@@ -48,6 +48,9 @@ jobs:
 | 
				
			|||||||
      TARGET_SECURITY:
 | 
					      TARGET_SECURITY:
 | 
				
			||||||
        Build.Pkgs: 'SecurityPkg'
 | 
					        Build.Pkgs: 'SecurityPkg'
 | 
				
			||||||
        Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
 | 
					        Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
 | 
				
			||||||
 | 
					      TARGET_UEFIPAYLOAD:
 | 
				
			||||||
 | 
					        Build.Pkgs: 'UefiPayloadPkg'
 | 
				
			||||||
 | 
					        Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
 | 
				
			||||||
      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.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,7 +67,8 @@ class Settings(CiBuildSettingsManager, UpdateSettingsManager, SetupSettingsManag
 | 
				
			|||||||
                "CryptoPkg",
 | 
					                "CryptoPkg",
 | 
				
			||||||
                "UnitTestFrameworkPkg",
 | 
					                "UnitTestFrameworkPkg",
 | 
				
			||||||
                "OvmfPkg",
 | 
					                "OvmfPkg",
 | 
				
			||||||
                "RedfishPkg"
 | 
					                "RedfishPkg",
 | 
				
			||||||
 | 
					                "UefiPayloadPkg"
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def GetArchitecturesSupported(self):
 | 
					    def GetArchitecturesSupported(self):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
        if self.ECC_PASS:
 | 
					            # Copy package being scanned to temp_path
 | 
				
			||||||
            tc.SetSuccess()
 | 
					            shutil.copytree (
 | 
				
			||||||
            self.RemoveFile(ecc_log)
 | 
					              os.path.join(workspace_path, packagename),
 | 
				
			||||||
            return 0
 | 
					              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:
 | 
				
			||||||
 | 
					                # Delete temp directory
 | 
				
			||||||
 | 
					                if os.path.exists(temp_path):
 | 
				
			||||||
 | 
					                    shutil.rmtree(temp_path)
 | 
				
			||||||
 | 
					                tc.SetSuccess()
 | 
				
			||||||
 | 
					                return 0
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                with open(ecc_log, encoding='utf8') as output:
 | 
				
			||||||
 | 
					                    ecc_output = output.readlines()
 | 
				
			||||||
 | 
					                    for line in ecc_output:
 | 
				
			||||||
 | 
					                        logging.error(line.strip())
 | 
				
			||||||
 | 
					                # Delete temp directory
 | 
				
			||||||
 | 
					                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:
 | 
					        else:
 | 
				
			||||||
            with open(ecc_log, encoding='utf8') as output:
 | 
					            # If EccCheck fails for any other exception type, raise the exception
 | 
				
			||||||
                ecc_output = output.readlines()
 | 
					            # Delete temp directory
 | 
				
			||||||
                for line in ecc_output:
 | 
					            if os.path.exists(temp_path):
 | 
				
			||||||
                    logging.error(line.strip())
 | 
					                shutil.rmtree(temp_path)
 | 
				
			||||||
            self.RemoveFile(ecc_log)
 | 
					            tc.SetFailed("EccCheck exception for {0}".format(packagename), "CHECK FAILED")
 | 
				
			||||||
            tc.SetFailed("EccCheck failed for {0}".format(packagename), "Ecc detected issues")
 | 
					            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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										120
									
								
								.pytool/Plugin/UncrustifyCheck/Readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								.pytool/Plugin/UncrustifyCheck/Readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,120 @@
 | 
				
			|||||||
 | 
					# 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.
 | 
				
			||||||
 | 
					      "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.
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `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 `False`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
							
								
								
									
										618
									
								
								.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										618
									
								
								.pytool/Plugin/UncrustifyCheck/UncrustifyCheck.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,618 @@
 | 
				
			|||||||
 | 
					# @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.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_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
 | 
				
			||||||
 | 
					        return outstream_buffer.getvalue().strip().splitlines()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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.GetAbsolutePathOnThisSytemFromEdk2RelativePath(
 | 
				
			||||||
 | 
					            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)])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        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 = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if "AuditOnly" in self._package_config and self._package_config["AuditOnly"]:
 | 
				
			||||||
 | 
					            self._audit_only_mode = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if "OutputFileDiffs" in self._package_config and self._package_config["OutputFileDiffs"]:
 | 
				
			||||||
 | 
					            self._output_file_diffs = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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:
 | 
				
			||||||
 | 
					            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"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -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"
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@
 | 
				
			|||||||
#
 | 
					#
 | 
				
			||||||
# 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 - 2021, 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
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -337,9 +338,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 +357,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 +370,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
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
@@ -150,6 +151,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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,21 +12,23 @@
 | 
				
			|||||||
#include <Library/UefiBootServicesTableLib.h>
 | 
					#include <Library/UefiBootServicesTableLib.h>
 | 
				
			||||||
#include <Protocol/Cpu.h>
 | 
					#include <Protocol/Cpu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC EFI_CPU_ARCH_PROTOCOL      *mCpu;
 | 
					STATIC EFI_CPU_ARCH_PROTOCOL  *mCpu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCrashDumpDxeInitialize (
 | 
					ArmCrashDumpDxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS      Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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 (
 | 
				
			||||||
                                         EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
 | 
					                 mCpu,
 | 
				
			||||||
                                         &DefaultExceptionHandler);
 | 
					                 EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS,
 | 
				
			||||||
 | 
					                 &DefaultExceptionHandler
 | 
				
			||||||
 | 
					                 );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,8 +11,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
IrqInterruptHandler (
 | 
					IrqInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE           InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE  InterruptType,
 | 
				
			||||||
  IN EFI_SYSTEM_CONTEXT           SystemContext
 | 
					  IN EFI_SYSTEM_CONTEXT  SystemContext
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -26,14 +26,13 @@ ExitBootServicesEvent (
 | 
				
			|||||||
EFI_HANDLE  gHardwareInterruptHandle = NULL;
 | 
					EFI_HANDLE  gHardwareInterruptHandle = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Notifications
 | 
					// Notifications
 | 
				
			||||||
EFI_EVENT EfiExitBootServicesEvent      = (EFI_EVENT)NULL;
 | 
					EFI_EVENT  EfiExitBootServicesEvent = (EFI_EVENT)NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Maximum Number of Interrupts
 | 
					// Maximum Number of Interrupts
 | 
				
			||||||
UINTN mGicNumInterrupts                 = 0;
 | 
					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.
 | 
				
			||||||
@@ -47,21 +46,21 @@ HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers = NULL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GicGetDistributorIcfgBaseAndBit (
 | 
					GicGetDistributorIcfgBaseAndBit (
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE             Source,
 | 
					  IN HARDWARE_INTERRUPT_SOURCE  Source,
 | 
				
			||||||
  OUT UINTN                               *RegAddress,
 | 
					  OUT UINTN                     *RegAddress,
 | 
				
			||||||
  OUT UINTN                               *Config1Bit
 | 
					  OUT UINTN                     *Config1Bit
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN                  RegIndex;
 | 
					  UINTN  RegIndex;
 | 
				
			||||||
  UINTN                  Field;
 | 
					  UINTN  Field;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(Source < mGicNumInterrupts);
 | 
					    ASSERT (Source < mGicNumInterrupts);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  RegIndex = Source / ARM_GIC_ICDICFR_F_STRIDE;  // NOTE: truncation is significant
 | 
					  RegIndex    = Source / ARM_GIC_ICDICFR_F_STRIDE; // NOTE: truncation is significant
 | 
				
			||||||
  Field = Source % ARM_GIC_ICDICFR_F_STRIDE;
 | 
					  Field       = Source % ARM_GIC_ICDICFR_F_STRIDE;
 | 
				
			||||||
  *RegAddress = PcdGet64 (PcdGicDistributorBase)
 | 
					  *RegAddress = PcdGet64 (PcdGicDistributorBase)
 | 
				
			||||||
                + ARM_GIC_ICDICFR
 | 
					                + ARM_GIC_ICDICFR
 | 
				
			||||||
                + (ARM_GIC_ICDICFR_BYTES * RegIndex);
 | 
					                + (ARM_GIC_ICDICFR_BYTES * RegIndex);
 | 
				
			||||||
@@ -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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -87,13 +84,13 @@ GicGetDistributorIcfgBaseAndBit (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
RegisterInterruptSource (
 | 
					RegisterInterruptSource (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source,
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_HANDLER         Handler
 | 
					  IN HARDWARE_INTERRUPT_HANDLER       Handler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -108,25 +105,25 @@ RegisterInterruptSource (
 | 
				
			|||||||
  gRegisteredInterruptHandlers[Source] = Handler;
 | 
					  gRegisteredInterruptHandlers[Source] = Handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If the interrupt handler is unregistered then disable the interrupt
 | 
					  // If the interrupt handler is unregistered then disable the interrupt
 | 
				
			||||||
  if (NULL == Handler){
 | 
					  if (NULL == Handler) {
 | 
				
			||||||
    return This->DisableInterruptSource (This, Source);
 | 
					    return This->DisableInterruptSource (This, Source);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    return This->EnableInterruptSource (This, Source);
 | 
					    return This->EnableInterruptSource (This, Source);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC VOID *mCpuArchProtocolNotifyEventRegistration;
 | 
					STATIC VOID  *mCpuArchProtocolNotifyEventRegistration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuArchEventProtocolNotify (
 | 
					CpuArchEventProtocolNotify (
 | 
				
			||||||
  IN  EFI_EVENT       Event,
 | 
					  IN  EFI_EVENT  Event,
 | 
				
			||||||
  IN  VOID            *Context
 | 
					  IN  VOID       *Context
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_CPU_ARCH_PROTOCOL   *Cpu;
 | 
					  EFI_CPU_ARCH_PROTOCOL  *Cpu;
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS             Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get the CPU protocol that this driver requires.
 | 
					  // Get the CPU protocol that this driver requires.
 | 
				
			||||||
  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
 | 
					  Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
 | 
				
			||||||
@@ -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);
 | 
				
			||||||
@@ -157,13 +165,13 @@ EFI_STATUS
 | 
				
			|||||||
InstallAndRegisterInterruptService (
 | 
					InstallAndRegisterInterruptService (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL   *InterruptProtocol,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL   *InterruptProtocol,
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT2_PROTOCOL  *Interrupt2Protocol,
 | 
					  IN EFI_HARDWARE_INTERRUPT2_PROTOCOL  *Interrupt2Protocol,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER          InterruptHandler,
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER         InterruptHandler,
 | 
				
			||||||
  IN EFI_EVENT_NOTIFY                   ExitBootServicesEvent
 | 
					  IN EFI_EVENT_NOTIFY                  ExitBootServicesEvent
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS               Status;
 | 
					  EFI_STATUS   Status;
 | 
				
			||||||
  CONST UINTN              RihArraySize =
 | 
					  CONST UINTN  RihArraySize =
 | 
				
			||||||
    (sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
 | 
					    (sizeof (HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Initialize the array for the Interrupt Handlers
 | 
					  // Initialize the array for the Interrupt Handlers
 | 
				
			||||||
  gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize);
 | 
					  gRegisteredInterruptHandlers = AllocateZeroPool (RihArraySize);
 | 
				
			||||||
@@ -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 (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,12 +32,12 @@ Abstract:
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
InterruptDxeInitialize (
 | 
					InterruptDxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS            Status;
 | 
					  EFI_STATUS             Status;
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,7 +21,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			|||||||
#include <Protocol/HardwareInterrupt.h>
 | 
					#include <Protocol/HardwareInterrupt.h>
 | 
				
			||||||
#include <Protocol/HardwareInterrupt2.h>
 | 
					#include <Protocol/HardwareInterrupt2.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern UINTN                        mGicNumInterrupts;
 | 
					extern UINTN                       mGicNumInterrupts;
 | 
				
			||||||
extern HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers;
 | 
					extern HARDWARE_INTERRUPT_HANDLER  *gRegisteredInterruptHandlers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Common API
 | 
					// Common API
 | 
				
			||||||
@@ -29,33 +29,32 @@ EFI_STATUS
 | 
				
			|||||||
InstallAndRegisterInterruptService (
 | 
					InstallAndRegisterInterruptService (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL   *InterruptProtocol,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL   *InterruptProtocol,
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT2_PROTOCOL  *Interrupt2Protocol,
 | 
					  IN EFI_HARDWARE_INTERRUPT2_PROTOCOL  *Interrupt2Protocol,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER          InterruptHandler,
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER         InterruptHandler,
 | 
				
			||||||
  IN EFI_EVENT_NOTIFY                   ExitBootServicesEvent
 | 
					  IN EFI_EVENT_NOTIFY                  ExitBootServicesEvent
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
RegisterInterruptSource (
 | 
					RegisterInterruptSource (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source,
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_HANDLER         Handler
 | 
					  IN HARDWARE_INTERRUPT_HANDLER       Handler
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GicV2 API
 | 
					// GicV2 API
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GicV2DxeInitialize (
 | 
					GicV2DxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GicV3 API
 | 
					// GicV3 API
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GicV3DxeInitialize (
 | 
					GicV3DxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Shared code
 | 
					// Shared code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -71,9 +70,9 @@ GicV3DxeInitialize (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GicGetDistributorIcfgBaseAndBit (
 | 
					GicGetDistributorIcfgBaseAndBit (
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE             Source,
 | 
					  IN HARDWARE_INTERRUPT_SOURCE  Source,
 | 
				
			||||||
  OUT UINTN                               *RegAddress,
 | 
					  OUT UINTN                     *RegAddress,
 | 
				
			||||||
  OUT UINTN                               *Config1Bit
 | 
					  OUT UINTN                     *Config1Bit
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_GIC_DXE_H_
 | 
					#endif // ARM_GIC_DXE_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,13 +24,13 @@
 | 
				
			|||||||
                                           + ARM_GICR_SGI_VLPI_FRAME_SIZE     \
 | 
					                                           + ARM_GICR_SGI_VLPI_FRAME_SIZE     \
 | 
				
			||||||
                                           + ARM_GICR_SGI_RESERVED_FRAME_SIZE)
 | 
					                                           + ARM_GICR_SGI_RESERVED_FRAME_SIZE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ISENABLER_ADDRESS(base,offset) ((base) + \
 | 
					#define ISENABLER_ADDRESS(base, offset)  ((base) +\
 | 
				
			||||||
          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + 4 * (offset))
 | 
					          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + 4 * (offset))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ICENABLER_ADDRESS(base,offset) ((base) + \
 | 
					#define ICENABLER_ADDRESS(base, offset)  ((base) +\
 | 
				
			||||||
          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + 4 * (offset))
 | 
					          ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ICENABLER + 4 * (offset))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IPRIORITY_ADDRESS(base,offset) ((base) + \
 | 
					#define IPRIORITY_ADDRESS(base, offset)  ((base) +\
 | 
				
			||||||
          ARM_GICR_CTLR_FRAME_SIZE + ARM_GIC_ICDIPR + 4 * (offset))
 | 
					          ARM_GICR_CTLR_FRAME_SIZE + ARM_GIC_ICDIPR + 4 * (offset))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -57,15 +57,15 @@ SourceIsSpi (
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
GicGetCpuRedistributorBase (
 | 
					GicGetCpuRedistributorBase (
 | 
				
			||||||
  IN UINTN                 GicRedistributorBase,
 | 
					  IN UINTN                  GicRedistributorBase,
 | 
				
			||||||
  IN ARM_GIC_ARCH_REVISION Revision
 | 
					  IN ARM_GIC_ARCH_REVISION  Revision
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN MpId;
 | 
					  UINTN   MpId;
 | 
				
			||||||
  UINTN CpuAffinity;
 | 
					  UINTN   CpuAffinity;
 | 
				
			||||||
  UINTN Affinity;
 | 
					  UINTN   Affinity;
 | 
				
			||||||
  UINTN GicCpuRedistributorBase;
 | 
					  UINTN   GicCpuRedistributorBase;
 | 
				
			||||||
  UINT64 TypeRegister;
 | 
					  UINT64  TypeRegister;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MpId = ArmReadMpidr ();
 | 
					  MpId = ArmReadMpidr ();
 | 
				
			||||||
  // Define CPU affinity as:
 | 
					  // Define CPU affinity as:
 | 
				
			||||||
@@ -83,7 +83,7 @@ GicGetCpuRedistributorBase (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  do {
 | 
					  do {
 | 
				
			||||||
    TypeRegister = MmioRead64 (GicCpuRedistributorBase + ARM_GICR_TYPER);
 | 
					    TypeRegister = MmioRead64 (GicCpuRedistributorBase + ARM_GICR_TYPER);
 | 
				
			||||||
    Affinity = ARM_GICR_TYPER_GET_AFFINITY (TypeRegister);
 | 
					    Affinity     = ARM_GICR_TYPER_GET_AFFINITY (TypeRegister);
 | 
				
			||||||
    if (Affinity == CpuAffinity) {
 | 
					    if (Affinity == CpuAffinity) {
 | 
				
			||||||
      return GicCpuRedistributorBase;
 | 
					      return GicCpuRedistributorBase;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -107,7 +107,7 @@ GicGetCpuRedistributorBase (
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicGetInterfaceIdentification (
 | 
					ArmGicGetInterfaceIdentification (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Read the GIC Identification Register
 | 
					  // Read the GIC Identification Register
 | 
				
			||||||
@@ -117,10 +117,10 @@ ArmGicGetInterfaceIdentification (
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicGetMaxNumInterrupts (
 | 
					ArmGicGetMaxNumInterrupts (
 | 
				
			||||||
  IN  INTN          GicDistributorBase
 | 
					  IN  INTN  GicDistributorBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN ItLines;
 | 
					  UINTN  ItLines;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ItLines = MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F;
 | 
					  ItLines = MmioRead32 (GicDistributorBase + ARM_GIC_ICDICTR) & 0x1F;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -133,10 +133,10 @@ ArmGicGetMaxNumInterrupts (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSendSgiTo (
 | 
					ArmGicSendSgiTo (
 | 
				
			||||||
  IN  INTN          GicDistributorBase,
 | 
					  IN  INTN  GicDistributorBase,
 | 
				
			||||||
  IN  INTN          TargetListFilter,
 | 
					  IN  INTN  TargetListFilter,
 | 
				
			||||||
  IN  INTN          CPUTargetList,
 | 
					  IN  INTN  CPUTargetList,
 | 
				
			||||||
  IN  INTN          SgiId
 | 
					  IN  INTN  SgiId
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  MmioWrite32 (
 | 
					  MmioWrite32 (
 | 
				
			||||||
@@ -162,12 +162,12 @@ ArmGicSendSgiTo (
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicAcknowledgeInterrupt (
 | 
					ArmGicAcknowledgeInterrupt (
 | 
				
			||||||
  IN  UINTN          GicInterruptInterfaceBase,
 | 
					  IN  UINTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  OUT UINTN          *InterruptId
 | 
					  OUT UINTN  *InterruptId
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN Value;
 | 
					  UINTN                  Value;
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
					  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
				
			||||||
@@ -193,11 +193,11 @@ ArmGicAcknowledgeInterrupt (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEndOfInterrupt (
 | 
					ArmGicEndOfInterrupt (
 | 
				
			||||||
  IN  UINTN                 GicInterruptInterfaceBase,
 | 
					  IN  UINTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN   Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
					  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
				
			||||||
@@ -212,25 +212,26 @@ ArmGicEndOfInterrupt (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSetInterruptPriority (
 | 
					ArmGicSetInterruptPriority (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source,
 | 
					  IN UINTN  Source,
 | 
				
			||||||
  IN UINTN                  Priority
 | 
					  IN UINTN  Priority
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32                RegOffset;
 | 
					  UINT32                 RegOffset;
 | 
				
			||||||
  UINTN                 RegShift;
 | 
					  UINTN                  RegShift;
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
  UINTN                 GicCpuRedistributorBase;
 | 
					  UINTN                  GicCpuRedistributorBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate register offset and bit position
 | 
					  // Calculate register offset and bit position
 | 
				
			||||||
  RegOffset = Source / 4;
 | 
					  RegOffset = Source / 4;
 | 
				
			||||||
  RegShift = (Source % 4) * 8;
 | 
					  RegShift  = (Source % 4) * 8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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),
 | 
				
			||||||
@@ -256,24 +257,25 @@ ArmGicSetInterruptPriority (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEnableInterrupt (
 | 
					ArmGicEnableInterrupt (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32                RegOffset;
 | 
					  UINT32                 RegOffset;
 | 
				
			||||||
  UINTN                 RegShift;
 | 
					  UINTN                  RegShift;
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
  UINTN                 GicCpuRedistributorBase;
 | 
					  UINTN                  GicCpuRedistributorBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate enable register offset and bit position
 | 
					  // Calculate enable register offset and bit position
 | 
				
			||||||
  RegOffset = Source / 32;
 | 
					  RegOffset = Source / 32;
 | 
				
			||||||
  RegShift = Source % 32;
 | 
					  RegShift  = Source % 32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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),
 | 
				
			||||||
@@ -291,7 +293,7 @@ ArmGicEnableInterrupt (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Write set-enable register
 | 
					    // Write set-enable register
 | 
				
			||||||
    MmioWrite32 (
 | 
					    MmioWrite32 (
 | 
				
			||||||
      ISENABLER_ADDRESS(GicCpuRedistributorBase, RegOffset),
 | 
					      ISENABLER_ADDRESS (GicCpuRedistributorBase, RegOffset),
 | 
				
			||||||
      1 << RegShift
 | 
					      1 << RegShift
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -300,24 +302,25 @@ ArmGicEnableInterrupt (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicDisableInterrupt (
 | 
					ArmGicDisableInterrupt (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32                RegOffset;
 | 
					  UINT32                 RegOffset;
 | 
				
			||||||
  UINTN                 RegShift;
 | 
					  UINTN                  RegShift;
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
  UINTN                 GicCpuRedistributorBase;
 | 
					  UINTN                  GicCpuRedistributorBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate enable register offset and bit position
 | 
					  // Calculate enable register offset and bit position
 | 
				
			||||||
  RegOffset = Source / 32;
 | 
					  RegOffset = Source / 32;
 | 
				
			||||||
  RegShift = Source % 32;
 | 
					  RegShift  = Source % 32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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),
 | 
				
			||||||
@@ -325,16 +328,16 @@ ArmGicDisableInterrupt (
 | 
				
			|||||||
      );
 | 
					      );
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    GicCpuRedistributorBase = GicGetCpuRedistributorBase (
 | 
					    GicCpuRedistributorBase = GicGetCpuRedistributorBase (
 | 
				
			||||||
      GicRedistributorBase,
 | 
					                                GicRedistributorBase,
 | 
				
			||||||
      Revision
 | 
					                                Revision
 | 
				
			||||||
      );
 | 
					                                );
 | 
				
			||||||
    if (GicCpuRedistributorBase == 0) {
 | 
					    if (GicCpuRedistributorBase == 0) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Write clear-enable register
 | 
					    // Write clear-enable register
 | 
				
			||||||
    MmioWrite32 (
 | 
					    MmioWrite32 (
 | 
				
			||||||
      ICENABLER_ADDRESS(GicCpuRedistributorBase, RegOffset),
 | 
					      ICENABLER_ADDRESS (GicCpuRedistributorBase, RegOffset),
 | 
				
			||||||
      1 << RegShift
 | 
					      1 << RegShift
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -343,29 +346,30 @@ ArmGicDisableInterrupt (
 | 
				
			|||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicIsInterruptEnabled (
 | 
					ArmGicIsInterruptEnabled (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32                RegOffset;
 | 
					  UINT32                 RegOffset;
 | 
				
			||||||
  UINTN                 RegShift;
 | 
					  UINTN                  RegShift;
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
  UINTN                 GicCpuRedistributorBase;
 | 
					  UINTN                  GicCpuRedistributorBase;
 | 
				
			||||||
  UINT32                Interrupts;
 | 
					  UINT32                 Interrupts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate enable register offset and bit position
 | 
					  // Calculate enable register offset and bit position
 | 
				
			||||||
  RegOffset = Source / 32;
 | 
					  RegOffset = Source / 32;
 | 
				
			||||||
  RegShift = Source % 32;
 | 
					  RegShift  = Source % 32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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);
 | 
					                   & (1 << RegShift)) != 0);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    GicCpuRedistributorBase = GicGetCpuRedistributorBase (
 | 
					    GicCpuRedistributorBase = GicGetCpuRedistributorBase (
 | 
				
			||||||
                                GicRedistributorBase,
 | 
					                                GicRedistributorBase,
 | 
				
			||||||
@@ -377,7 +381,7 @@ ArmGicIsInterruptEnabled (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Read set-enable register
 | 
					    // Read set-enable register
 | 
				
			||||||
    Interrupts = MmioRead32 (
 | 
					    Interrupts = MmioRead32 (
 | 
				
			||||||
                   ISENABLER_ADDRESS(GicCpuRedistributorBase, RegOffset)
 | 
					                   ISENABLER_ADDRESS (GicCpuRedistributorBase, RegOffset)
 | 
				
			||||||
                   );
 | 
					                   );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -387,7 +391,7 @@ ArmGicIsInterruptEnabled (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicDisableDistributor (
 | 
					ArmGicDisableDistributor (
 | 
				
			||||||
  IN  INTN          GicDistributorBase
 | 
					  IN  INTN  GicDistributorBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Disable Gic Distributor
 | 
					  // Disable Gic Distributor
 | 
				
			||||||
@@ -397,10 +401,10 @@ ArmGicDisableDistributor (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEnableInterruptInterface (
 | 
					ArmGicEnableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
					  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
				
			||||||
@@ -415,10 +419,10 @@ ArmGicEnableInterruptInterface (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicDisableInterruptInterface (
 | 
					ArmGicDisableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision = ArmGicGetSupportedArchRevision ();
 | 
					  Revision = ArmGicGetSupportedArchRevision ();
 | 
				
			||||||
  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
					  if (Revision == ARM_GIC_ARCH_REVISION_2) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,10 +13,10 @@
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEnableDistributor (
 | 
					ArmGicEnableDistributor (
 | 
				
			||||||
  IN  INTN          GicDistributorBase
 | 
					  IN  INTN  GicDistributorBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ARM_GIC_ARCH_REVISION Revision;
 | 
					  ARM_GIC_ARCH_REVISION  Revision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
   * Enable GIC distributor in Non-Secure world.
 | 
					   * Enable GIC distributor in Non-Secure world.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,11 +22,11 @@ Abstract:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define ARM_GIC_DEFAULT_PRIORITY  0x80
 | 
					#define ARM_GIC_DEFAULT_PRIORITY  0x80
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV2Protocol;
 | 
					extern EFI_HARDWARE_INTERRUPT_PROTOCOL   gHardwareInterruptV2Protocol;
 | 
				
			||||||
extern EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V2Protocol;
 | 
					extern EFI_HARDWARE_INTERRUPT2_PROTOCOL  gHardwareInterrupt2V2Protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC UINT32 mGicInterruptInterfaceBase;
 | 
					STATIC UINT32  mGicInterruptInterfaceBase;
 | 
				
			||||||
STATIC UINT32 mGicDistributorBase;
 | 
					STATIC UINT32  mGicDistributorBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Enable interrupt source Source.
 | 
					  Enable interrupt source Source.
 | 
				
			||||||
@@ -42,12 +42,12 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV2EnableInterruptSource (
 | 
					GicV2EnableInterruptSource (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -70,12 +70,12 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV2DisableInterruptSource (
 | 
					GicV2DisableInterruptSource (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -99,13 +99,13 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV2GetInterruptSourceState (
 | 
					GicV2GetInterruptSourceState (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source,
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source,
 | 
				
			||||||
  IN BOOLEAN                            *InterruptState
 | 
					  IN BOOLEAN                          *InterruptState
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -129,12 +129,12 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV2EndOfInterrupt (
 | 
					GicV2EndOfInterrupt (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -158,8 +158,8 @@ STATIC
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV2IrqInterruptHandler (
 | 
					GicV2IrqInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE           InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE  InterruptType,
 | 
				
			||||||
  IN EFI_SYSTEM_CONTEXT           SystemContext
 | 
					  IN EFI_SYSTEM_CONTEXT  SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32                      GicInterrupt;
 | 
					  UINT32                      GicInterrupt;
 | 
				
			||||||
@@ -185,7 +185,7 @@ GicV2IrqInterruptHandler (
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The protocol instance produced by this driver
 | 
					// The protocol instance produced by this driver
 | 
				
			||||||
EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV2Protocol = {
 | 
					EFI_HARDWARE_INTERRUPT_PROTOCOL  gHardwareInterruptV2Protocol = {
 | 
				
			||||||
  RegisterInterruptSource,
 | 
					  RegisterInterruptSource,
 | 
				
			||||||
  GicV2EnableInterruptSource,
 | 
					  GicV2EnableInterruptSource,
 | 
				
			||||||
  GicV2DisableInterruptSource,
 | 
					  GicV2DisableInterruptSource,
 | 
				
			||||||
@@ -208,28 +208,28 @@ EFI_STATUS
 | 
				
			|||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV2GetTriggerType (
 | 
					GicV2GetTriggerType (
 | 
				
			||||||
  IN  EFI_HARDWARE_INTERRUPT2_PROTOCOL      *This,
 | 
					  IN  EFI_HARDWARE_INTERRUPT2_PROTOCOL      *This,
 | 
				
			||||||
  IN  HARDWARE_INTERRUPT_SOURCE              Source,
 | 
					  IN  HARDWARE_INTERRUPT_SOURCE             Source,
 | 
				
			||||||
  OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  *TriggerType
 | 
					  OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  *TriggerType
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN                   RegAddress;
 | 
					  UINTN       RegAddress;
 | 
				
			||||||
  UINTN                   Config1Bit;
 | 
					  UINTN       Config1Bit;
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicGetDistributorIcfgBaseAndBit (
 | 
					  Status = GicGetDistributorIcfgBaseAndBit (
 | 
				
			||||||
              Source,
 | 
					             Source,
 | 
				
			||||||
              &RegAddress,
 | 
					             &RegAddress,
 | 
				
			||||||
              &Config1Bit
 | 
					             &Config1Bit
 | 
				
			||||||
              );
 | 
					             );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((MmioRead32 (RegAddress) & (1 << Config1Bit)) == 0) {
 | 
					  if ((MmioRead32 (RegAddress) & (1 << Config1Bit)) == 0) {
 | 
				
			||||||
     *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH;
 | 
					    *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
     *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING;
 | 
					    *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -254,18 +254,22 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  IN  EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  TriggerType
 | 
					  IN  EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  TriggerType
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN                   RegAddress;
 | 
					  UINTN       RegAddress;
 | 
				
			||||||
  UINTN                   Config1Bit;
 | 
					  UINTN       Config1Bit;
 | 
				
			||||||
  UINT32                  Value;
 | 
					  UINT32      Value;
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  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 ((
 | 
				
			||||||
          ASSERT (FALSE);
 | 
					      DEBUG_ERROR,
 | 
				
			||||||
          return EFI_UNSUPPORTED;
 | 
					      "Invalid interrupt trigger type: %d\n", \
 | 
				
			||||||
 | 
					      TriggerType
 | 
				
			||||||
 | 
					      ));
 | 
				
			||||||
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicGetDistributorIcfgBaseAndBit (
 | 
					  Status = GicGetDistributorIcfgBaseAndBit (
 | 
				
			||||||
@@ -279,7 +283,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicV2GetInterruptSourceState (
 | 
					  Status = GicV2GetInterruptSourceState (
 | 
				
			||||||
             (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
					             (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
				
			||||||
             Source,
 | 
					             Source,
 | 
				
			||||||
             &SourceEnabled
 | 
					             &SourceEnabled
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
@@ -296,7 +300,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  // otherwise GIC behavior is UNPREDICTABLE.
 | 
					  // otherwise GIC behavior is UNPREDICTABLE.
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV2DisableInterruptSource (
 | 
					    GicV2DisableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -310,7 +314,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  // Restore interrupt state
 | 
					  // Restore interrupt state
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV2EnableInterruptSource (
 | 
					    GicV2EnableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -318,7 +322,7 @@ GicV2SetTriggerType (
 | 
				
			|||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V2Protocol = {
 | 
					EFI_HARDWARE_INTERRUPT2_PROTOCOL  gHardwareInterrupt2V2Protocol = {
 | 
				
			||||||
  (HARDWARE_INTERRUPT2_REGISTER)RegisterInterruptSource,
 | 
					  (HARDWARE_INTERRUPT2_REGISTER)RegisterInterruptSource,
 | 
				
			||||||
  (HARDWARE_INTERRUPT2_ENABLE)GicV2EnableInterruptSource,
 | 
					  (HARDWARE_INTERRUPT2_ENABLE)GicV2EnableInterruptSource,
 | 
				
			||||||
  (HARDWARE_INTERRUPT2_DISABLE)GicV2DisableInterruptSource,
 | 
					  (HARDWARE_INTERRUPT2_DISABLE)GicV2DisableInterruptSource,
 | 
				
			||||||
@@ -345,8 +349,8 @@ GicV2ExitBootServicesEvent (
 | 
				
			|||||||
  IN VOID       *Context
 | 
					  IN VOID       *Context
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN    Index;
 | 
					  UINTN   Index;
 | 
				
			||||||
  UINT32   GicInterrupt;
 | 
					  UINT32  GicInterrupt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Disable all the interrupts
 | 
					  // Disable all the interrupts
 | 
				
			||||||
  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
					  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
				
			||||||
@@ -382,30 +386,30 @@ GicV2ExitBootServicesEvent (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GicV2DxeInitialize (
 | 
					GicV2DxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINTN                   Index;
 | 
					  UINTN       Index;
 | 
				
			||||||
  UINT32                  RegOffset;
 | 
					  UINT32      RegOffset;
 | 
				
			||||||
  UINTN                   RegShift;
 | 
					  UINTN       RegShift;
 | 
				
			||||||
  UINT32                  CpuTarget;
 | 
					  UINT32      CpuTarget;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Make sure the Interrupt Controller Protocol is not already installed in
 | 
					  // Make sure the Interrupt Controller Protocol is not already installed in
 | 
				
			||||||
  // the system.
 | 
					  // the system.
 | 
				
			||||||
  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gHardwareInterruptProtocolGuid);
 | 
					  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gHardwareInterruptProtocolGuid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mGicInterruptInterfaceBase = PcdGet64 (PcdGicInterruptInterfaceBase);
 | 
					  mGicInterruptInterfaceBase = PcdGet64 (PcdGicInterruptInterfaceBase);
 | 
				
			||||||
  mGicDistributorBase = PcdGet64 (PcdGicDistributorBase);
 | 
					  mGicDistributorBase        = PcdGet64 (PcdGicDistributorBase);
 | 
				
			||||||
  mGicNumInterrupts = ArmGicGetMaxNumInterrupts (mGicDistributorBase);
 | 
					  mGicNumInterrupts          = ArmGicGetMaxNumInterrupts (mGicDistributorBase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
					  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
				
			||||||
    GicV2DisableInterruptSource (&gHardwareInterruptV2Protocol, Index);
 | 
					    GicV2DisableInterruptSource (&gHardwareInterruptV2Protocol, Index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Set Priority
 | 
					    // Set Priority
 | 
				
			||||||
    RegOffset = Index / 4;
 | 
					    RegOffset = Index / 4;
 | 
				
			||||||
    RegShift = (Index % 4) * 8;
 | 
					    RegShift  = (Index % 4) * 8;
 | 
				
			||||||
    MmioAndThenOr32 (
 | 
					    MmioAndThenOr32 (
 | 
				
			||||||
      mGicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
 | 
					      mGicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset),
 | 
				
			||||||
      ~(0xff << RegShift),
 | 
					      ~(0xff << RegShift),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2AcknowledgeInterrupt (
 | 
					ArmGicV2AcknowledgeInterrupt (
 | 
				
			||||||
  IN  UINTN          GicInterruptInterfaceBase
 | 
					  IN  UINTN  GicInterruptInterfaceBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Read the Interrupt Acknowledge Register
 | 
					  // Read the Interrupt Acknowledge Register
 | 
				
			||||||
@@ -22,8 +22,8 @@ ArmGicV2AcknowledgeInterrupt (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2EndOfInterrupt (
 | 
					ArmGicV2EndOfInterrupt (
 | 
				
			||||||
  IN  UINTN                 GicInterruptInterfaceBase,
 | 
					  IN  UINTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN   Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  MmioWrite32 (GicInterruptInterfaceBase + ARM_GIC_ICCEIOR, Source);
 | 
					  MmioWrite32 (GicInterruptInterfaceBase + ARM_GIC_ICCEIOR, Source);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,11 +10,10 @@
 | 
				
			|||||||
#include <Library/IoLib.h>
 | 
					#include <Library/IoLib.h>
 | 
				
			||||||
#include <Library/ArmGicLib.h>
 | 
					#include <Library/ArmGicLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2EnableInterruptInterface (
 | 
					ArmGicV2EnableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  /*
 | 
					  /*
 | 
				
			||||||
@@ -27,7 +26,7 @@ ArmGicV2EnableInterruptInterface (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2DisableInterruptInterface (
 | 
					ArmGicV2DisableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Disable Gic Interface
 | 
					  // Disable Gic Interface
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,11 +12,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define ARM_GIC_DEFAULT_PRIORITY  0x80
 | 
					#define ARM_GIC_DEFAULT_PRIORITY  0x80
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV3Protocol;
 | 
					extern EFI_HARDWARE_INTERRUPT_PROTOCOL   gHardwareInterruptV3Protocol;
 | 
				
			||||||
extern EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V3Protocol;
 | 
					extern EFI_HARDWARE_INTERRUPT2_PROTOCOL  gHardwareInterrupt2V3Protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC UINTN mGicDistributorBase;
 | 
					STATIC UINTN  mGicDistributorBase;
 | 
				
			||||||
STATIC UINTN mGicRedistributorsBase;
 | 
					STATIC UINTN  mGicRedistributorsBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Enable interrupt source Source.
 | 
					  Enable interrupt source Source.
 | 
				
			||||||
@@ -32,12 +32,12 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV3EnableInterruptSource (
 | 
					GicV3EnableInterruptSource (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,12 +60,12 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV3DisableInterruptSource (
 | 
					GicV3DisableInterruptSource (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -89,13 +89,13 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV3GetInterruptSourceState (
 | 
					GicV3GetInterruptSourceState (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source,
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source,
 | 
				
			||||||
  IN BOOLEAN                            *InterruptState
 | 
					  IN BOOLEAN                          *InterruptState
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -123,12 +123,12 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV3EndOfInterrupt (
 | 
					GicV3EndOfInterrupt (
 | 
				
			||||||
  IN EFI_HARDWARE_INTERRUPT_PROTOCOL    *This,
 | 
					  IN EFI_HARDWARE_INTERRUPT_PROTOCOL  *This,
 | 
				
			||||||
  IN HARDWARE_INTERRUPT_SOURCE          Source
 | 
					  IN HARDWARE_INTERRUPT_SOURCE        Source
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (Source >= mGicNumInterrupts) {
 | 
					  if (Source >= mGicNumInterrupts) {
 | 
				
			||||||
    ASSERT(FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return EFI_UNSUPPORTED;
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -152,8 +152,8 @@ STATIC
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GicV3IrqInterruptHandler (
 | 
					GicV3IrqInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE           InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE  InterruptType,
 | 
				
			||||||
  IN EFI_SYSTEM_CONTEXT           SystemContext
 | 
					  IN EFI_SYSTEM_CONTEXT  SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32                      GicInterrupt;
 | 
					  UINT32                      GicInterrupt;
 | 
				
			||||||
@@ -179,7 +179,7 @@ GicV3IrqInterruptHandler (
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The protocol instance produced by this driver
 | 
					// The protocol instance produced by this driver
 | 
				
			||||||
EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV3Protocol = {
 | 
					EFI_HARDWARE_INTERRUPT_PROTOCOL  gHardwareInterruptV3Protocol = {
 | 
				
			||||||
  RegisterInterruptSource,
 | 
					  RegisterInterruptSource,
 | 
				
			||||||
  GicV3EnableInterruptSource,
 | 
					  GicV3EnableInterruptSource,
 | 
				
			||||||
  GicV3DisableInterruptSource,
 | 
					  GicV3DisableInterruptSource,
 | 
				
			||||||
@@ -206,9 +206,9 @@ GicV3GetTriggerType (
 | 
				
			|||||||
  OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  *TriggerType
 | 
					  OUT EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  *TriggerType
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN                   RegAddress;
 | 
					  UINTN       RegAddress;
 | 
				
			||||||
  UINTN                   Config1Bit;
 | 
					  UINTN       Config1Bit;
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicGetDistributorIcfgBaseAndBit (
 | 
					  Status = GicGetDistributorIcfgBaseAndBit (
 | 
				
			||||||
             Source,
 | 
					             Source,
 | 
				
			||||||
@@ -221,9 +221,9 @@ GicV3GetTriggerType (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((MmioRead32 (RegAddress) & (1 << Config1Bit)) == 0) {
 | 
					  if ((MmioRead32 (RegAddress) & (1 << Config1Bit)) == 0) {
 | 
				
			||||||
     *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH;
 | 
					    *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_LEVEL_HIGH;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
     *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING;
 | 
					    *TriggerType = EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -248,18 +248,22 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  IN  EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  TriggerType
 | 
					  IN  EFI_HARDWARE_INTERRUPT2_TRIGGER_TYPE  TriggerType
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN                   RegAddress;
 | 
					  UINTN       RegAddress;
 | 
				
			||||||
  UINTN                   Config1Bit;
 | 
					  UINTN       Config1Bit;
 | 
				
			||||||
  UINT32                  Value;
 | 
					  UINT32      Value;
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  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 ((
 | 
				
			||||||
          ASSERT (FALSE);
 | 
					      DEBUG_ERROR,
 | 
				
			||||||
          return EFI_UNSUPPORTED;
 | 
					      "Invalid interrupt trigger type: %d\n", \
 | 
				
			||||||
 | 
					      TriggerType
 | 
				
			||||||
 | 
					      ));
 | 
				
			||||||
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
 | 
					    return EFI_UNSUPPORTED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicGetDistributorIcfgBaseAndBit (
 | 
					  Status = GicGetDistributorIcfgBaseAndBit (
 | 
				
			||||||
@@ -273,7 +277,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = GicV3GetInterruptSourceState (
 | 
					  Status = GicV3GetInterruptSourceState (
 | 
				
			||||||
             (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
					             (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
				
			||||||
             Source,
 | 
					             Source,
 | 
				
			||||||
             &SourceEnabled
 | 
					             &SourceEnabled
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
@@ -290,7 +294,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  // otherwise GIC behavior is UNPREDICTABLE.
 | 
					  // otherwise GIC behavior is UNPREDICTABLE.
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV3DisableInterruptSource (
 | 
					    GicV3DisableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -303,7 +307,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  // Restore interrupt state
 | 
					  // Restore interrupt state
 | 
				
			||||||
  if (SourceEnabled) {
 | 
					  if (SourceEnabled) {
 | 
				
			||||||
    GicV3EnableInterruptSource (
 | 
					    GicV3EnableInterruptSource (
 | 
				
			||||||
      (EFI_HARDWARE_INTERRUPT_PROTOCOL*)This,
 | 
					      (EFI_HARDWARE_INTERRUPT_PROTOCOL *)This,
 | 
				
			||||||
      Source
 | 
					      Source
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -311,7 +315,7 @@ GicV3SetTriggerType (
 | 
				
			|||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_HARDWARE_INTERRUPT2_PROTOCOL gHardwareInterrupt2V3Protocol = {
 | 
					EFI_HARDWARE_INTERRUPT2_PROTOCOL  gHardwareInterrupt2V3Protocol = {
 | 
				
			||||||
  (HARDWARE_INTERRUPT2_REGISTER)RegisterInterruptSource,
 | 
					  (HARDWARE_INTERRUPT2_REGISTER)RegisterInterruptSource,
 | 
				
			||||||
  (HARDWARE_INTERRUPT2_ENABLE)GicV3EnableInterruptSource,
 | 
					  (HARDWARE_INTERRUPT2_ENABLE)GicV3EnableInterruptSource,
 | 
				
			||||||
  (HARDWARE_INTERRUPT2_DISABLE)GicV3DisableInterruptSource,
 | 
					  (HARDWARE_INTERRUPT2_DISABLE)GicV3DisableInterruptSource,
 | 
				
			||||||
@@ -337,17 +341,13 @@ GicV3ExitBootServicesEvent (
 | 
				
			|||||||
  IN VOID       *Context
 | 
					  IN VOID       *Context
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN    Index;
 | 
					  UINTN  Index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Acknowledge all pending interrupts
 | 
					  // Acknowledge all pending interrupts
 | 
				
			||||||
  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
					  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
				
			||||||
    GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
 | 
					    GicV3DisableInterruptSource (&gHardwareInterruptV3Protocol, Index);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Index = 0; Index < mGicNumInterrupts; Index++) {
 | 
					 | 
				
			||||||
    GicV3EndOfInterrupt (&gHardwareInterruptV3Protocol, Index);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Disable Gic Interface
 | 
					  // Disable Gic Interface
 | 
				
			||||||
  ArmGicV3DisableInterruptInterface ();
 | 
					  ArmGicV3DisableInterruptInterface ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -368,14 +368,14 @@ GicV3ExitBootServicesEvent (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GicV3DxeInitialize (
 | 
					GicV3DxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINTN                   Index;
 | 
					  UINTN       Index;
 | 
				
			||||||
  UINT64                  CpuTarget;
 | 
					  UINT64      CpuTarget;
 | 
				
			||||||
  UINT64                  MpId;
 | 
					  UINT64      MpId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Make sure the Interrupt Controller Protocol is not already installed in
 | 
					  // Make sure the Interrupt Controller Protocol is not already installed in
 | 
				
			||||||
  // the system.
 | 
					  // the system.
 | 
				
			||||||
@@ -428,14 +428,14 @@ GicV3DxeInitialize (
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    MpId = ArmReadMpidr ();
 | 
					    MpId      = ArmReadMpidr ();
 | 
				
			||||||
    CpuTarget = MpId &
 | 
					    CpuTarget = MpId &
 | 
				
			||||||
      (ARM_CORE_AFF0 | ARM_CORE_AFF1 | ARM_CORE_AFF2 | ARM_CORE_AFF3);
 | 
					                (ARM_CORE_AFF0 | ARM_CORE_AFF1 | ARM_CORE_AFF2 | ARM_CORE_AFF3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			|||||||
#include <Library/PcdLib.h>
 | 
					#include <Library/PcdLib.h>
 | 
				
			||||||
#include <Library/UefiBootServicesTableLib.h>
 | 
					#include <Library/UefiBootServicesTableLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_IO_PORT_ADDRESS   0xFFFF
 | 
					#define MAX_IO_PORT_ADDRESS  0xFFFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Handle for the CPU I/O 2 Protocol
 | 
					// Handle for the CPU I/O 2 Protocol
 | 
				
			||||||
@@ -28,7 +28,7 @@ STATIC EFI_HANDLE  mHandle = NULL;
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// Lookup table for increment values based on transfer widths
 | 
					// Lookup table for increment values based on transfer widths
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
STATIC CONST UINT8 mInStride[] = {
 | 
					STATIC CONST UINT8  mInStride[] = {
 | 
				
			||||||
  1, // EfiCpuIoWidthUint8
 | 
					  1, // EfiCpuIoWidthUint8
 | 
				
			||||||
  2, // EfiCpuIoWidthUint16
 | 
					  2, // EfiCpuIoWidthUint16
 | 
				
			||||||
  4, // EfiCpuIoWidthUint32
 | 
					  4, // EfiCpuIoWidthUint32
 | 
				
			||||||
@@ -46,7 +46,7 @@ STATIC CONST UINT8 mInStride[] = {
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// Lookup table for increment values based on transfer widths
 | 
					// Lookup table for increment values based on transfer widths
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
STATIC CONST UINT8 mOutStride[] = {
 | 
					STATIC CONST UINT8  mOutStride[] = {
 | 
				
			||||||
  1, // EfiCpuIoWidthUint8
 | 
					  1, // EfiCpuIoWidthUint8
 | 
				
			||||||
  2, // EfiCpuIoWidthUint16
 | 
					  2, // EfiCpuIoWidthUint16
 | 
				
			||||||
  4, // EfiCpuIoWidthUint32
 | 
					  4, // EfiCpuIoWidthUint32
 | 
				
			||||||
@@ -117,14 +117,14 @@ 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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Check to see if Width is in the valid range for I/O Port operations
 | 
					  // Check to see if Width is in the valid range for I/O Port operations
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  Width = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
					  Width = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
				
			||||||
  if (!MmioOperation && (Width == EfiCpuIoWidthUint64)) {
 | 
					  if (!MmioOperation && (Width == EfiCpuIoWidthUint64)) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -240,9 +241,9 @@ CpuMemoryServiceRead (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  // Select loop based on the width of the transfer
 | 
					  // Select loop based on the width of the transfer
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride       = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride      = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
				
			||||||
  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
      *Uint8Buffer = MmioRead8 ((UINTN)Address);
 | 
					      *Uint8Buffer = MmioRead8 ((UINTN)Address);
 | 
				
			||||||
@@ -254,6 +255,7 @@ CpuMemoryServiceRead (
 | 
				
			|||||||
      *((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
 | 
					      *((UINT64 *)Uint8Buffer) = MmioRead64 ((UINTN)Address);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -321,9 +323,9 @@ CpuMemoryServiceWrite (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  // Select loop based on the width of the transfer
 | 
					  // Select loop based on the width of the transfer
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride       = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride      = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
				
			||||||
  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
      MmioWrite8 ((UINTN)Address, *Uint8Buffer);
 | 
					      MmioWrite8 ((UINTN)Address, *Uint8Buffer);
 | 
				
			||||||
@@ -335,6 +337,7 @@ CpuMemoryServiceWrite (
 | 
				
			|||||||
      MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
 | 
					      MmioWrite64 ((UINTN)Address, *((UINT64 *)Uint8Buffer));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -404,9 +407,9 @@ CpuIoServiceRead (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  // Select loop based on the width of the transfer
 | 
					  // Select loop based on the width of the transfer
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride       = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride      = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
@@ -490,9 +493,9 @@ CpuIoServiceWrite (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  // Select loop based on the width of the transfer
 | 
					  // Select loop based on the width of the transfer
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  InStride = mInStride[Width];
 | 
					  InStride       = mInStride[Width];
 | 
				
			||||||
  OutStride = mOutStride[Width];
 | 
					  OutStride      = mOutStride[Width];
 | 
				
			||||||
  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH) (Width & 0x03);
 | 
					  OperationWidth = (EFI_CPU_IO_PROTOCOL_WIDTH)(Width & 0x03);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (Uint8Buffer = (UINT8 *)Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
					  for (Uint8Buffer = (UINT8 *)Buffer; Count > 0; Address += InStride, Uint8Buffer += OutStride, Count--) {
 | 
				
			||||||
    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
					    if (OperationWidth == EfiCpuIoWidthUint8) {
 | 
				
			||||||
@@ -510,7 +513,7 @@ CpuIoServiceWrite (
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// CPU I/O 2 Protocol instance
 | 
					// CPU I/O 2 Protocol instance
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
STATIC EFI_CPU_IO2_PROTOCOL mCpuIo2 = {
 | 
					STATIC EFI_CPU_IO2_PROTOCOL  mCpuIo2 = {
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    CpuMemoryServiceRead,
 | 
					    CpuMemoryServiceRead,
 | 
				
			||||||
    CpuMemoryServiceWrite
 | 
					    CpuMemoryServiceWrite
 | 
				
			||||||
@@ -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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -539,12 +541,13 @@ ArmPciCpuIo2Initialize (
 | 
				
			|||||||
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Return values of BASE_DISCOVER_LIST_PROTOCOLS command.
 | 
					// Return values of BASE_DISCOVER_LIST_PROTOCOLS command.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 NumProtocols;
 | 
					  UINT32    NumProtocols;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Array of four protocols in each element
 | 
					  // Array of four protocols in each element
 | 
				
			||||||
  // Total elements = 1 + (NumProtocols-1)/4
 | 
					  // Total elements = 1 + (NumProtocols-1)/4
 | 
				
			||||||
@@ -22,7 +22,7 @@ typedef struct {
 | 
				
			|||||||
  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
					  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
				
			||||||
  // here array of 1 element length. However below is used as a variable
 | 
					  // here array of 1 element length. However below is used as a variable
 | 
				
			||||||
  // length array.
 | 
					  // length array.
 | 
				
			||||||
  UINT8 Protocols[1];
 | 
					  UINT8     Protocols[1];
 | 
				
			||||||
} BASE_DISCOVER_LIST;
 | 
					} BASE_DISCOVER_LIST;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Initialize Base protocol and install protocol on a given handle.
 | 
					/** Initialize Base protocol and install protocol on a given handle.
 | 
				
			||||||
@@ -34,7 +34,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiBaseProtocolInit (
 | 
					ScmiBaseProtocolInit (
 | 
				
			||||||
  IN OUT EFI_HANDLE* Handle
 | 
					  IN OUT EFI_HANDLE  *Handle
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_ */
 | 
					#endif /* ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,57 +16,56 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Clock rate in two 32bit words.
 | 
					// Clock rate in two 32bit words.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 Low;
 | 
					  UINT32    Low;
 | 
				
			||||||
  UINT32 High;
 | 
					  UINT32    High;
 | 
				
			||||||
} CLOCK_RATE_DWORD;
 | 
					} CLOCK_RATE_DWORD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Format of the returned rate array. Linear or Non-linear,.RatesFlag Bit[12]
 | 
					// Format of the returned rate array. Linear or Non-linear,.RatesFlag Bit[12]
 | 
				
			||||||
#define RATE_FORMAT_SHIFT           12
 | 
					#define RATE_FORMAT_SHIFT  12
 | 
				
			||||||
#define RATE_FORMAT_MASK            0x0001
 | 
					#define RATE_FORMAT_MASK   0x0001
 | 
				
			||||||
#define RATE_FORMAT(RatesFlags)     ((RatesFlags >> RATE_FORMAT_SHIFT)  \
 | 
					#define RATE_FORMAT(RatesFlags)  ((RatesFlags >> RATE_FORMAT_SHIFT)     \
 | 
				
			||||||
                                     & RATE_FORMAT_MASK)
 | 
					                                     & RATE_FORMAT_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Number of remaining rates after a call to the SCP, RatesFlag Bits[31:16]
 | 
					// Number of remaining rates after a call to the SCP, RatesFlag Bits[31:16]
 | 
				
			||||||
#define NUM_REMAIN_RATES_SHIFT        16
 | 
					#define NUM_REMAIN_RATES_SHIFT  16
 | 
				
			||||||
#define NUM_REMAIN_RATES(RatesFlags)  ((RatesFlags >> NUM_REMAIN_RATES_SHIFT))
 | 
					#define NUM_REMAIN_RATES(RatesFlags)  ((RatesFlags >> NUM_REMAIN_RATES_SHIFT))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Number of rates that are returned by a call.to the SCP, RatesFlag Bits[11:0]
 | 
					// Number of rates that are returned by a call.to the SCP, RatesFlag Bits[11:0]
 | 
				
			||||||
#define NUM_RATES_MASK              0x0FFF
 | 
					#define NUM_RATES_MASK  0x0FFF
 | 
				
			||||||
#define NUM_RATES(RatesFlags)       (RatesFlags & NUM_RATES_MASK)
 | 
					#define NUM_RATES(RatesFlags)  (RatesFlags & NUM_RATES_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Return values for the CLOCK_DESCRIBER_RATE command.
 | 
					// Return values for the CLOCK_DESCRIBER_RATE command.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 NumRatesFlags;
 | 
					  UINT32              NumRatesFlags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
					  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
				
			||||||
  // here array of 1 element length. However below is used as a variable
 | 
					  // here array of 1 element length. However below is used as a variable
 | 
				
			||||||
  // length array.
 | 
					  // length array.
 | 
				
			||||||
  CLOCK_RATE_DWORD Rates[1];
 | 
					  CLOCK_RATE_DWORD    Rates[1];
 | 
				
			||||||
} CLOCK_DESCRIBE_RATES;
 | 
					} CLOCK_DESCRIBE_RATES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CLOCK_SET_DEFAULT_FLAGS   0
 | 
					#define CLOCK_SET_DEFAULT_FLAGS  0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Message parameters for CLOCK_RATE_SET command.
 | 
					// Message parameters for CLOCK_RATE_SET command.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 Flags;
 | 
					  UINT32              Flags;
 | 
				
			||||||
  UINT32 ClockId;
 | 
					  UINT32              ClockId;
 | 
				
			||||||
  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;
 | 
				
			||||||
  UINT32 Attributes;
 | 
					  UINT32    Attributes;
 | 
				
			||||||
} CLOCK_CONFIG_SET_ATTRIBUTES;
 | 
					} CLOCK_CONFIG_SET_ATTRIBUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//  if ClockAttr Bit[0] is set then clock device is enabled.
 | 
					//  if ClockAttr Bit[0] is set then clock device is enabled.
 | 
				
			||||||
#define CLOCK_ENABLE_MASK         0x1
 | 
					#define CLOCK_ENABLE_MASK  0x1
 | 
				
			||||||
#define CLOCK_ENABLED(ClockAttr)  ((ClockAttr & CLOCK_ENABLE_MASK) == 1)
 | 
					#define CLOCK_ENABLED(ClockAttr)  ((ClockAttr & CLOCK_ENABLE_MASK) == 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 Attributes;
 | 
					  UINT32    Attributes;
 | 
				
			||||||
  UINT8  ClockName[SCMI_MAX_STR_LEN];
 | 
					  UINT8     ClockName[SCMI_MAX_STR_LEN];
 | 
				
			||||||
} CLOCK_ATTRIBUTES;
 | 
					} CLOCK_ATTRIBUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack()
 | 
					#pragma pack()
 | 
				
			||||||
@@ -79,7 +78,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiClockProtocolInit (
 | 
					ScmiClockProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE *Handle
 | 
					  IN EFI_HANDLE  *Handle
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_ */
 | 
					#endif /* ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,23 +15,23 @@
 | 
				
			|||||||
#include <Protocol/ArmScmiPerformanceProtocol.h>
 | 
					#include <Protocol/ArmScmiPerformanceProtocol.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Number of performance levels returned by a call to the SCP, Lvls Bits[11:0]
 | 
					// Number of performance levels returned by a call to the SCP, Lvls Bits[11:0]
 | 
				
			||||||
#define NUM_PERF_LEVELS_MASK          0x0FFF
 | 
					#define NUM_PERF_LEVELS_MASK  0x0FFF
 | 
				
			||||||
#define NUM_PERF_LEVELS(Lvls) (Lvls & NUM_PERF_LEVELS_MASK)
 | 
					#define NUM_PERF_LEVELS(Lvls)  (Lvls & NUM_PERF_LEVELS_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Number of performance levels remaining after a call to the SCP, Lvls Bits[31:16]
 | 
					// Number of performance levels remaining after a call to the SCP, Lvls Bits[31:16]
 | 
				
			||||||
#define NUM_REMAIN_PERF_LEVELS_SHIFT  16
 | 
					#define NUM_REMAIN_PERF_LEVELS_SHIFT  16
 | 
				
			||||||
#define NUM_REMAIN_PERF_LEVELS(Lvls) (Lvls >> NUM_REMAIN_PERF_LEVELS_SHIFT)
 | 
					#define NUM_REMAIN_PERF_LEVELS(Lvls)  (Lvls >> NUM_REMAIN_PERF_LEVELS_SHIFT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Return values for ScmiMessageIdPerformanceDescribeLevels command.
 | 
					/** Return values for ScmiMessageIdPerformanceDescribeLevels command.
 | 
				
			||||||
  SCMI Spec section 4.5.2.5
 | 
					  SCMI Spec section 4.5.2.5
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 NumLevels;
 | 
					  UINT32                    NumLevels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
					  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
				
			||||||
  // here array of 1 element length. However below is used as a variable
 | 
					  // here array of 1 element length. However below is used as a variable
 | 
				
			||||||
  // length array.
 | 
					  // length array.
 | 
				
			||||||
  SCMI_PERFORMANCE_LEVEL PerfLevel[1]; // Offset to array of performance levels
 | 
					  SCMI_PERFORMANCE_LEVEL    PerfLevel[1]; // Offset to array of performance levels
 | 
				
			||||||
} PERF_DESCRIBE_LEVELS;
 | 
					} PERF_DESCRIBE_LEVELS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Initialize performance management protocol and install on a given Handle.
 | 
					/** Initialize performance management protocol and install on a given Handle.
 | 
				
			||||||
@@ -43,7 +43,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiPerformanceProtocolInit (
 | 
					ScmiPerformanceProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE* Handle
 | 
					  IN EFI_HANDLE  *Handle
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_ */
 | 
					#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiCommandGetPayload (
 | 
					ScmiCommandGetPayload (
 | 
				
			||||||
  OUT UINT32** Payload
 | 
					  OUT UINT32  **Payload
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS   Status;
 | 
					  EFI_STATUS   Status;
 | 
				
			||||||
@@ -76,7 +76,7 @@ EFI_STATUS
 | 
				
			|||||||
ScmiCommandExecute (
 | 
					ScmiCommandExecute (
 | 
				
			||||||
  IN     SCMI_COMMAND  *Command,
 | 
					  IN     SCMI_COMMAND  *Command,
 | 
				
			||||||
  IN OUT UINT32        *PayloadLength,
 | 
					  IN OUT UINT32        *PayloadLength,
 | 
				
			||||||
  OUT    UINT32       **ReturnValues OPTIONAL
 | 
					  OUT    UINT32        **ReturnValues OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS             Status;
 | 
					  EFI_STATUS             Status;
 | 
				
			||||||
@@ -121,10 +121,12 @@ ScmiCommandExecute (
 | 
				
			|||||||
    return EFI_DEVICE_ERROR;
 | 
					    return EFI_DEVICE_ERROR;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -163,7 +165,7 @@ ScmiProtocolDiscoveryCommon (
 | 
				
			|||||||
  SCMI_COMMAND  Command;
 | 
					  SCMI_COMMAND  Command;
 | 
				
			||||||
  UINT32        PayloadLength;
 | 
					  UINT32        PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PayloadLength = 0;
 | 
					  PayloadLength      = 0;
 | 
				
			||||||
  Command.ProtocolId = ProtocolId;
 | 
					  Command.ProtocolId = ProtocolId;
 | 
				
			||||||
  Command.MessageId  = MessageId;
 | 
					  Command.MessageId  = MessageId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -190,13 +192,13 @@ ScmiGetProtocolVersion (
 | 
				
			|||||||
  OUT UINT32            *Version
 | 
					  OUT UINT32            *Version
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS             Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINT32                 *ProtocolVersion;
 | 
					  UINT32      *ProtocolVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiProtocolDiscoveryCommon (
 | 
					  Status = ScmiProtocolDiscoveryCommon (
 | 
				
			||||||
             ProtocolId,
 | 
					             ProtocolId,
 | 
				
			||||||
             ScmiMessageIdProtocolVersion,
 | 
					             ScmiMessageIdProtocolVersion,
 | 
				
			||||||
             (UINT32**)&ProtocolVersion
 | 
					             (UINT32 **)&ProtocolVersion
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,9 +106,9 @@ BaseDiscoverVendorDetails (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AsciiStrCpyS (
 | 
					  AsciiStrCpyS (
 | 
				
			||||||
    (CHAR8*)VendorIdentifier,
 | 
					    (CHAR8 *)VendorIdentifier,
 | 
				
			||||||
    SCMI_MAX_STR_LEN,
 | 
					    SCMI_MAX_STR_LEN,
 | 
				
			||||||
    (CONST CHAR8*)ReturnValues
 | 
					    (CONST CHAR8 *)ReturnValues
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -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.
 | 
				
			||||||
@@ -265,7 +264,7 @@ BaseDiscoverListProtocols (
 | 
				
			|||||||
    Status = ScmiCommandExecute (
 | 
					    Status = ScmiCommandExecute (
 | 
				
			||||||
               &Cmd,
 | 
					               &Cmd,
 | 
				
			||||||
               &PayloadLength,
 | 
					               &PayloadLength,
 | 
				
			||||||
               (UINT32**)&DiscoverList
 | 
					               (UINT32 **)&DiscoverList
 | 
				
			||||||
               );
 | 
					               );
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
@@ -282,7 +281,7 @@ BaseDiscoverListProtocols (
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instance of the SCMI Base protocol.
 | 
					// Instance of the SCMI Base protocol.
 | 
				
			||||||
STATIC CONST SCMI_BASE_PROTOCOL BaseProtocol = {
 | 
					STATIC CONST SCMI_BASE_PROTOCOL  BaseProtocol = {
 | 
				
			||||||
  BaseGetVersion,
 | 
					  BaseGetVersion,
 | 
				
			||||||
  BaseGetTotalProtocols,
 | 
					  BaseGetTotalProtocols,
 | 
				
			||||||
  BaseDiscoverVendor,
 | 
					  BaseDiscoverVendor,
 | 
				
			||||||
@@ -300,7 +299,7 @@ STATIC CONST SCMI_BASE_PROTOCOL BaseProtocol = {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiBaseProtocolInit (
 | 
					ScmiBaseProtocolInit (
 | 
				
			||||||
  IN OUT EFI_HANDLE* Handle
 | 
					  IN OUT EFI_HANDLE  *Handle
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return gBS->InstallMultipleProtocolInterfaces (
 | 
					  return gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,11 +28,11 @@
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
ConvertTo64Bit (
 | 
					ConvertTo64Bit (
 | 
				
			||||||
  IN UINT32 Low,
 | 
					  IN UINT32  Low,
 | 
				
			||||||
  IN UINT32 High
 | 
					  IN UINT32  High
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   return (Low | ((UINT64)High << 32));
 | 
					  return (Low | ((UINT64)High << 32));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Return version of the clock management protocol supported by SCP firmware.
 | 
					/** Return version of the clock management protocol supported by SCP firmware.
 | 
				
			||||||
@@ -74,7 +74,7 @@ ClockGetTotalClocks (
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINT32     *ReturnValues;
 | 
					  UINT32      *ReturnValues;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiGetProtocolAttributes (ScmiProtocolIdClock, &ReturnValues);
 | 
					  Status = ScmiGetProtocolAttributes (ScmiProtocolIdClock, &ReturnValues);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
@@ -108,12 +108,12 @@ ClockGetClockAttributes (
 | 
				
			|||||||
  OUT CHAR8                *ClockAsciiName
 | 
					  OUT CHAR8                *ClockAsciiName
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS          Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UINT32              *MessageParams;
 | 
					  UINT32            *MessageParams;
 | 
				
			||||||
  CLOCK_ATTRIBUTES    *ClockAttributes;
 | 
					  CLOCK_ATTRIBUTES  *ClockAttributes;
 | 
				
			||||||
  SCMI_COMMAND        Cmd;
 | 
					  SCMI_COMMAND      Cmd;
 | 
				
			||||||
  UINT32              PayloadLength;
 | 
					  UINT32            PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload (&MessageParams);
 | 
					  Status = ScmiCommandGetPayload (&MessageParams);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
@@ -130,18 +130,19 @@ ClockGetClockAttributes (
 | 
				
			|||||||
  Status = ScmiCommandExecute (
 | 
					  Status = ScmiCommandExecute (
 | 
				
			||||||
             &Cmd,
 | 
					             &Cmd,
 | 
				
			||||||
             &PayloadLength,
 | 
					             &PayloadLength,
 | 
				
			||||||
             (UINT32**)&ClockAttributes
 | 
					             (UINT32 **)&ClockAttributes
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AsciiStrCpyS (
 | 
					  AsciiStrCpyS (
 | 
				
			||||||
    ClockAsciiName,
 | 
					    ClockAsciiName,
 | 
				
			||||||
    SCMI_MAX_STR_LEN,
 | 
					    SCMI_MAX_STR_LEN,
 | 
				
			||||||
    (CONST CHAR8*)ClockAttributes->ClockName
 | 
					    (CONST CHAR8 *)ClockAttributes->ClockName
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
@@ -174,29 +175,29 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ClockDescribeRates (
 | 
					ClockDescribeRates (
 | 
				
			||||||
  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
					  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
				
			||||||
  IN     UINT32                   ClockId,
 | 
					  IN     UINT32                  ClockId,
 | 
				
			||||||
  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
					  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
				
			||||||
  OUT    UINT32                  *TotalRates,
 | 
					  OUT    UINT32                  *TotalRates,
 | 
				
			||||||
  IN OUT UINT32                  *RateArraySize,
 | 
					  IN OUT UINT32                  *RateArraySize,
 | 
				
			||||||
  OUT    SCMI_CLOCK_RATE         *RateArray
 | 
					  OUT    SCMI_CLOCK_RATE         *RateArray
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS             Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UINT32                 PayloadLength;
 | 
					  UINT32                PayloadLength;
 | 
				
			||||||
  SCMI_COMMAND           Cmd;
 | 
					  SCMI_COMMAND          Cmd;
 | 
				
			||||||
  UINT32                 *MessageParams;
 | 
					  UINT32                *MessageParams;
 | 
				
			||||||
  CLOCK_DESCRIBE_RATES   *DescribeRates;
 | 
					  CLOCK_DESCRIBE_RATES  *DescribeRates;
 | 
				
			||||||
  CLOCK_RATE_DWORD       *Rate;
 | 
					  CLOCK_RATE_DWORD      *Rate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UINT32                 RequiredArraySize;
 | 
					  UINT32  RequiredArraySize;
 | 
				
			||||||
  UINT32                 RateIndex;
 | 
					  UINT32  RateIndex;
 | 
				
			||||||
  UINT32                 RateNo;
 | 
					  UINT32  RateNo;
 | 
				
			||||||
  UINT32                 RateOffset;
 | 
					  UINT32  RateOffset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *TotalRates = 0;
 | 
					  *TotalRates       = 0;
 | 
				
			||||||
  RequiredArraySize = 0;
 | 
					  RequiredArraySize = 0;
 | 
				
			||||||
  RateIndex = 0;
 | 
					  RateIndex         = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload (&MessageParams);
 | 
					  Status = ScmiCommandGetPayload (&MessageParams);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
@@ -206,20 +207,19 @@ ClockDescribeRates (
 | 
				
			|||||||
  Cmd.ProtocolId = ScmiProtocolIdClock;
 | 
					  Cmd.ProtocolId = ScmiProtocolIdClock;
 | 
				
			||||||
  Cmd.MessageId  = ScmiMessageIdClockDescribeRates;
 | 
					  Cmd.MessageId  = ScmiMessageIdClockDescribeRates;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *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.
 | 
				
			||||||
    PayloadLength  = sizeof (ClockId) + sizeof (RateIndex);
 | 
					    PayloadLength = sizeof (ClockId) + sizeof (RateIndex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Execute and wait for response on a SCMI channel.
 | 
					    // Execute and wait for response on a SCMI channel.
 | 
				
			||||||
    Status = ScmiCommandExecute (
 | 
					    Status = ScmiCommandExecute (
 | 
				
			||||||
               &Cmd,
 | 
					               &Cmd,
 | 
				
			||||||
               &PayloadLength,
 | 
					               &PayloadLength,
 | 
				
			||||||
               (UINT32**)&DescribeRates
 | 
					               (UINT32 **)&DescribeRates
 | 
				
			||||||
               );
 | 
					               );
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
@@ -237,10 +237,10 @@ ClockDescribeRates (
 | 
				
			|||||||
                    + NUM_REMAIN_RATES (DescribeRates->NumRatesFlags);
 | 
					                    + NUM_REMAIN_RATES (DescribeRates->NumRatesFlags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (*Format == ScmiClockRateFormatDiscrete) {
 | 
					      if (*Format == ScmiClockRateFormatDiscrete) {
 | 
				
			||||||
         RequiredArraySize = (*TotalRates) * sizeof (UINT64);
 | 
					        RequiredArraySize = (*TotalRates) * sizeof (UINT64);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         // We need to return triplet of 64 bit value for each rate
 | 
					        // We need to return triplet of 64 bit value for each rate
 | 
				
			||||||
         RequiredArraySize = (*TotalRates) * 3 * sizeof (UINT64);
 | 
					        RequiredArraySize = (*TotalRates) * 3 * sizeof (UINT64);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (RequiredArraySize > (*RateArraySize)) {
 | 
					      if (RequiredArraySize > (*RateArraySize)) {
 | 
				
			||||||
@@ -262,7 +262,7 @@ ClockDescribeRates (
 | 
				
			|||||||
      for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
 | 
					      for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
 | 
				
			||||||
        // Linear clock rates from minimum to maximum in steps
 | 
					        // Linear clock rates from minimum to maximum in steps
 | 
				
			||||||
        // Minimum clock rate.
 | 
					        // Minimum clock rate.
 | 
				
			||||||
        Rate = &DescribeRates->Rates[RateOffset++];
 | 
					        Rate                                    = &DescribeRates->Rates[RateOffset++];
 | 
				
			||||||
        RateArray[RateIndex].ContinuousRate.Min =
 | 
					        RateArray[RateIndex].ContinuousRate.Min =
 | 
				
			||||||
          ConvertTo64Bit (Rate->Low, Rate->High);
 | 
					          ConvertTo64Bit (Rate->Low, Rate->High);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -304,13 +304,13 @@ ClockRateGet (
 | 
				
			|||||||
  OUT UINT64               *Rate
 | 
					  OUT UINT64               *Rate
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS     Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UINT32            *MessageParams;
 | 
					  UINT32            *MessageParams;
 | 
				
			||||||
  CLOCK_RATE_DWORD  *ClockRate;
 | 
					  CLOCK_RATE_DWORD  *ClockRate;
 | 
				
			||||||
  SCMI_COMMAND      Cmd;
 | 
					  SCMI_COMMAND      Cmd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  UINT32         PayloadLength;
 | 
					  UINT32  PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload (&MessageParams);
 | 
					  Status = ScmiCommandGetPayload (&MessageParams);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
@@ -318,10 +318,10 @@ ClockRateGet (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Fill arguments for clock protocol command.
 | 
					  // Fill arguments for clock protocol command.
 | 
				
			||||||
  *MessageParams  = ClockId;
 | 
					  *MessageParams = ClockId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Cmd.ProtocolId  = ScmiProtocolIdClock;
 | 
					  Cmd.ProtocolId = ScmiProtocolIdClock;
 | 
				
			||||||
  Cmd.MessageId   = ScmiMessageIdClockRateGet;
 | 
					  Cmd.MessageId  = ScmiMessageIdClockRateGet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PayloadLength = sizeof (ClockId);
 | 
					  PayloadLength = sizeof (ClockId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -329,7 +329,7 @@ ClockRateGet (
 | 
				
			|||||||
  Status = ScmiCommandExecute (
 | 
					  Status = ScmiCommandExecute (
 | 
				
			||||||
             &Cmd,
 | 
					             &Cmd,
 | 
				
			||||||
             &PayloadLength,
 | 
					             &PayloadLength,
 | 
				
			||||||
             (UINT32**)&ClockRate
 | 
					             (UINT32 **)&ClockRate
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
@@ -358,21 +358,21 @@ ClockRateSet (
 | 
				
			|||||||
  IN UINT64               Rate
 | 
					  IN UINT64               Rate
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                  Status;
 | 
					  EFI_STATUS                 Status;
 | 
				
			||||||
  CLOCK_RATE_SET_ATTRIBUTES   *ClockRateSetAttributes;
 | 
					  CLOCK_RATE_SET_ATTRIBUTES  *ClockRateSetAttributes;
 | 
				
			||||||
  SCMI_COMMAND                Cmd;
 | 
					  SCMI_COMMAND               Cmd;
 | 
				
			||||||
  UINT32                      PayloadLength;
 | 
					  UINT32                     PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload ((UINT32**)&ClockRateSetAttributes);
 | 
					  Status = ScmiCommandGetPayload ((UINT32 **)&ClockRateSetAttributes);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Fill arguments for clock protocol command.
 | 
					  // Fill arguments for clock protocol command.
 | 
				
			||||||
  ClockRateSetAttributes->ClockId    = ClockId;
 | 
					  ClockRateSetAttributes->ClockId   = ClockId;
 | 
				
			||||||
  ClockRateSetAttributes->Flags      = CLOCK_SET_DEFAULT_FLAGS;
 | 
					  ClockRateSetAttributes->Flags     = CLOCK_SET_DEFAULT_FLAGS;
 | 
				
			||||||
  ClockRateSetAttributes->Rate.Low   = (UINT32)Rate;
 | 
					  ClockRateSetAttributes->Rate.Low  = (UINT32)Rate;
 | 
				
			||||||
  ClockRateSetAttributes->Rate.High  = (UINT32)(Rate >> 32);
 | 
					  ClockRateSetAttributes->Rate.High = (UINT32)(Rate >> 32);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Cmd.ProtocolId = ScmiProtocolIdClock;
 | 
					  Cmd.ProtocolId = ScmiProtocolIdClock;
 | 
				
			||||||
  Cmd.MessageId  = ScmiMessageIdClockRateSet;
 | 
					  Cmd.MessageId  = ScmiMessageIdClockRateSet;
 | 
				
			||||||
@@ -402,17 +402,17 @@ ClockRateSet (
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ClockEnable (
 | 
					ClockEnable (
 | 
				
			||||||
  IN SCMI_CLOCK2_PROTOCOL *This,
 | 
					  IN SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  IN UINT32               ClockId,
 | 
					  IN UINT32                ClockId,
 | 
				
			||||||
  IN BOOLEAN              Enable
 | 
					  IN BOOLEAN               Enable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                  Status;
 | 
					  EFI_STATUS                   Status;
 | 
				
			||||||
  CLOCK_CONFIG_SET_ATTRIBUTES *ClockConfigSetAttributes;
 | 
					  CLOCK_CONFIG_SET_ATTRIBUTES  *ClockConfigSetAttributes;
 | 
				
			||||||
  SCMI_COMMAND                Cmd;
 | 
					  SCMI_COMMAND                 Cmd;
 | 
				
			||||||
  UINT32                      PayloadLength;
 | 
					  UINT32                       PayloadLength;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload ((UINT32**)&ClockConfigSetAttributes);
 | 
					  Status = ScmiCommandGetPayload ((UINT32 **)&ClockConfigSetAttributes);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -437,17 +437,17 @@ ClockEnable (
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instance of the SCMI clock management protocol.
 | 
					// Instance of the SCMI clock management protocol.
 | 
				
			||||||
STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
 | 
					STATIC CONST SCMI_CLOCK_PROTOCOL  ScmiClockProtocol = {
 | 
				
			||||||
  ClockGetVersion,
 | 
					  ClockGetVersion,
 | 
				
			||||||
  ClockGetTotalClocks,
 | 
					  ClockGetTotalClocks,
 | 
				
			||||||
  ClockGetClockAttributes,
 | 
					  ClockGetClockAttributes,
 | 
				
			||||||
  ClockDescribeRates,
 | 
					  ClockDescribeRates,
 | 
				
			||||||
  ClockRateGet,
 | 
					  ClockRateGet,
 | 
				
			||||||
  ClockRateSet
 | 
					  ClockRateSet
 | 
				
			||||||
 };
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instance of the SCMI clock management protocol.
 | 
					// Instance of the SCMI clock management protocol.
 | 
				
			||||||
STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
 | 
					STATIC CONST SCMI_CLOCK2_PROTOCOL  ScmiClock2Protocol = {
 | 
				
			||||||
  (SCMI_CLOCK2_GET_VERSION)ClockGetVersion,
 | 
					  (SCMI_CLOCK2_GET_VERSION)ClockGetVersion,
 | 
				
			||||||
  (SCMI_CLOCK2_GET_TOTAL_CLOCKS)ClockGetTotalClocks,
 | 
					  (SCMI_CLOCK2_GET_TOTAL_CLOCKS)ClockGetTotalClocks,
 | 
				
			||||||
  (SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES)ClockGetClockAttributes,
 | 
					  (SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES)ClockGetClockAttributes,
 | 
				
			||||||
@@ -456,7 +456,7 @@ STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
 | 
				
			|||||||
  (SCMI_CLOCK2_RATE_SET)ClockRateSet,
 | 
					  (SCMI_CLOCK2_RATE_SET)ClockRateSet,
 | 
				
			||||||
  SCMI_CLOCK2_PROTOCOL_VERSION,
 | 
					  SCMI_CLOCK2_PROTOCOL_VERSION,
 | 
				
			||||||
  ClockEnable
 | 
					  ClockEnable
 | 
				
			||||||
 };
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Initialize clock management protocol and install protocol on a given handle.
 | 
					/** Initialize clock management protocol and install protocol on a given handle.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -466,7 +466,7 @@ STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiClockProtocolInit (
 | 
					ScmiClockProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE* Handle
 | 
					  IN EFI_HANDLE  *Handle
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return gBS->InstallMultipleProtocolInterfaces (
 | 
					  return gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,10 +23,10 @@
 | 
				
			|||||||
#include "ScmiDxe.h"
 | 
					#include "ScmiDxe.h"
 | 
				
			||||||
#include "ScmiPrivate.h"
 | 
					#include "ScmiPrivate.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC CONST SCMI_PROTOCOL_ENTRY Protocols[] = {
 | 
					STATIC CONST SCMI_PROTOCOL_ENTRY  Protocols[] = {
 | 
				
			||||||
  { ScmiProtocolIdBase, ScmiBaseProtocolInit },
 | 
					  { ScmiProtocolIdBase,        ScmiBaseProtocolInit        },
 | 
				
			||||||
  { ScmiProtocolIdPerformance, ScmiPerformanceProtocolInit },
 | 
					  { ScmiProtocolIdPerformance, ScmiPerformanceProtocolInit },
 | 
				
			||||||
  { ScmiProtocolIdClock, ScmiClockProtocolInit }
 | 
					  { ScmiProtocolIdClock,       ScmiClockProtocolInit       }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** ARM SCMI driver entry point function.
 | 
					/** ARM SCMI driver entry point function.
 | 
				
			||||||
@@ -47,8 +47,8 @@ STATIC CONST SCMI_PROTOCOL_ENTRY Protocols[] = {
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmScmiDxeEntryPoint (
 | 
					ArmScmiDxeEntryPoint (
 | 
				
			||||||
  IN EFI_HANDLE             ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE       *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS          Status;
 | 
					  EFI_STATUS          Status;
 | 
				
			||||||
@@ -72,7 +72,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
  Status = gBS->LocateProtocol (
 | 
					  Status = gBS->LocateProtocol (
 | 
				
			||||||
                  &gArmScmiBaseProtocolGuid,
 | 
					                  &gArmScmiBaseProtocolGuid,
 | 
				
			||||||
                  NULL,
 | 
					                  NULL,
 | 
				
			||||||
                  (VOID**)&BaseProtocol
 | 
					                  (VOID **)&BaseProtocol
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -96,7 +97,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
  // Apart from Base protocol, SCMI may implement various other protocols,
 | 
					  // Apart from Base protocol, SCMI may implement various other protocols,
 | 
				
			||||||
  // query total protocols implemented by the SCP firmware.
 | 
					  // query total protocols implemented by the SCP firmware.
 | 
				
			||||||
  NumProtocols = 0;
 | 
					  NumProtocols = 0;
 | 
				
			||||||
  Status = BaseProtocol->GetTotalProtocols (BaseProtocol, &NumProtocols);
 | 
					  Status       = BaseProtocol->GetTotalProtocols (BaseProtocol, &NumProtocols);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
@@ -109,7 +110,7 @@ ArmScmiDxeEntryPoint (
 | 
				
			|||||||
  Status = gBS->AllocatePool (
 | 
					  Status = gBS->AllocatePool (
 | 
				
			||||||
                  EfiBootServicesData,
 | 
					                  EfiBootServicesData,
 | 
				
			||||||
                  SupportedListSize,
 | 
					                  SupportedListSize,
 | 
				
			||||||
                  (VOID**)&SupportedList
 | 
					                  (VOID **)&SupportedList
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    ASSERT (FALSE);
 | 
					    ASSERT (FALSE);
 | 
				
			||||||
@@ -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,12 +8,13 @@
 | 
				
			|||||||
    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_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "ScmiPrivate.h"
 | 
					#include "ScmiPrivate.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_VENDOR_LEN       SCMI_MAX_STR_LEN
 | 
					#define MAX_VENDOR_LEN  SCMI_MAX_STR_LEN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Pointer to protocol initialization function.
 | 
					/** Pointer to protocol initialization function.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,8 +30,8 @@ EFI_STATUS
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  SCMI_PROTOCOL_ID Id;            // Protocol Id.
 | 
					  SCMI_PROTOCOL_ID          Id;     // Protocol Id.
 | 
				
			||||||
  SCMI_PROTOCOL_INIT_FXN InitFn;  // Protocol init function.
 | 
					  SCMI_PROTOCOL_INIT_FXN    InitFn; // Protocol init function.
 | 
				
			||||||
} SCMI_PROTOCOL_ENTRY;
 | 
					} SCMI_PROTOCOL_ENTRY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* SCMI_DXE_H_ */
 | 
					#endif /* SCMI_DXE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,12 +51,12 @@ PerformanceGetVersion (
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
PerformanceGetAttributes (
 | 
					PerformanceGetAttributes (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL              *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL             *This,
 | 
				
			||||||
  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes
 | 
					  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES  *Attributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINT32* ReturnValues;
 | 
					  UINT32      *ReturnValues;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiGetProtocolAttributes (
 | 
					  Status = ScmiGetProtocolAttributes (
 | 
				
			||||||
             ScmiProtocolIdPerformance,
 | 
					             ScmiProtocolIdPerformance,
 | 
				
			||||||
@@ -90,7 +90,7 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
PerformanceDomainAttributes (
 | 
					PerformanceDomainAttributes (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL           *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL           *This,
 | 
				
			||||||
  IN  UINT32                               DomainId,
 | 
					  IN  UINT32                              DomainId,
 | 
				
			||||||
  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
 | 
					  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -160,21 +160,21 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
  UINT32        PayloadLength;
 | 
					  UINT32        PayloadLength;
 | 
				
			||||||
  SCMI_COMMAND  Cmd;
 | 
					  SCMI_COMMAND  Cmd;
 | 
				
			||||||
  UINT32*       MessageParams;
 | 
					  UINT32        *MessageParams;
 | 
				
			||||||
  UINT32        LevelIndex;
 | 
					  UINT32        LevelIndex;
 | 
				
			||||||
  UINT32        RequiredSize;
 | 
					  UINT32        RequiredSize;
 | 
				
			||||||
  UINT32        LevelNo;
 | 
					  UINT32        LevelNo;
 | 
				
			||||||
  UINT32        ReturnNumLevels;
 | 
					  UINT32        ReturnNumLevels;
 | 
				
			||||||
  UINT32        ReturnRemainNumLevels;
 | 
					  UINT32        ReturnRemainNumLevels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PERF_DESCRIBE_LEVELS *Levels;
 | 
					  PERF_DESCRIBE_LEVELS  *Levels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = ScmiCommandGetPayload (&MessageParams);
 | 
					  Status = ScmiCommandGetPayload (&MessageParams);
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LevelIndex = 0;
 | 
					  LevelIndex   = 0;
 | 
				
			||||||
  RequiredSize = 0;
 | 
					  RequiredSize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *MessageParams++ = DomainId;
 | 
					  *MessageParams++ = DomainId;
 | 
				
			||||||
@@ -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.
 | 
				
			||||||
@@ -192,13 +191,13 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
    Status = ScmiCommandExecute (
 | 
					    Status = ScmiCommandExecute (
 | 
				
			||||||
               &Cmd,
 | 
					               &Cmd,
 | 
				
			||||||
               &PayloadLength,
 | 
					               &PayloadLength,
 | 
				
			||||||
               (UINT32**)&Levels
 | 
					               (UINT32 **)&Levels
 | 
				
			||||||
               );
 | 
					               );
 | 
				
			||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ReturnNumLevels = NUM_PERF_LEVELS (Levels->NumLevels);
 | 
					    ReturnNumLevels       = NUM_PERF_LEVELS (Levels->NumLevels);
 | 
				
			||||||
    ReturnRemainNumLevels = NUM_REMAIN_PERF_LEVELS (Levels->NumLevels);
 | 
					    ReturnRemainNumLevels = NUM_REMAIN_PERF_LEVELS (Levels->NumLevels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (RequiredSize == 0) {
 | 
					    if (RequiredSize == 0) {
 | 
				
			||||||
@@ -213,13 +212,12 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (LevelNo = 0; LevelNo < ReturnNumLevels; LevelNo++) {
 | 
					    for (LevelNo = 0; LevelNo < ReturnNumLevels; LevelNo++) {
 | 
				
			||||||
       CopyMem (
 | 
					      CopyMem (
 | 
				
			||||||
         &LevelArray[LevelIndex++],
 | 
					        &LevelArray[LevelIndex++],
 | 
				
			||||||
         &Levels->PerfLevel[LevelNo],
 | 
					        &Levels->PerfLevel[LevelNo],
 | 
				
			||||||
         sizeof (SCMI_PERFORMANCE_LEVEL)
 | 
					        sizeof (SCMI_PERFORMANCE_LEVEL)
 | 
				
			||||||
         );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  } while (ReturnRemainNumLevels != 0);
 | 
					  } while (ReturnRemainNumLevels != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *LevelArraySize = RequiredSize;
 | 
					  *LevelArraySize = RequiredSize;
 | 
				
			||||||
@@ -239,9 +237,9 @@ PerformanceDescribeLevels (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
PerformanceLimitsSet (
 | 
					PerformanceLimitsSet (
 | 
				
			||||||
  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  IN UINT32                    DomainId,
 | 
					  IN UINT32                     DomainId,
 | 
				
			||||||
  IN SCMI_PERFORMANCE_LIMITS   *Limits
 | 
					  IN SCMI_PERFORMANCE_LIMITS    *Limits
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
@@ -285,9 +283,9 @@ PerformanceLimitsSet (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
PerformanceLimitsGet (
 | 
					PerformanceLimitsGet (
 | 
				
			||||||
  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  UINT32                    DomainId,
 | 
					  UINT32                     DomainId,
 | 
				
			||||||
  SCMI_PERFORMANCE_LIMITS   *Limits
 | 
					  SCMI_PERFORMANCE_LIMITS    *Limits
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
@@ -312,7 +310,7 @@ PerformanceLimitsGet (
 | 
				
			|||||||
  Status = ScmiCommandExecute (
 | 
					  Status = ScmiCommandExecute (
 | 
				
			||||||
             &Cmd,
 | 
					             &Cmd,
 | 
				
			||||||
             &PayloadLength,
 | 
					             &PayloadLength,
 | 
				
			||||||
             (UINT32**)&ReturnValues
 | 
					             (UINT32 **)&ReturnValues
 | 
				
			||||||
             );
 | 
					             );
 | 
				
			||||||
  if (EFI_ERROR (Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    return Status;
 | 
					    return Status;
 | 
				
			||||||
@@ -336,9 +334,9 @@ PerformanceLimitsGet (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
PerformanceLevelSet (
 | 
					PerformanceLevelSet (
 | 
				
			||||||
  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  IN UINT32                    DomainId,
 | 
					  IN UINT32                     DomainId,
 | 
				
			||||||
  IN UINT32                    Level
 | 
					  IN UINT32                     Level
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
@@ -381,9 +379,9 @@ PerformanceLevelSet (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
PerformanceLevelGet (
 | 
					PerformanceLevelGet (
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32                    DomainId,
 | 
					  IN  UINT32                     DomainId,
 | 
				
			||||||
  OUT UINT32                    *Level
 | 
					  OUT UINT32                     *Level
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
@@ -419,7 +417,7 @@ PerformanceLevelGet (
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Instance of the SCMI performance management protocol.
 | 
					// Instance of the SCMI performance management protocol.
 | 
				
			||||||
STATIC CONST SCMI_PERFORMANCE_PROTOCOL PerformanceProtocol = {
 | 
					STATIC CONST SCMI_PERFORMANCE_PROTOCOL  PerformanceProtocol = {
 | 
				
			||||||
  PerformanceGetVersion,
 | 
					  PerformanceGetVersion,
 | 
				
			||||||
  PerformanceGetAttributes,
 | 
					  PerformanceGetAttributes,
 | 
				
			||||||
  PerformanceDomainAttributes,
 | 
					  PerformanceDomainAttributes,
 | 
				
			||||||
@@ -439,7 +437,7 @@ STATIC CONST SCMI_PERFORMANCE_PROTOCOL PerformanceProtocol = {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiPerformanceProtocolInit (
 | 
					ScmiPerformanceProtocolInit (
 | 
				
			||||||
  IN EFI_HANDLE* Handle
 | 
					  IN EFI_HANDLE  *Handle
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return gBS->InstallMultipleProtocolInterfaces (
 | 
					  return gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,21 +53,21 @@ typedef enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Not defined in SCMI specification but will help to identify a message.
 | 
					// Not defined in SCMI specification but will help to identify a message.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  SCMI_PROTOCOL_ID ProtocolId;
 | 
					  SCMI_PROTOCOL_ID    ProtocolId;
 | 
				
			||||||
  UINT32 MessageId;
 | 
					  UINT32              MessageId;
 | 
				
			||||||
} SCMI_COMMAND;
 | 
					} SCMI_COMMAND;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(1)
 | 
					#pragma pack(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Response to a SCMI command.
 | 
					// Response to a SCMI command.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  INT32 Status;
 | 
					  INT32     Status;
 | 
				
			||||||
  UINT32 ReturnValues[];
 | 
					  UINT32    ReturnValues[];
 | 
				
			||||||
} SCMI_MESSAGE_RESPONSE;
 | 
					} SCMI_MESSAGE_RESPONSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Message header. MsgId[7:0], MsgType[9:8], ProtocolId[17:10]
 | 
					// Message header. MsgId[7:0], MsgType[9:8], ProtocolId[17:10]
 | 
				
			||||||
#define MESSAGE_TYPE_SHIFT       8
 | 
					#define MESSAGE_TYPE_SHIFT  8
 | 
				
			||||||
#define PROTOCOL_ID_SHIFT       10
 | 
					#define PROTOCOL_ID_SHIFT   10
 | 
				
			||||||
#define SCMI_MESSAGE_HEADER(MsgId, MsgType, ProtocolId)  (           \
 | 
					#define SCMI_MESSAGE_HEADER(MsgId, MsgType, ProtocolId)  (           \
 | 
				
			||||||
                            MsgType << MESSAGE_TYPE_SHIFT   |        \
 | 
					                            MsgType << MESSAGE_TYPE_SHIFT   |        \
 | 
				
			||||||
                            ProtocolId << PROTOCOL_ID_SHIFT |        \
 | 
					                            ProtocolId << PROTOCOL_ID_SHIFT |        \
 | 
				
			||||||
@@ -74,7 +75,7 @@ typedef struct {
 | 
				
			|||||||
                            )
 | 
					                            )
 | 
				
			||||||
// SCMI message header.
 | 
					// SCMI message header.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 MessageHeader;
 | 
					  UINT32    MessageHeader;
 | 
				
			||||||
} SCMI_MESSAGE_HEADER;
 | 
					} SCMI_MESSAGE_HEADER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack()
 | 
					#pragma pack()
 | 
				
			||||||
@@ -89,7 +90,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ScmiCommandGetPayload (
 | 
					ScmiCommandGetPayload (
 | 
				
			||||||
  OUT UINT32** Payload
 | 
					  OUT UINT32  **Payload
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Execute a SCMI command and receive a response.
 | 
					/** Execute a SCMI command and receive a response.
 | 
				
			||||||
@@ -115,7 +116,7 @@ EFI_STATUS
 | 
				
			|||||||
ScmiCommandExecute (
 | 
					ScmiCommandExecute (
 | 
				
			||||||
  IN     SCMI_COMMAND  *Command,
 | 
					  IN     SCMI_COMMAND  *Command,
 | 
				
			||||||
  IN OUT UINT32        *PayloadLength,
 | 
					  IN OUT UINT32        *PayloadLength,
 | 
				
			||||||
  OUT    UINT32       **ReturnValues OPTIONAL
 | 
					  OUT    UINT32        **ReturnValues OPTIONAL
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Return protocol version from SCP for a given protocol ID.
 | 
					/** Return protocol version from SCP for a given protocol ID.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			|||||||
#include <Library/MemoryAllocationLib.h>
 | 
					#include <Library/MemoryAllocationLib.h>
 | 
				
			||||||
#include "CpuDxe.h"
 | 
					#include "CpuDxe.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define INVALID_ENTRY   ((UINT32)~0)
 | 
					#define INVALID_ENTRY  ((UINT32)~0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MIN_T0SZ        16
 | 
					#define MIN_T0SZ        16
 | 
				
			||||||
#define BITS_PER_LEVEL  9
 | 
					#define BITS_PER_LEVEL  9
 | 
				
			||||||
@@ -21,49 +21,52 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
GetRootTranslationTableInfo (
 | 
					GetRootTranslationTableInfo (
 | 
				
			||||||
  IN  UINTN     T0SZ,
 | 
					  IN  UINTN  T0SZ,
 | 
				
			||||||
  OUT UINTN     *RootTableLevel,
 | 
					  OUT UINTN  *RootTableLevel,
 | 
				
			||||||
  OUT UINTN     *RootTableEntryCount
 | 
					  OUT UINTN  *RootTableEntryCount
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  *RootTableLevel       = (T0SZ - MIN_T0SZ) / BITS_PER_LEVEL;
 | 
					  *RootTableLevel      = (T0SZ - MIN_T0SZ) / BITS_PER_LEVEL;
 | 
				
			||||||
  *RootTableEntryCount  = TT_ENTRY_COUNT >> (T0SZ - MIN_T0SZ) % BITS_PER_LEVEL;
 | 
					  *RootTableEntryCount = TT_ENTRY_COUNT >> (T0SZ - MIN_T0SZ) % BITS_PER_LEVEL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
PageAttributeToGcdAttribute (
 | 
					PageAttributeToGcdAttribute (
 | 
				
			||||||
  IN UINT64 PageAttributes
 | 
					  IN UINT64  PageAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64  GcdAttributes;
 | 
					  UINT64  GcdAttributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (PageAttributes & TT_ATTR_INDX_MASK) {
 | 
					  switch (PageAttributes & TT_ATTR_INDX_MASK) {
 | 
				
			||||||
  case TT_ATTR_INDX_DEVICE_MEMORY:
 | 
					    case TT_ATTR_INDX_DEVICE_MEMORY:
 | 
				
			||||||
    GcdAttributes = EFI_MEMORY_UC;
 | 
					      GcdAttributes = EFI_MEMORY_UC;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
  case TT_ATTR_INDX_MEMORY_NON_CACHEABLE:
 | 
					    case TT_ATTR_INDX_MEMORY_NON_CACHEABLE:
 | 
				
			||||||
    GcdAttributes = EFI_MEMORY_WC;
 | 
					      GcdAttributes = EFI_MEMORY_WC;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
  case TT_ATTR_INDX_MEMORY_WRITE_THROUGH:
 | 
					    case TT_ATTR_INDX_MEMORY_WRITE_THROUGH:
 | 
				
			||||||
    GcdAttributes = EFI_MEMORY_WT;
 | 
					      GcdAttributes = EFI_MEMORY_WT;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
  case TT_ATTR_INDX_MEMORY_WRITE_BACK:
 | 
					    case TT_ATTR_INDX_MEMORY_WRITE_BACK:
 | 
				
			||||||
    GcdAttributes = EFI_MEMORY_WB;
 | 
					      GcdAttributes = EFI_MEMORY_WB;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
  default:
 | 
					    default:
 | 
				
			||||||
    DEBUG ((DEBUG_ERROR,
 | 
					      DEBUG ((
 | 
				
			||||||
      "PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
 | 
					        DEBUG_ERROR,
 | 
				
			||||||
      PageAttributes));
 | 
					        "PageAttributeToGcdAttribute: PageAttributes:0x%lX not supported.\n",
 | 
				
			||||||
    ASSERT (0);
 | 
					        PageAttributes
 | 
				
			||||||
    // The Global Coherency Domain (GCD) value is defined as a bit set.
 | 
					        ));
 | 
				
			||||||
    // Returning 0 means no attribute has been set.
 | 
					      ASSERT (0);
 | 
				
			||||||
    GcdAttributes = 0;
 | 
					      // The Global Coherency Domain (GCD) value is defined as a bit set.
 | 
				
			||||||
 | 
					      // Returning 0 means no attribute has been set.
 | 
				
			||||||
 | 
					      GcdAttributes = 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -80,19 +83,19 @@ STATIC
 | 
				
			|||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
GetFirstPageAttribute (
 | 
					GetFirstPageAttribute (
 | 
				
			||||||
  IN UINT64  *FirstLevelTableAddress,
 | 
					  IN UINT64  *FirstLevelTableAddress,
 | 
				
			||||||
  IN UINTN    TableLevel
 | 
					  IN UINTN   TableLevel
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64 FirstEntry;
 | 
					  UINT64  FirstEntry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 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
 | 
				
			||||||
    return GetFirstPageAttribute ((UINT64*)(FirstEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), TableLevel + 1);
 | 
					    return GetFirstPageAttribute ((UINT64 *)(FirstEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE), TableLevel + 1);
 | 
				
			||||||
  } else if (((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY) ||
 | 
					  } else if (((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY) ||
 | 
				
			||||||
             ((TableLevel == 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
 | 
					             ((TableLevel == 3) && ((FirstEntry & TT_TYPE_MASK) == TT_TYPE_BLOCK_ENTRY_LEVEL3)))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -105,25 +108,25 @@ GetFirstPageAttribute (
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
GetNextEntryAttribute (
 | 
					GetNextEntryAttribute (
 | 
				
			||||||
  IN     UINT64 *TableAddress,
 | 
					  IN     UINT64  *TableAddress,
 | 
				
			||||||
  IN     UINTN   EntryCount,
 | 
					  IN     UINTN   EntryCount,
 | 
				
			||||||
  IN     UINTN   TableLevel,
 | 
					  IN     UINTN   TableLevel,
 | 
				
			||||||
  IN     UINT64  BaseAddress,
 | 
					  IN     UINT64  BaseAddress,
 | 
				
			||||||
  IN OUT UINT32 *PrevEntryAttribute,
 | 
					  IN OUT UINT32  *PrevEntryAttribute,
 | 
				
			||||||
  IN OUT UINT64 *StartGcdRegion
 | 
					  IN OUT UINT64  *StartGcdRegion
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN                             Index;
 | 
					  UINTN                            Index;
 | 
				
			||||||
  UINT64                            Entry;
 | 
					  UINT64                           Entry;
 | 
				
			||||||
  UINT32                            EntryAttribute;
 | 
					  UINT32                           EntryAttribute;
 | 
				
			||||||
  UINT32                            EntryType;
 | 
					  UINT32                           EntryType;
 | 
				
			||||||
  EFI_STATUS                        Status;
 | 
					  EFI_STATUS                       Status;
 | 
				
			||||||
  UINTN                             NumberOfDescriptors;
 | 
					  UINTN                            NumberOfDescriptors;
 | 
				
			||||||
  EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap;
 | 
					  EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get the memory space map from GCD
 | 
					  // Get the memory space map from GCD
 | 
				
			||||||
  MemorySpaceMap = NULL;
 | 
					  MemorySpaceMap = NULL;
 | 
				
			||||||
  Status = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
 | 
					  Status         = gDS->GetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // We cannot get more than 3-level page table
 | 
					  // We cannot get more than 3-level page table
 | 
				
			||||||
@@ -132,24 +135,28 @@ GetNextEntryAttribute (
 | 
				
			|||||||
  // While the top level table might not contain TT_ENTRY_COUNT entries;
 | 
					  // While the top level table might not contain TT_ENTRY_COUNT entries;
 | 
				
			||||||
  // the subsequent ones should be filled up
 | 
					  // the subsequent ones should be filled up
 | 
				
			||||||
  for (Index = 0; Index < EntryCount; Index++) {
 | 
					  for (Index = 0; Index < EntryCount; Index++) {
 | 
				
			||||||
    Entry = TableAddress[Index];
 | 
					    Entry          = TableAddress[Index];
 | 
				
			||||||
    EntryType = Entry & TT_TYPE_MASK;
 | 
					    EntryType      = Entry & TT_TYPE_MASK;
 | 
				
			||||||
    EntryAttribute = Entry  & TT_ATTR_INDX_MASK;
 | 
					    EntryAttribute = Entry  & TT_ATTR_INDX_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 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 (
 | 
				
			||||||
              *StartGcdRegion,
 | 
					            MemorySpaceMap,
 | 
				
			||||||
              (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
 | 
					            NumberOfDescriptors,
 | 
				
			||||||
              PageAttributeToGcdAttribute (*PrevEntryAttribute));
 | 
					            *StartGcdRegion,
 | 
				
			||||||
 | 
					            (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
 | 
				
			||||||
 | 
					            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));
 | 
				
			||||||
        *PrevEntryAttribute = EntryAttribute;
 | 
					        *PrevEntryAttribute = EntryAttribute;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
@@ -159,20 +166,27 @@ 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),
 | 
				
			||||||
                             (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))),
 | 
					        TT_ENTRY_COUNT,
 | 
				
			||||||
                             PrevEntryAttribute, StartGcdRegion);
 | 
					        TableLevel + 1,
 | 
				
			||||||
 | 
					        (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))),
 | 
				
			||||||
 | 
					        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 (
 | 
				
			||||||
            *StartGcdRegion,
 | 
					          MemorySpaceMap,
 | 
				
			||||||
            (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL(TableLevel))) - *StartGcdRegion,
 | 
					          NumberOfDescriptors,
 | 
				
			||||||
            PageAttributeToGcdAttribute (*PrevEntryAttribute));
 | 
					          *StartGcdRegion,
 | 
				
			||||||
 | 
					          (BaseAddress + (Index * TT_ADDRESS_AT_LEVEL (TableLevel))) - *StartGcdRegion,
 | 
				
			||||||
 | 
					          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));
 | 
				
			||||||
        *PrevEntryAttribute = INVALID_ENTRY;
 | 
					        *PrevEntryAttribute = INVALID_ENTRY;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -180,25 +194,25 @@ GetNextEntryAttribute (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  FreePool (MemorySpaceMap);
 | 
					  FreePool (MemorySpaceMap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return BaseAddress + (EntryCount * TT_ADDRESS_AT_LEVEL(TableLevel));
 | 
					  return BaseAddress + (EntryCount * TT_ADDRESS_AT_LEVEL (TableLevel));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SyncCacheConfig (
 | 
					SyncCacheConfig (
 | 
				
			||||||
  IN  EFI_CPU_ARCH_PROTOCOL *CpuProtocol
 | 
					  IN  EFI_CPU_ARCH_PROTOCOL  *CpuProtocol
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                          Status;
 | 
					  EFI_STATUS                       Status;
 | 
				
			||||||
  UINT32                              PageAttribute;
 | 
					  UINT32                           PageAttribute;
 | 
				
			||||||
  UINT64                             *FirstLevelTableAddress;
 | 
					  UINT64                           *FirstLevelTableAddress;
 | 
				
			||||||
  UINTN                               TableLevel;
 | 
					  UINTN                            TableLevel;
 | 
				
			||||||
  UINTN                               TableCount;
 | 
					  UINTN                            TableCount;
 | 
				
			||||||
  UINTN                               NumberOfDescriptors;
 | 
					  UINTN                            NumberOfDescriptors;
 | 
				
			||||||
  EFI_GCD_MEMORY_SPACE_DESCRIPTOR    *MemorySpaceMap;
 | 
					  EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap;
 | 
				
			||||||
  UINTN                               Tcr;
 | 
					  UINTN                            Tcr;
 | 
				
			||||||
  UINTN                               T0SZ;
 | 
					  UINTN                            T0SZ;
 | 
				
			||||||
  UINT64                              BaseAddressGcdRegion;
 | 
					  UINT64                           BaseAddressGcdRegion;
 | 
				
			||||||
  UINT64                              EndAddressGcdRegion;
 | 
					  UINT64                           EndAddressGcdRegion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // This code assumes MMU is enabled and filed with section translations
 | 
					  // This code assumes MMU is enabled and filed with section translations
 | 
				
			||||||
  ASSERT (ArmMmuEnabled ());
 | 
					  ASSERT (ArmMmuEnabled ());
 | 
				
			||||||
@@ -207,7 +221,7 @@ SyncCacheConfig (
 | 
				
			|||||||
  // Get the memory space map from GCD
 | 
					  // Get the memory space map from GCD
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  MemorySpaceMap = NULL;
 | 
					  MemorySpaceMap = NULL;
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -217,7 +231,7 @@ SyncCacheConfig (
 | 
				
			|||||||
  // with a way for GCD to query the CPU Arch. driver of the existing memory space attributes instead.
 | 
					  // with a way for GCD to query the CPU Arch. driver of the existing memory space attributes instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Obtain page table base
 | 
					  // Obtain page table base
 | 
				
			||||||
  FirstLevelTableAddress = (UINT64*)(ArmGetTTBR0BaseAddress ());
 | 
					  FirstLevelTableAddress = (UINT64 *)(ArmGetTTBR0BaseAddress ());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get Translation Control Register value
 | 
					  // Get Translation Control Register value
 | 
				
			||||||
  Tcr = ArmGetTCR ();
 | 
					  Tcr = ArmGetTCR ();
 | 
				
			||||||
@@ -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,
 | 
				
			||||||
                                               BaseAddressGcdRegion,
 | 
					                           TableCount,
 | 
				
			||||||
                                               &PageAttribute, &BaseAddressGcdRegion);
 | 
					                           TableLevel,
 | 
				
			||||||
 | 
					                           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 (
 | 
				
			||||||
        BaseAddressGcdRegion,
 | 
					      MemorySpaceMap,
 | 
				
			||||||
        EndAddressGcdRegion - BaseAddressGcdRegion,
 | 
					      NumberOfDescriptors,
 | 
				
			||||||
        PageAttributeToGcdAttribute (PageAttribute));
 | 
					      BaseAddressGcdRegion,
 | 
				
			||||||
 | 
					      EndAddressGcdRegion - BaseAddressGcdRegion,
 | 
				
			||||||
 | 
					      PageAttributeToGcdAttribute (PageAttribute)
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  FreePool (MemorySpaceMap);
 | 
					  FreePool (MemorySpaceMap);
 | 
				
			||||||
@@ -252,30 +273,31 @@ SyncCacheConfig (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
EfiAttributeToArmAttribute (
 | 
					EfiAttributeToArmAttribute (
 | 
				
			||||||
  IN UINT64                    EfiAttributes
 | 
					  IN UINT64  EfiAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64 ArmAttributes;
 | 
					  UINT64  ArmAttributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) {
 | 
					  switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) {
 | 
				
			||||||
  case EFI_MEMORY_UC:
 | 
					    case EFI_MEMORY_UC:
 | 
				
			||||||
    if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
					      if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
				
			||||||
      ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_XN_MASK;
 | 
					        ArmAttributes = TT_ATTR_INDX_DEVICE_MEMORY | TT_XN_MASK;
 | 
				
			||||||
    } 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;
 | 
					
 | 
				
			||||||
  case EFI_MEMORY_WC:
 | 
					      break;
 | 
				
			||||||
    ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
 | 
					    case EFI_MEMORY_WC:
 | 
				
			||||||
    break;
 | 
					      ArmAttributes = TT_ATTR_INDX_MEMORY_NON_CACHEABLE;
 | 
				
			||||||
  case EFI_MEMORY_WT:
 | 
					      break;
 | 
				
			||||||
    ArmAttributes = TT_ATTR_INDX_MEMORY_WRITE_THROUGH | TT_SH_INNER_SHAREABLE;
 | 
					    case EFI_MEMORY_WT:
 | 
				
			||||||
    break;
 | 
					      ArmAttributes = TT_ATTR_INDX_MEMORY_WRITE_THROUGH | TT_SH_INNER_SHAREABLE;
 | 
				
			||||||
  case EFI_MEMORY_WB:
 | 
					      break;
 | 
				
			||||||
    ArmAttributes = TT_ATTR_INDX_MEMORY_WRITE_BACK | TT_SH_INNER_SHAREABLE;
 | 
					    case EFI_MEMORY_WB:
 | 
				
			||||||
    break;
 | 
					      ArmAttributes = TT_ATTR_INDX_MEMORY_WRITE_BACK | TT_SH_INNER_SHAREABLE;
 | 
				
			||||||
  default:
 | 
					      break;
 | 
				
			||||||
    ArmAttributes = TT_ATTR_INDX_MASK;
 | 
					    default:
 | 
				
			||||||
 | 
					      ArmAttributes = TT_ATTR_INDX_MASK;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Set the access flag to match the block attributes
 | 
					  // Set the access flag to match the block attributes
 | 
				
			||||||
@@ -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
 | 
				
			||||||
@@ -298,19 +320,19 @@ EfiAttributeToArmAttribute (
 | 
				
			|||||||
// And then the function will identify the size of the region that has the same page table attribute.
 | 
					// And then the function will identify the size of the region that has the same page table attribute.
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetMemoryRegionRec (
 | 
					GetMemoryRegionRec (
 | 
				
			||||||
  IN     UINT64                  *TranslationTable,
 | 
					  IN     UINT64  *TranslationTable,
 | 
				
			||||||
  IN     UINTN                    TableLevel,
 | 
					  IN     UINTN   TableLevel,
 | 
				
			||||||
  IN     UINT64                  *LastBlockEntry,
 | 
					  IN     UINT64  *LastBlockEntry,
 | 
				
			||||||
  IN OUT UINTN                   *BaseAddress,
 | 
					  IN OUT UINTN   *BaseAddress,
 | 
				
			||||||
  OUT    UINTN                   *RegionLength,
 | 
					  OUT    UINTN   *RegionLength,
 | 
				
			||||||
  OUT    UINTN                   *RegionAttributes
 | 
					  OUT    UINTN   *RegionAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINT64    *NextTranslationTable;
 | 
					  UINT64      *NextTranslationTable;
 | 
				
			||||||
  UINT64    *BlockEntry;
 | 
					  UINT64      *BlockEntry;
 | 
				
			||||||
  UINT64     BlockEntryType;
 | 
					  UINT64      BlockEntryType;
 | 
				
			||||||
  UINT64     EntryType;
 | 
					  UINT64      EntryType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (TableLevel != 3) {
 | 
					  if (TableLevel != 3) {
 | 
				
			||||||
    BlockEntryType = TT_TYPE_BLOCK_ENTRY;
 | 
					    BlockEntryType = TT_TYPE_BLOCK_ENTRY;
 | 
				
			||||||
@@ -319,22 +341,25 @@ GetMemoryRegionRec (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Find the block entry linked to the Base Address
 | 
					  // Find the block entry linked to the Base Address
 | 
				
			||||||
  BlockEntry = (UINT64*)TT_GET_ENTRY_FOR_ADDRESS (TranslationTable, TableLevel, *BaseAddress);
 | 
					  BlockEntry = (UINT64 *)TT_GET_ENTRY_FOR_ADDRESS (TranslationTable, TableLevel, *BaseAddress);
 | 
				
			||||||
  EntryType = *BlockEntry & TT_TYPE_MASK;
 | 
					  EntryType  = *BlockEntry & TT_TYPE_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((TableLevel < 3) && (EntryType == TT_TYPE_TABLE_ENTRY)) {
 | 
					  if ((TableLevel < 3) && (EntryType == TT_TYPE_TABLE_ENTRY)) {
 | 
				
			||||||
    NextTranslationTable = (UINT64*)(*BlockEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE);
 | 
					    NextTranslationTable = (UINT64 *)(*BlockEntry & TT_ADDRESS_MASK_DESCRIPTION_TABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The entry is a page table, so we go to the next level
 | 
					    // The entry is a page table, so we go to the next level
 | 
				
			||||||
    Status = GetMemoryRegionRec (
 | 
					    Status = 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
 | 
				
			||||||
    if (!EFI_ERROR(Status)) {
 | 
					    if (!EFI_ERROR (Status)) {
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -343,7 +368,7 @@ GetMemoryRegionRec (
 | 
				
			|||||||
  } else if (EntryType == BlockEntryType) {
 | 
					  } else if (EntryType == BlockEntryType) {
 | 
				
			||||||
    // We have found the BlockEntry attached to the address. We save its start address (the start
 | 
					    // We have found the BlockEntry attached to the address. We save its start address (the start
 | 
				
			||||||
    // address might be before the 'BaseAddress') and attributes
 | 
					    // address might be before the 'BaseAddress') and attributes
 | 
				
			||||||
    *BaseAddress      = *BaseAddress & ~(TT_ADDRESS_AT_LEVEL(TableLevel) - 1);
 | 
					    *BaseAddress      = *BaseAddress & ~(TT_ADDRESS_AT_LEVEL (TableLevel) - 1);
 | 
				
			||||||
    *RegionLength     = 0;
 | 
					    *RegionLength     = 0;
 | 
				
			||||||
    *RegionAttributes = *BlockEntry & TT_ATTRIBUTES_MASK;
 | 
					    *RegionAttributes = *BlockEntry & TT_ATTRIBUTES_MASK;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
@@ -353,11 +378,12 @@ GetMemoryRegionRec (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  while (BlockEntry <= LastBlockEntry) {
 | 
					  while (BlockEntry <= LastBlockEntry) {
 | 
				
			||||||
    if ((*BlockEntry & TT_ATTRIBUTES_MASK) == *RegionAttributes) {
 | 
					    if ((*BlockEntry & TT_ATTRIBUTES_MASK) == *RegionAttributes) {
 | 
				
			||||||
      *RegionLength = *RegionLength + TT_BLOCK_ENTRY_SIZE_AT_LEVEL(TableLevel);
 | 
					      *RegionLength = *RegionLength + TT_BLOCK_ENTRY_SIZE_AT_LEVEL (TableLevel);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // 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++;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -369,13 +395,13 @@ GetMemoryRegionRec (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetMemoryRegion (
 | 
					GetMemoryRegion (
 | 
				
			||||||
  IN OUT UINTN                   *BaseAddress,
 | 
					  IN OUT UINTN  *BaseAddress,
 | 
				
			||||||
  OUT    UINTN                   *RegionLength,
 | 
					  OUT    UINTN  *RegionLength,
 | 
				
			||||||
  OUT    UINTN                   *RegionAttributes
 | 
					  OUT    UINTN  *RegionAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINT64     *TranslationTable;
 | 
					  UINT64      *TranslationTable;
 | 
				
			||||||
  UINTN       TableLevel;
 | 
					  UINTN       TableLevel;
 | 
				
			||||||
  UINTN       EntryCount;
 | 
					  UINTN       EntryCount;
 | 
				
			||||||
  UINTN       T0SZ;
 | 
					  UINTN       T0SZ;
 | 
				
			||||||
@@ -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 (
 | 
				
			||||||
      (UINTN*)TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount),
 | 
					             TranslationTable,
 | 
				
			||||||
      BaseAddress, RegionLength, RegionAttributes);
 | 
					             TableLevel,
 | 
				
			||||||
 | 
					             (UINTN *)TT_LAST_BLOCK_ADDRESS (TranslationTable, EntryCount),
 | 
				
			||||||
 | 
					             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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ SectionToGcdAttributes (
 | 
				
			|||||||
  *GcdAttributes = 0;
 | 
					  *GcdAttributes = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine cacheability attributes
 | 
					  // determine cacheability attributes
 | 
				
			||||||
  switch(SectionAttributes & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) {
 | 
					  switch (SectionAttributes & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED:
 | 
					    case TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED:
 | 
				
			||||||
      *GcdAttributes |= EFI_MEMORY_UC;
 | 
					      *GcdAttributes |= EFI_MEMORY_UC;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
@@ -49,9 +49,9 @@ SectionToGcdAttributes (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine protection attributes
 | 
					  // determine protection attributes
 | 
				
			||||||
  switch(SectionAttributes & TT_DESCRIPTOR_SECTION_AP_MASK) {
 | 
					  switch (SectionAttributes & TT_DESCRIPTOR_SECTION_AP_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_SECTION_AP_NO_NO: // no read, no write
 | 
					    case TT_DESCRIPTOR_SECTION_AP_NO_NO: // no read, no write
 | 
				
			||||||
      //*GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
					      // *GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case TT_DESCRIPTOR_SECTION_AP_RW_NO:
 | 
					    case TT_DESCRIPTOR_SECTION_AP_RW_NO:
 | 
				
			||||||
@@ -86,7 +86,7 @@ PageToGcdAttributes (
 | 
				
			|||||||
  *GcdAttributes = 0;
 | 
					  *GcdAttributes = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine cacheability attributes
 | 
					  // determine cacheability attributes
 | 
				
			||||||
  switch(PageAttributes & TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) {
 | 
					  switch (PageAttributes & TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED:
 | 
					    case TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED:
 | 
				
			||||||
      *GcdAttributes |= EFI_MEMORY_UC;
 | 
					      *GcdAttributes |= EFI_MEMORY_UC;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
@@ -113,9 +113,9 @@ PageToGcdAttributes (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // determine protection attributes
 | 
					  // determine protection attributes
 | 
				
			||||||
  switch(PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {
 | 
					  switch (PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {
 | 
				
			||||||
    case TT_DESCRIPTOR_PAGE_AP_NO_NO: // no read, no write
 | 
					    case TT_DESCRIPTOR_PAGE_AP_NO_NO: // no read, no write
 | 
				
			||||||
      //*GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
					      // *GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_RP;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case TT_DESCRIPTOR_PAGE_AP_RW_NO:
 | 
					    case TT_DESCRIPTOR_PAGE_AP_RW_NO:
 | 
				
			||||||
@@ -143,43 +143,43 @@ PageToGcdAttributes (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SyncCacheConfigPage (
 | 
					SyncCacheConfigPage (
 | 
				
			||||||
  IN     UINT32                             SectionIndex,
 | 
					  IN     UINT32                           SectionIndex,
 | 
				
			||||||
  IN     UINT32                             FirstLevelDescriptor,
 | 
					  IN     UINT32                           FirstLevelDescriptor,
 | 
				
			||||||
  IN     UINTN                              NumberOfDescriptors,
 | 
					  IN     UINTN                            NumberOfDescriptors,
 | 
				
			||||||
  IN     EFI_GCD_MEMORY_SPACE_DESCRIPTOR    *MemorySpaceMap,
 | 
					  IN     EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap,
 | 
				
			||||||
  IN OUT EFI_PHYSICAL_ADDRESS               *NextRegionBase,
 | 
					  IN OUT EFI_PHYSICAL_ADDRESS             *NextRegionBase,
 | 
				
			||||||
  IN OUT UINT64                             *NextRegionLength,
 | 
					  IN OUT UINT64                           *NextRegionLength,
 | 
				
			||||||
  IN OUT UINT32                             *NextSectionAttributes
 | 
					  IN OUT UINT32                           *NextSectionAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                          Status;
 | 
					  EFI_STATUS                     Status;
 | 
				
			||||||
  UINT32                              i;
 | 
					  UINT32                         i;
 | 
				
			||||||
  volatile ARM_PAGE_TABLE_ENTRY       *SecondLevelTable;
 | 
					  volatile ARM_PAGE_TABLE_ENTRY  *SecondLevelTable;
 | 
				
			||||||
  UINT32                              NextPageAttributes;
 | 
					  UINT32                         NextPageAttributes;
 | 
				
			||||||
  UINT32                              PageAttributes;
 | 
					  UINT32                         PageAttributes;
 | 
				
			||||||
  UINT32                              BaseAddress;
 | 
					  UINT32                         BaseAddress;
 | 
				
			||||||
  UINT64                              GcdAttributes;
 | 
					  UINT64                         GcdAttributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Get the Base Address from FirstLevelDescriptor;
 | 
					  // Get the Base Address from FirstLevelDescriptor;
 | 
				
			||||||
  BaseAddress = TT_DESCRIPTOR_PAGE_BASE_ADDRESS(SectionIndex << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
					  BaseAddress = TT_DESCRIPTOR_PAGE_BASE_ADDRESS (SectionIndex << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Convert SectionAttributes into PageAttributes
 | 
					  // Convert SectionAttributes into PageAttributes
 | 
				
			||||||
  NextPageAttributes =
 | 
					  NextPageAttributes =
 | 
				
			||||||
      TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(*NextSectionAttributes,0) |
 | 
					    TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY (*NextSectionAttributes, 0) |
 | 
				
			||||||
      TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(*NextSectionAttributes);
 | 
					    TT_DESCRIPTOR_CONVERT_TO_PAGE_AP (*NextSectionAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // obtain page table base
 | 
					  // obtain page table base
 | 
				
			||||||
  SecondLevelTable = (ARM_PAGE_TABLE_ENTRY *)(FirstLevelDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
					  SecondLevelTable = (ARM_PAGE_TABLE_ENTRY *)(FirstLevelDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i=0; i < TRANSLATION_TABLE_PAGE_COUNT; i++) {
 | 
					  for (i = 0; i < TRANSLATION_TABLE_PAGE_COUNT; i++) {
 | 
				
			||||||
    if ((SecondLevelTable[i] & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) {
 | 
					    if ((SecondLevelTable[i] & TT_DESCRIPTOR_PAGE_TYPE_MASK) == TT_DESCRIPTOR_PAGE_TYPE_PAGE) {
 | 
				
			||||||
      // extract attributes (cacheability and permissions)
 | 
					      // extract attributes (cacheability and permissions)
 | 
				
			||||||
      PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK);
 | 
					      PageAttributes = SecondLevelTable[i] & (TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK | TT_DESCRIPTOR_PAGE_AP_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (NextPageAttributes == 0) {
 | 
					      if (NextPageAttributes == 0) {
 | 
				
			||||||
        // start on a new region
 | 
					        // start on a new region
 | 
				
			||||||
        *NextRegionLength = 0;
 | 
					        *NextRegionLength  = 0;
 | 
				
			||||||
        *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
 | 
					        *NextRegionBase    = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
 | 
				
			||||||
        NextPageAttributes = PageAttributes;
 | 
					        NextPageAttributes = PageAttributes;
 | 
				
			||||||
      } else if (PageAttributes != NextPageAttributes) {
 | 
					      } else if (PageAttributes != NextPageAttributes) {
 | 
				
			||||||
        // Convert Section Attributes into GCD Attributes
 | 
					        // Convert Section Attributes into GCD Attributes
 | 
				
			||||||
@@ -190,8 +190,8 @@ SyncCacheConfigPage (
 | 
				
			|||||||
        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, *NextRegionBase, *NextRegionLength, GcdAttributes);
 | 
					        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, *NextRegionBase, *NextRegionLength, GcdAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // start on a new region
 | 
					        // start on a new region
 | 
				
			||||||
        *NextRegionLength = 0;
 | 
					        *NextRegionLength  = 0;
 | 
				
			||||||
        *NextRegionBase = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
 | 
					        *NextRegionBase    = BaseAddress | (i << TT_DESCRIPTOR_PAGE_BASE_SHIFT);
 | 
				
			||||||
        NextPageAttributes = PageAttributes;
 | 
					        NextPageAttributes = PageAttributes;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else if (NextPageAttributes != 0) {
 | 
					    } else if (NextPageAttributes != 0) {
 | 
				
			||||||
@@ -202,37 +202,37 @@ SyncCacheConfigPage (
 | 
				
			|||||||
      // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK)
 | 
					      // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK)
 | 
				
			||||||
      SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, *NextRegionBase, *NextRegionLength, GcdAttributes);
 | 
					      SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, *NextRegionBase, *NextRegionLength, GcdAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      *NextRegionLength = 0;
 | 
					      *NextRegionLength  = 0;
 | 
				
			||||||
      *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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Convert back PageAttributes into SectionAttributes
 | 
					  // Convert back PageAttributes into SectionAttributes
 | 
				
			||||||
  *NextSectionAttributes =
 | 
					  *NextSectionAttributes =
 | 
				
			||||||
      TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(NextPageAttributes,0) |
 | 
					    TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (NextPageAttributes, 0) |
 | 
				
			||||||
      TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(NextPageAttributes);
 | 
					    TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (NextPageAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return EFI_SUCCESS;
 | 
					  return EFI_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SyncCacheConfig (
 | 
					SyncCacheConfig (
 | 
				
			||||||
  IN  EFI_CPU_ARCH_PROTOCOL *CpuProtocol
 | 
					  IN  EFI_CPU_ARCH_PROTOCOL  *CpuProtocol
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                          Status;
 | 
					  EFI_STATUS                           Status;
 | 
				
			||||||
  UINT32                              i;
 | 
					  UINT32                               i;
 | 
				
			||||||
  EFI_PHYSICAL_ADDRESS                NextRegionBase;
 | 
					  EFI_PHYSICAL_ADDRESS                 NextRegionBase;
 | 
				
			||||||
  UINT64                              NextRegionLength;
 | 
					  UINT64                               NextRegionLength;
 | 
				
			||||||
  UINT32                              NextSectionAttributes;
 | 
					  UINT32                               NextSectionAttributes;
 | 
				
			||||||
  UINT32                              SectionAttributes;
 | 
					  UINT32                               SectionAttributes;
 | 
				
			||||||
  UINT64                              GcdAttributes;
 | 
					  UINT64                               GcdAttributes;
 | 
				
			||||||
  volatile ARM_FIRST_LEVEL_DESCRIPTOR   *FirstLevelTable;
 | 
					  volatile ARM_FIRST_LEVEL_DESCRIPTOR  *FirstLevelTable;
 | 
				
			||||||
  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"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -243,10 +243,9 @@ SyncCacheConfig (
 | 
				
			|||||||
  // Get the memory space map from GCD
 | 
					  // Get the memory space map from GCD
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  MemorySpaceMap = NULL;
 | 
					  MemorySpaceMap = NULL;
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -261,15 +260,15 @@ SyncCacheConfig (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // iterate through each 1MB descriptor
 | 
					  // iterate through each 1MB descriptor
 | 
				
			||||||
  NextRegionBase = NextRegionLength = 0;
 | 
					  NextRegionBase = NextRegionLength = 0;
 | 
				
			||||||
  for (i=0; i < TRANSLATION_TABLE_SECTION_COUNT; i++) {
 | 
					  for (i = 0; i < TRANSLATION_TABLE_SECTION_COUNT; i++) {
 | 
				
			||||||
    if ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {
 | 
					    if ((FirstLevelTable[i] & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) {
 | 
				
			||||||
      // extract attributes (cacheability and permissions)
 | 
					      // extract attributes (cacheability and permissions)
 | 
				
			||||||
      SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK);
 | 
					      SectionAttributes = FirstLevelTable[i] & (TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK | TT_DESCRIPTOR_SECTION_AP_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (NextSectionAttributes == 0) {
 | 
					      if (NextSectionAttributes == 0) {
 | 
				
			||||||
        // start on a new region
 | 
					        // start on a new region
 | 
				
			||||||
        NextRegionLength = 0;
 | 
					        NextRegionLength      = 0;
 | 
				
			||||||
        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;
 | 
				
			||||||
      } else if (SectionAttributes != NextSectionAttributes) {
 | 
					      } else if (SectionAttributes != NextSectionAttributes) {
 | 
				
			||||||
        // Convert Section Attributes into GCD Attributes
 | 
					        // Convert Section Attributes into GCD Attributes
 | 
				
			||||||
@@ -280,21 +279,27 @@ SyncCacheConfig (
 | 
				
			|||||||
        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes);
 | 
					        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // start on a new region
 | 
					        // start on a new region
 | 
				
			||||||
        NextRegionLength = 0;
 | 
					        NextRegionLength      = 0;
 | 
				
			||||||
        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
 | 
				
			||||||
      // bits that are actually part of the pagetable address.  We clear it out to zero so that
 | 
					      // bits that are actually part of the pagetable address.  We clear it out to zero so that
 | 
				
			||||||
      // the SyncCacheConfigPage will use the page attributes instead of trying to convert the
 | 
					      // the SyncCacheConfigPage will use the page attributes instead of trying to convert the
 | 
				
			||||||
      // 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
 | 
				
			||||||
@@ -309,10 +314,11 @@ SyncCacheConfig (
 | 
				
			|||||||
        // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK)
 | 
					        // update GCD with these changes (this will recurse into our own CpuSetMemoryAttributes below which is OK)
 | 
				
			||||||
        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes);
 | 
					        SetGcdMemorySpaceAttributes (MemorySpaceMap, NumberOfDescriptors, NextRegionBase, NextRegionLength, GcdAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        NextRegionLength = 0;
 | 
					        NextRegionLength      = 0;
 | 
				
			||||||
        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
 | 
				
			||||||
@@ -333,10 +339,10 @@ SyncCacheConfig (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
EfiAttributeToArmAttribute (
 | 
					EfiAttributeToArmAttribute (
 | 
				
			||||||
  IN UINT64                    EfiAttributes
 | 
					  IN UINT64  EfiAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64 ArmAttributes;
 | 
					  UINT64  ArmAttributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) {
 | 
					  switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) {
 | 
				
			||||||
    case EFI_MEMORY_UC:
 | 
					    case EFI_MEMORY_UC:
 | 
				
			||||||
@@ -382,15 +388,15 @@ EfiAttributeToArmAttribute (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetMemoryRegionPage (
 | 
					GetMemoryRegionPage (
 | 
				
			||||||
  IN     UINT32                  *PageTable,
 | 
					  IN     UINT32  *PageTable,
 | 
				
			||||||
  IN OUT UINTN                   *BaseAddress,
 | 
					  IN OUT UINTN   *BaseAddress,
 | 
				
			||||||
  OUT    UINTN                   *RegionLength,
 | 
					  OUT    UINTN   *RegionLength,
 | 
				
			||||||
  OUT    UINTN                   *RegionAttributes
 | 
					  OUT    UINTN   *RegionAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32      PageAttributes;
 | 
					  UINT32  PageAttributes;
 | 
				
			||||||
  UINT32      TableIndex;
 | 
					  UINT32  TableIndex;
 | 
				
			||||||
  UINT32      PageDescriptor;
 | 
					  UINT32  PageDescriptor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Convert the section attributes into page attributes
 | 
					  // Convert the section attributes into page attributes
 | 
				
			||||||
  PageAttributes = ConvertSectionAttributesToPageAttributes (*RegionAttributes, 0);
 | 
					  PageAttributes = ConvertSectionAttributesToPageAttributes (*RegionAttributes, 0);
 | 
				
			||||||
@@ -400,7 +406,7 @@ GetMemoryRegionPage (
 | 
				
			|||||||
  ASSERT (TableIndex < TRANSLATION_TABLE_PAGE_COUNT);
 | 
					  ASSERT (TableIndex < TRANSLATION_TABLE_PAGE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Go through the page table to find the end of the section
 | 
					  // Go through the page table to find the end of the section
 | 
				
			||||||
  for (; TableIndex < TRANSLATION_TABLE_PAGE_COUNT; TableIndex++) {
 | 
					  for ( ; TableIndex < TRANSLATION_TABLE_PAGE_COUNT; TableIndex++) {
 | 
				
			||||||
    // Get the section at the given index
 | 
					    // Get the section at the given index
 | 
				
			||||||
    PageDescriptor = PageTable[TableIndex];
 | 
					    PageDescriptor = PageTable[TableIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -416,7 +422,7 @@ GetMemoryRegionPage (
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // We do not support Large Page yet. We return EFI_SUCCESS that means end of the region.
 | 
					      // We do not support Large Page yet. We return EFI_SUCCESS that means end of the region.
 | 
				
			||||||
      ASSERT(0);
 | 
					      ASSERT (0);
 | 
				
			||||||
      return EFI_SUCCESS;
 | 
					      return EFI_SUCCESS;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -426,9 +432,9 @@ GetMemoryRegionPage (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetMemoryRegion (
 | 
					GetMemoryRegion (
 | 
				
			||||||
  IN OUT UINTN                   *BaseAddress,
 | 
					  IN OUT UINTN  *BaseAddress,
 | 
				
			||||||
  OUT    UINTN                   *RegionLength,
 | 
					  OUT    UINTN  *RegionLength,
 | 
				
			||||||
  OUT    UINTN                   *RegionAttributes
 | 
					  OUT    UINTN  *RegionAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                  Status;
 | 
					  EFI_STATUS                  Status;
 | 
				
			||||||
@@ -436,8 +442,8 @@ GetMemoryRegion (
 | 
				
			|||||||
  UINT32                      PageAttributes;
 | 
					  UINT32                      PageAttributes;
 | 
				
			||||||
  UINT32                      PageTableIndex;
 | 
					  UINT32                      PageTableIndex;
 | 
				
			||||||
  UINT32                      SectionDescriptor;
 | 
					  UINT32                      SectionDescriptor;
 | 
				
			||||||
  ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable;
 | 
					  ARM_FIRST_LEVEL_DESCRIPTOR  *FirstLevelTable;
 | 
				
			||||||
  UINT32                     *PageTable;
 | 
					  UINT32                      *PageTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Initialize the arguments
 | 
					  // Initialize the arguments
 | 
				
			||||||
  *RegionLength = 0;
 | 
					  *RegionLength = 0;
 | 
				
			||||||
@@ -459,32 +465,32 @@ GetMemoryRegion (
 | 
				
			|||||||
  if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
 | 
					  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))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK;
 | 
					    *BaseAddress      = (*BaseAddress) & TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK;
 | 
				
			||||||
    *RegionAttributes = SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK;
 | 
					    *RegionAttributes = SectionDescriptor & TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    // Otherwise, we round it to the page boundary
 | 
					    // Otherwise, we round it to the page boundary
 | 
				
			||||||
    *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK;
 | 
					    *BaseAddress = (*BaseAddress) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get the attribute at the page table level (Level 2)
 | 
					    // Get the attribute at the page table level (Level 2)
 | 
				
			||||||
    PageTable = (UINT32*)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
					    PageTable = (UINT32 *)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Calculate index into first level translation table for start of modification
 | 
					    // Calculate index into first level translation table for start of modification
 | 
				
			||||||
    PageTableIndex = ((*BaseAddress) & TT_DESCRIPTOR_PAGE_INDEX_MASK)  >> TT_DESCRIPTOR_PAGE_BASE_SHIFT;
 | 
					    PageTableIndex = ((*BaseAddress) & TT_DESCRIPTOR_PAGE_INDEX_MASK)  >> TT_DESCRIPTOR_PAGE_BASE_SHIFT;
 | 
				
			||||||
    ASSERT (PageTableIndex < TRANSLATION_TABLE_PAGE_COUNT);
 | 
					    ASSERT (PageTableIndex < TRANSLATION_TABLE_PAGE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PageAttributes = PageTable[PageTableIndex] & TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK;
 | 
					    PageAttributes    = PageTable[PageTableIndex] & TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK;
 | 
				
			||||||
    *RegionAttributes = TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (PageAttributes, 0) |
 | 
					    *RegionAttributes = TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY (PageAttributes, 0) |
 | 
				
			||||||
                        TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (PageAttributes);
 | 
					                        TT_DESCRIPTOR_CONVERT_TO_SECTION_AP (PageAttributes);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (;TableIndex < TRANSLATION_TABLE_SECTION_COUNT; TableIndex++) {
 | 
					  for ( ; TableIndex < TRANSLATION_TABLE_SECTION_COUNT; TableIndex++) {
 | 
				
			||||||
    // Get the section at the given index
 | 
					    // Get the section at the given index
 | 
				
			||||||
    SectionDescriptor = FirstLevelTable[TableIndex];
 | 
					    SectionDescriptor = FirstLevelTable[TableIndex];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If the entry is a level-2 page table then we scan it to find the end of the region
 | 
					    // If the entry is a level-2 page table then we scan it to find the end of the region
 | 
				
			||||||
    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (SectionDescriptor)) {
 | 
					    if (TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE (SectionDescriptor)) {
 | 
				
			||||||
      // Extract the page table location from the descriptor
 | 
					      // Extract the page table location from the descriptor
 | 
				
			||||||
      PageTable = (UINT32*)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
					      PageTable = (UINT32 *)(SectionDescriptor & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // Scan the page table to find the end of the region.
 | 
					      // Scan the page table to find the end of the region.
 | 
				
			||||||
      Status = GetMemoryRegionPage (PageTable, BaseAddress, RegionLength, RegionAttributes);
 | 
					      Status = GetMemoryRegionPage (PageTable, BaseAddress, RegionLength, RegionAttributes);
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <Guid/IdleLoopEvent.h>
 | 
					#include <Guid/IdleLoopEvent.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOLEAN                   mIsFlushingGCD;
 | 
					BOOLEAN  mIsFlushingGCD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function flushes the range of addresses from Start to Start+Length
 | 
					  This function flushes the range of addresses from Start to Start+Length
 | 
				
			||||||
@@ -43,13 +43,12 @@ BOOLEAN                   mIsFlushingGCD;
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuFlushCpuDataCache (
 | 
					CpuFlushCpuDataCache (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL           *This,
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS            Start,
 | 
					  IN EFI_PHYSICAL_ADDRESS   Start,
 | 
				
			||||||
  IN UINT64                          Length,
 | 
					  IN UINT64                 Length,
 | 
				
			||||||
  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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -80,7 +78,7 @@ CpuFlushCpuDataCache (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuEnableInterrupt (
 | 
					CpuEnableInterrupt (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL          *This
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *This
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmEnableInterrupts ();
 | 
					  ArmEnableInterrupts ();
 | 
				
			||||||
@@ -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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -101,7 +98,7 @@ CpuEnableInterrupt (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuDisableInterrupt (
 | 
					CpuDisableInterrupt (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL          *This
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *This
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmDisableInterrupts ();
 | 
					  ArmDisableInterrupts ();
 | 
				
			||||||
@@ -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
 | 
				
			||||||
@@ -126,19 +122,18 @@ CpuDisableInterrupt (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuGetInterruptState (
 | 
					CpuGetInterruptState (
 | 
				
			||||||
  IN  EFI_CPU_ARCH_PROTOCOL         *This,
 | 
					  IN  EFI_CPU_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  OUT BOOLEAN                       *State
 | 
					  OUT BOOLEAN                *State
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (State == NULL) {
 | 
					  if (State == NULL) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *State = ArmGetInterruptState();
 | 
					  *State = ArmGetInterruptState ();
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -158,8 +153,8 @@ CpuGetInterruptState (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuInit (
 | 
					CpuInit (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL           *This,
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  IN EFI_CPU_INIT_TYPE               InitType
 | 
					  IN EFI_CPU_INIT_TYPE      InitType
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return EFI_UNSUPPORTED;
 | 
					  return EFI_UNSUPPORTED;
 | 
				
			||||||
@@ -168,9 +163,9 @@ CpuInit (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuRegisterInterruptHandler (
 | 
					CpuRegisterInterruptHandler (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL          *This,
 | 
					  IN EFI_CPU_ARCH_PROTOCOL      *This,
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE         InterruptType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER  InterruptHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return RegisterInterruptHandler (InterruptType, InterruptHandler);
 | 
					  return RegisterInterruptHandler (InterruptType, InterruptHandler);
 | 
				
			||||||
@@ -179,10 +174,10 @@ CpuRegisterInterruptHandler (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuGetTimerValue (
 | 
					CpuGetTimerValue (
 | 
				
			||||||
  IN  EFI_CPU_ARCH_PROTOCOL          *This,
 | 
					  IN  EFI_CPU_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32                         TimerIndex,
 | 
					  IN  UINT32                 TimerIndex,
 | 
				
			||||||
  OUT UINT64                         *TimerValue,
 | 
					  OUT UINT64                 *TimerValue,
 | 
				
			||||||
  OUT UINT64                         *TimerPeriod   OPTIONAL
 | 
					  OUT UINT64                 *TimerPeriod   OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return EFI_UNSUPPORTED;
 | 
					  return EFI_UNSUPPORTED;
 | 
				
			||||||
@@ -199,8 +194,8 @@ CpuGetTimerValue (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
IdleLoopEventCallback (
 | 
					IdleLoopEventCallback (
 | 
				
			||||||
  IN EFI_EVENT                Event,
 | 
					  IN EFI_EVENT  Event,
 | 
				
			||||||
  IN VOID                     *Context
 | 
					  IN VOID       *Context
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CpuSleep ();
 | 
					  CpuSleep ();
 | 
				
			||||||
@@ -209,8 +204,8 @@ IdleLoopEventCallback (
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// Globals used to initialize the protocol
 | 
					// Globals used to initialize the protocol
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
EFI_HANDLE            mCpuHandle = NULL;
 | 
					EFI_HANDLE             mCpuHandle = NULL;
 | 
				
			||||||
EFI_CPU_ARCH_PROTOCOL mCpu = {
 | 
					EFI_CPU_ARCH_PROTOCOL  mCpu       = {
 | 
				
			||||||
  CpuFlushCpuDataCache,
 | 
					  CpuFlushCpuDataCache,
 | 
				
			||||||
  CpuEnableInterrupt,
 | 
					  CpuEnableInterrupt,
 | 
				
			||||||
  CpuDisableInterrupt,
 | 
					  CpuDisableInterrupt,
 | 
				
			||||||
@@ -226,7 +221,7 @@ EFI_CPU_ARCH_PROTOCOL mCpu = {
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
InitializeDma (
 | 
					InitializeDma (
 | 
				
			||||||
  IN OUT  EFI_CPU_ARCH_PROTOCOL   *CpuArchProtocol
 | 
					  IN OUT  EFI_CPU_ARCH_PROTOCOL  *CpuArchProtocol
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CpuArchProtocol->DmaBufferAlignment = ArmCacheWritebackGranule ();
 | 
					  CpuArchProtocol->DmaBufferAlignment = ArmCacheWritebackGranule ();
 | 
				
			||||||
@@ -234,22 +229,23 @@ InitializeDma (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
CpuDxeInitialize (
 | 
					CpuDxeInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  EFI_EVENT    IdleLoopEvent;
 | 
					  EFI_EVENT   IdleLoopEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  InitializeExceptions (&mCpu);
 | 
					  InitializeExceptions (&mCpu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  InitializeDma (&mCpu);
 | 
					  InitializeDma (&mCpu);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
                &mCpuHandle,
 | 
					                  &mCpuHandle,
 | 
				
			||||||
                &gEfiCpuArchProtocolGuid,           &mCpu,
 | 
					                  &gEfiCpuArchProtocolGuid,
 | 
				
			||||||
                NULL
 | 
					                  &mCpu,
 | 
				
			||||||
                );
 | 
					                  NULL
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Make sure GCD and MMU settings match. This API calls gDS->SetMemorySpaceAttributes ()
 | 
					  // Make sure GCD and MMU settings match. This API calls gDS->SetMemorySpaceAttributes ()
 | 
				
			||||||
@@ -262,8 +258,8 @@ CpuDxeInitialize (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // If the platform is a MPCore system then install the Configuration Table describing the
 | 
					  // If the platform is a MPCore system then install the Configuration Table describing the
 | 
				
			||||||
  // secondary core states
 | 
					  // secondary core states
 | 
				
			||||||
  if (ArmIsMpCore()) {
 | 
					  if (ArmIsMpCore ()) {
 | 
				
			||||||
    PublishArmProcessorTable();
 | 
					    PublishArmProcessorTable ();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@
 | 
				
			|||||||
#include <Protocol/DebugSupport.h>
 | 
					#include <Protocol/DebugSupport.h>
 | 
				
			||||||
#include <Protocol/LoadedImage.h>
 | 
					#include <Protocol/LoadedImage.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BOOLEAN mIsFlushingGCD;
 | 
					extern BOOLEAN  mIsFlushingGCD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -55,11 +55,10 @@ extern BOOLEAN mIsFlushingGCD;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
RegisterInterruptHandler (
 | 
					RegisterInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE         InterruptType,
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -82,28 +81,27 @@ RegisterInterruptHandler (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
RegisterDebuggerInterruptHandler (
 | 
					RegisterDebuggerInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE         InterruptType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER  InterruptHandler
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuSetMemoryAttributes (
 | 
					CpuSetMemoryAttributes (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL     *This,
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN EFI_PHYSICAL_ADDRESS   BaseAddress,
 | 
				
			||||||
  IN UINT64                    Length,
 | 
					  IN UINT64                 Length,
 | 
				
			||||||
  IN UINT64                    Attributes
 | 
					  IN UINT64                 Attributes
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
InitializeExceptions (
 | 
					InitializeExceptions (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL    *Cpu
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *Cpu
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SyncCacheConfig (
 | 
					SyncCacheConfig (
 | 
				
			||||||
  IN  EFI_CPU_ARCH_PROTOCOL *CpuProtocol
 | 
					  IN  EFI_CPU_ARCH_PROTOCOL  *CpuProtocol
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -117,30 +115,30 @@ SyncCacheConfig (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
PublishArmProcessorTable(
 | 
					PublishArmProcessorTable (
 | 
				
			||||||
  VOID
 | 
					  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 (
 | 
				
			||||||
  IN UINT64                    EfiAttributes
 | 
					  IN UINT64  EfiAttributes
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetMemoryRegion (
 | 
					GetMemoryRegion (
 | 
				
			||||||
  IN OUT UINTN                   *BaseAddress,
 | 
					  IN OUT UINTN  *BaseAddress,
 | 
				
			||||||
  OUT    UINTN                   *RegionLength,
 | 
					  OUT    UINTN  *RegionLength,
 | 
				
			||||||
  OUT    UINTN                   *RegionAttributes
 | 
					  OUT    UINTN  *RegionAttributes
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SetGcdMemorySpaceAttributes (
 | 
					SetGcdMemorySpaceAttributes (
 | 
				
			||||||
  IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR    *MemorySpaceMap,
 | 
					  IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap,
 | 
				
			||||||
  IN UINTN                               NumberOfDescriptors,
 | 
					  IN UINTN                            NumberOfDescriptors,
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS                BaseAddress,
 | 
					  IN EFI_PHYSICAL_ADDRESS             BaseAddress,
 | 
				
			||||||
  IN UINT64                              Length,
 | 
					  IN UINT64                           Length,
 | 
				
			||||||
  IN UINT64                              Attributes
 | 
					  IN UINT64                           Attributes
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // CPU_DXE_H_
 | 
					#endif // CPU_DXE_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,33 +29,36 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SearchGcdMemorySpaces (
 | 
					SearchGcdMemorySpaces (
 | 
				
			||||||
  IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR    *MemorySpaceMap,
 | 
					  IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap,
 | 
				
			||||||
  IN UINTN                               NumberOfDescriptors,
 | 
					  IN UINTN                            NumberOfDescriptors,
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS                BaseAddress,
 | 
					  IN EFI_PHYSICAL_ADDRESS             BaseAddress,
 | 
				
			||||||
  IN UINT64                              Length,
 | 
					  IN UINT64                           Length,
 | 
				
			||||||
  OUT UINTN                             *StartIndex,
 | 
					  OUT UINTN                           *StartIndex,
 | 
				
			||||||
  OUT UINTN                             *EndIndex
 | 
					  OUT UINTN                           *EndIndex
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN           Index;
 | 
					  UINTN  Index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *StartIndex = 0;
 | 
					  *StartIndex = 0;
 | 
				
			||||||
  *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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -74,11 +77,11 @@ SearchGcdMemorySpaces (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SetGcdMemorySpaceAttributes (
 | 
					SetGcdMemorySpaceAttributes (
 | 
				
			||||||
  IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR    *MemorySpaceMap,
 | 
					  IN EFI_GCD_MEMORY_SPACE_DESCRIPTOR  *MemorySpaceMap,
 | 
				
			||||||
  IN UINTN                               NumberOfDescriptors,
 | 
					  IN UINTN                            NumberOfDescriptors,
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS                BaseAddress,
 | 
					  IN EFI_PHYSICAL_ADDRESS             BaseAddress,
 | 
				
			||||||
  IN UINT64                              Length,
 | 
					  IN UINT64                           Length,
 | 
				
			||||||
  IN UINT64                              Attributes
 | 
					  IN UINT64                           Attributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS            Status;
 | 
					  EFI_STATUS            Status;
 | 
				
			||||||
@@ -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 ((
 | 
				
			||||||
            "Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
 | 
					      DEBUG_WARN,
 | 
				
			||||||
            Length));
 | 
					      "Warning: We do not support smaller granularity than 4KB on ARM Architecture (passed length: 0x%lX).\n",
 | 
				
			||||||
 | 
					      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
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@@ -170,10 +183,10 @@ SetGcdMemorySpaceAttributes (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CpuSetMemoryAttributes (
 | 
					CpuSetMemoryAttributes (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL    *This,
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN EFI_PHYSICAL_ADDRESS   BaseAddress,
 | 
				
			||||||
  IN UINT64                    Length,
 | 
					  IN UINT64                 Length,
 | 
				
			||||||
  IN UINT64                    EfiAttributes
 | 
					  IN UINT64                 EfiAttributes
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
@@ -197,7 +210,7 @@ CpuSetMemoryAttributes (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Get the region starting from 'BaseAddress' and its 'Attribute'
 | 
					  // Get the region starting from 'BaseAddress' and its 'Attribute'
 | 
				
			||||||
  RegionBaseAddress = BaseAddress;
 | 
					  RegionBaseAddress = BaseAddress;
 | 
				
			||||||
  Status = GetMemoryRegion (&RegionBaseAddress, &RegionLength, &RegionArmAttributes);
 | 
					  Status            = GetMemoryRegion (&RegionBaseAddress, &RegionLength, &RegionArmAttributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Data & Instruction Caches are flushed when we set new memory attributes.
 | 
					  // Data & Instruction Caches are flushed when we set new memory attributes.
 | 
				
			||||||
  // So, we only set the attributes if the new region is different.
 | 
					  // So, we only set the attributes if the new region is different.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <Guid/ArmMpCoreInfo.h>
 | 
					#include <Guid/ArmMpCoreInfo.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ARM_PROCESSOR_TABLE mArmProcessorTableTemplate = {
 | 
					ARM_PROCESSOR_TABLE  mArmProcessorTableTemplate = {
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    EFI_ARM_PROCESSOR_TABLE_SIGNATURE,
 | 
					    EFI_ARM_PROCESSOR_TABLE_SIGNATURE,
 | 
				
			||||||
    0,
 | 
					    0,
 | 
				
			||||||
@@ -26,7 +26,7 @@ ARM_PROCESSOR_TABLE mArmProcessorTableTemplate = {
 | 
				
			|||||||
    EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION,
 | 
					    EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION,
 | 
				
			||||||
    { 0 },
 | 
					    { 0 },
 | 
				
			||||||
    0
 | 
					    0
 | 
				
			||||||
  },   //ARM Processor table header
 | 
					  },   // ARM Processor table header
 | 
				
			||||||
  0,   // Number of entries in ARM processor Table
 | 
					  0,   // Number of entries in ARM processor Table
 | 
				
			||||||
  NULL // ARM Processor Table
 | 
					  NULL // ARM Processor Table
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -45,47 +45,48 @@ PublishArmProcessorTable (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_PEI_HOB_POINTERS    Hob;
 | 
					  EFI_PEI_HOB_POINTERS  Hob;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Hob.Raw = GetHobList ();
 | 
					  Hob.Raw = GetHobList ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Iterate through the HOBs and find if there is ARM PROCESSOR ENTRY HOB
 | 
					  // 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)) {
 | 
					  for ( ; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
 | 
				
			||||||
    // Check for Correct HOB type
 | 
					    // Check for Correct HOB type
 | 
				
			||||||
    if ((GET_HOB_TYPE (Hob)) == EFI_HOB_TYPE_GUID_EXTENSION) {
 | 
					    if ((GET_HOB_TYPE (Hob)) == EFI_HOB_TYPE_GUID_EXTENSION) {
 | 
				
			||||||
      // Check for correct GUID type
 | 
					      // Check for correct GUID type
 | 
				
			||||||
      if (CompareGuid(&(Hob.Guid->Name), &gArmMpCoreInfoGuid)) {
 | 
					      if (CompareGuid (&(Hob.Guid->Name), &gArmMpCoreInfoGuid)) {
 | 
				
			||||||
        ARM_PROCESSOR_TABLE     *ArmProcessorTable;
 | 
					        ARM_PROCESSOR_TABLE  *ArmProcessorTable;
 | 
				
			||||||
        EFI_STATUS              Status;
 | 
					        EFI_STATUS           Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Allocate Runtime memory for ARM processor table
 | 
					        // Allocate Runtime memory for ARM processor table
 | 
				
			||||||
        ArmProcessorTable = (ARM_PROCESSOR_TABLE*)AllocateRuntimePool(sizeof(ARM_PROCESSOR_TABLE));
 | 
					        ArmProcessorTable = (ARM_PROCESSOR_TABLE *)AllocateRuntimePool (sizeof (ARM_PROCESSOR_TABLE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Check if the memory allocation is successful or not
 | 
					        // Check if the memory allocation is successful or not
 | 
				
			||||||
        ASSERT(NULL != ArmProcessorTable);
 | 
					        ASSERT (NULL != ArmProcessorTable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set ARM processor table to default values
 | 
					        // Set ARM processor table to default values
 | 
				
			||||||
        CopyMem(ArmProcessorTable,&mArmProcessorTableTemplate,sizeof(ARM_PROCESSOR_TABLE));
 | 
					        CopyMem (ArmProcessorTable, &mArmProcessorTableTemplate, sizeof (ARM_PROCESSOR_TABLE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Fill in Length fields of ARM processor table
 | 
					        // Fill in Length fields of ARM processor table
 | 
				
			||||||
        ArmProcessorTable->Header.Length = sizeof(ARM_PROCESSOR_TABLE);
 | 
					        ArmProcessorTable->Header.Length  = sizeof (ARM_PROCESSOR_TABLE);
 | 
				
			||||||
        ArmProcessorTable->Header.DataLen = GET_GUID_HOB_DATA_SIZE(Hob);
 | 
					        ArmProcessorTable->Header.DataLen = GET_GUID_HOB_DATA_SIZE (Hob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Fill in Identifier(ARM processor table GUID)
 | 
					        // Fill in Identifier(ARM processor table GUID)
 | 
				
			||||||
        ArmProcessorTable->Header.Identifier = gArmMpCoreInfoGuid;
 | 
					        ArmProcessorTable->Header.Identifier = gArmMpCoreInfoGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set Number of ARM core entries in the Table
 | 
					        // Set Number of ARM core entries in the Table
 | 
				
			||||||
        ArmProcessorTable->NumberOfEntries = GET_GUID_HOB_DATA_SIZE(Hob)/sizeof(ARM_CORE_INFO);
 | 
					        ArmProcessorTable->NumberOfEntries = GET_GUID_HOB_DATA_SIZE (Hob)/sizeof (ARM_CORE_INFO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Allocate runtime memory for ARM processor Table entries
 | 
					        // Allocate runtime memory for ARM processor Table entries
 | 
				
			||||||
        ArmProcessorTable->ArmCpus = (ARM_CORE_INFO*)AllocateRuntimePool (
 | 
					        ArmProcessorTable->ArmCpus = (ARM_CORE_INFO *)AllocateRuntimePool (
 | 
				
			||||||
           ArmProcessorTable->NumberOfEntries * sizeof(ARM_CORE_INFO));
 | 
					                                                        ArmProcessorTable->NumberOfEntries * sizeof (ARM_CORE_INFO)
 | 
				
			||||||
 | 
					                                                        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Check if the memory allocation is successful or not
 | 
					        // Check if the memory allocation is successful or not
 | 
				
			||||||
        ASSERT(NULL != ArmProcessorTable->ArmCpus);
 | 
					        ASSERT (NULL != ArmProcessorTable->ArmCpus);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Copy ARM Processor Table data from HOB list to newly allocated memory
 | 
					        // Copy ARM Processor Table data from HOB list to newly allocated memory
 | 
				
			||||||
        CopyMem(ArmProcessorTable->ArmCpus,GET_GUID_HOB_DATA(Hob), ArmProcessorTable->Header.DataLen);
 | 
					        CopyMem (ArmProcessorTable->ArmCpus, GET_GUID_HOB_DATA (Hob), ArmProcessorTable->Header.DataLen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Install the ARM Processor table into EFI system configuration table
 | 
					        // Install the ARM Processor table into EFI system configuration table
 | 
				
			||||||
        Status = gBS->InstallConfigurationTable (&gArmMpCoreInfoGuid, ArmProcessorTable);
 | 
					        Status = gBS->InstallConfigurationTable (&gArmMpCoreInfoGuid, ArmProcessorTable);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,23 +13,23 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
InitializeExceptions (
 | 
					InitializeExceptions (
 | 
				
			||||||
  IN EFI_CPU_ARCH_PROTOCOL    *Cpu
 | 
					  IN EFI_CPU_ARCH_PROTOCOL  *Cpu
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                      Status;
 | 
					  EFI_STATUS               Status;
 | 
				
			||||||
  EFI_VECTOR_HANDOFF_INFO         *VectorInfoList;
 | 
					  EFI_VECTOR_HANDOFF_INFO  *VectorInfoList;
 | 
				
			||||||
  EFI_VECTOR_HANDOFF_INFO         *VectorInfo;
 | 
					  EFI_VECTOR_HANDOFF_INFO  *VectorInfo;
 | 
				
			||||||
  BOOLEAN                         IrqEnabled;
 | 
					  BOOLEAN                  IrqEnabled;
 | 
				
			||||||
  BOOLEAN                         FiqEnabled;
 | 
					  BOOLEAN                  FiqEnabled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // initialize the CpuExceptionHandlerLib so we take over the exception vector table from the DXE Core
 | 
					  // initialize the CpuExceptionHandlerLib so we take over the exception vector table from the DXE Core
 | 
				
			||||||
  InitializeCpuExceptionHandlers(VectorInfo);
 | 
					  InitializeCpuExceptionHandlers (VectorInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = EFI_SUCCESS;
 | 
					  Status = EFI_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -64,7 +64,7 @@ InitializeExceptions (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  DEBUG_CODE (
 | 
					  DEBUG_CODE (
 | 
				
			||||||
    ArmEnableAsynchronousAbort ();
 | 
					    ArmEnableAsynchronousAbort ();
 | 
				
			||||||
  );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Status;
 | 
					  return Status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -90,11 +90,11 @@ previously installed.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
RegisterInterruptHandler(
 | 
					RegisterInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             InterruptType,
 | 
					  IN EFI_EXCEPTION_TYPE         InterruptType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER      InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER  InterruptHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // pass down to CpuExceptionHandlerLib
 | 
					  // pass down to CpuExceptionHandlerLib
 | 
				
			||||||
  return (EFI_STATUS)RegisterCpuInterruptHandler(InterruptType, InterruptHandler);
 | 
					  return (EFI_STATUS)RegisterCpuInterruptHandler (InterruptType, InterruptHandler);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,8 +16,6 @@ Abstract:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// The package level header files this module uses
 | 
					// The package level header files this module uses
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@@ -58,10 +56,10 @@ InitializeCpuPeim (
 | 
				
			|||||||
  IN CONST EFI_PEI_SERVICES     **PeiServices
 | 
					  IN CONST EFI_PEI_SERVICES     **PeiServices
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS              Status;
 | 
					  EFI_STATUS            Status;
 | 
				
			||||||
  ARM_MP_CORE_INFO_PPI    *ArmMpCoreInfoPpi;
 | 
					  ARM_MP_CORE_INFO_PPI  *ArmMpCoreInfoPpi;
 | 
				
			||||||
  UINTN                   ArmCoreCount;
 | 
					  UINTN                 ArmCoreCount;
 | 
				
			||||||
  ARM_CORE_INFO           *ArmCoreInfoTable;
 | 
					  ARM_CORE_INFO         *ArmCoreInfoTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Enable program flow prediction, if supported.
 | 
					  // Enable program flow prediction, if supported.
 | 
				
			||||||
  ArmEnableBranchPrediction ();
 | 
					  ArmEnableBranchPrediction ();
 | 
				
			||||||
@@ -70,12 +68,12 @@ InitializeCpuPeim (
 | 
				
			|||||||
  BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
 | 
					  BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Only MP Core platform need to produce gArmMpCoreInfoPpiGuid
 | 
					  // Only MP Core platform need to produce gArmMpCoreInfoPpiGuid
 | 
				
			||||||
  Status = PeiServicesLocatePpi (&gArmMpCoreInfoPpiGuid, 0, NULL, (VOID**)&ArmMpCoreInfoPpi);
 | 
					  Status = PeiServicesLocatePpi (&gArmMpCoreInfoPpiGuid, 0, NULL, (VOID **)&ArmMpCoreInfoPpi);
 | 
				
			||||||
  if (!EFI_ERROR(Status)) {
 | 
					  if (!EFI_ERROR (Status)) {
 | 
				
			||||||
    // Build the MP Core Info Table
 | 
					    // Build the MP Core Info Table
 | 
				
			||||||
    ArmCoreCount = 0;
 | 
					    ArmCoreCount = 0;
 | 
				
			||||||
    Status = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable);
 | 
					    Status       = ArmMpCoreInfoPpi->GetMpCoreInfo (&ArmCoreCount, &ArmCoreInfoTable);
 | 
				
			||||||
    if (!EFI_ERROR(Status) && (ArmCoreCount > 0)) {
 | 
					    if (!EFI_ERROR (Status) && (ArmCoreCount > 0)) {
 | 
				
			||||||
      // Build MPCore Info HOB
 | 
					      // Build MPCore Info HOB
 | 
				
			||||||
      BuildGuidDataHob (&gArmMpCoreInfoGuid, ArmCoreInfoTable, sizeof (ARM_CORE_INFO) * ArmCoreCount);
 | 
					      BuildGuidDataHob (&gArmMpCoreInfoGuid, ArmCoreInfoTable, sizeof (ARM_CORE_INFO) * ArmCoreCount);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,20 +5,21 @@
 | 
				
			|||||||
*  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_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Refresh Frame:
 | 
					// Refresh Frame:
 | 
				
			||||||
#define GENERIC_WDOG_REFRESH_REG              ((UINTN)FixedPcdGet64 (PcdGenericWatchdogRefreshBase) + 0x000)
 | 
					#define GENERIC_WDOG_REFRESH_REG  ((UINTN)FixedPcdGet64 (PcdGenericWatchdogRefreshBase) + 0x000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Control Frame:
 | 
					// Control Frame:
 | 
				
			||||||
#define GENERIC_WDOG_CONTROL_STATUS_REG       ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x000)
 | 
					#define GENERIC_WDOG_CONTROL_STATUS_REG      ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x000)
 | 
				
			||||||
#define GENERIC_WDOG_OFFSET_REG               ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x008)
 | 
					#define GENERIC_WDOG_OFFSET_REG              ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x008)
 | 
				
			||||||
#define GENERIC_WDOG_COMPARE_VALUE_REG_LOW    ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x010)
 | 
					#define GENERIC_WDOG_COMPARE_VALUE_REG_LOW   ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x010)
 | 
				
			||||||
#define GENERIC_WDOG_COMPARE_VALUE_REG_HIGH   ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x014)
 | 
					#define GENERIC_WDOG_COMPARE_VALUE_REG_HIGH  ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x014)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Values of bit 0 of the Control/Status Register
 | 
					// Values of bit 0 of the Control/Status Register
 | 
				
			||||||
#define GENERIC_WDOG_ENABLED          1
 | 
					#define GENERIC_WDOG_ENABLED   1
 | 
				
			||||||
#define GENERIC_WDOG_DISABLED         0
 | 
					#define GENERIC_WDOG_DISABLED  0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // GENERIC_WATCHDOG_H_
 | 
					#endif // GENERIC_WATCHDOG_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,18 +25,18 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* The number of 100ns periods (the unit of time passed to these functions)
 | 
					/* The number of 100ns periods (the unit of time passed to these functions)
 | 
				
			||||||
   in a second */
 | 
					   in a second */
 | 
				
			||||||
#define TIME_UNITS_PER_SECOND 10000000
 | 
					#define TIME_UNITS_PER_SECOND  10000000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Tick frequency of the generic timer basis of the generic watchdog.
 | 
					// Tick frequency of the generic timer basis of the generic watchdog.
 | 
				
			||||||
STATIC UINTN mTimerFrequencyHz = 0;
 | 
					STATIC UINTN  mTimerFrequencyHz = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* In cases where the compare register was set manually, information about
 | 
					/* In cases where the compare register was set manually, information about
 | 
				
			||||||
   how long the watchdog was asked to wait cannot be retrieved from hardware.
 | 
					   how long the watchdog was asked to wait cannot be retrieved from hardware.
 | 
				
			||||||
   It is therefore stored here. 0 means the timer is not running. */
 | 
					   It is therefore stored here. 0 means the timer is not running. */
 | 
				
			||||||
STATIC UINT64 mNumTimerTicks = 0;
 | 
					STATIC UINT64  mNumTimerTicks = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC EFI_HARDWARE_INTERRUPT2_PROTOCOL *mInterruptProtocol;
 | 
					STATIC EFI_HARDWARE_INTERRUPT2_PROTOCOL  *mInterruptProtocol;
 | 
				
			||||||
STATIC EFI_WATCHDOG_TIMER_NOTIFY        mWatchdogNotify;
 | 
					STATIC EFI_WATCHDOG_TIMER_NOTIFY         mWatchdogNotify;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -97,12 +97,12 @@ STATIC
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
WatchdogInterruptHandler (
 | 
					WatchdogInterruptHandler (
 | 
				
			||||||
  IN  HARDWARE_INTERRUPT_SOURCE   Source,
 | 
					  IN  HARDWARE_INTERRUPT_SOURCE  Source,
 | 
				
			||||||
  IN  EFI_SYSTEM_CONTEXT          SystemContext
 | 
					  IN  EFI_SYSTEM_CONTEXT         SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  STATIC CONST CHAR16 ResetString[]= L"The generic watchdog timer ran out.";
 | 
					  STATIC CONST CHAR16  ResetString[] = L"The generic watchdog timer ran out.";
 | 
				
			||||||
  UINT64              TimerPeriod;
 | 
					  UINT64               TimerPeriod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  WatchdogDisable ();
 | 
					  WatchdogDisable ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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);
 | 
				
			||||||
@@ -154,15 +158,15 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
WatchdogRegisterHandler (
 | 
					WatchdogRegisterHandler (
 | 
				
			||||||
  IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL         *This,
 | 
					  IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -188,11 +192,11 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
WatchdogSetTimerPeriod (
 | 
					WatchdogSetTimerPeriod (
 | 
				
			||||||
  IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL         *This,
 | 
					  IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  IN UINT64                                   TimerPeriod   // In 100ns units
 | 
					  IN UINT64                            TimerPeriod          // In 100ns units
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN       SystemCount;
 | 
					  UINTN  SystemCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // if TimerPeriod is 0, this is a request to stop the watchdog.
 | 
					  // if TimerPeriod is 0, this is a request to stop the watchdog.
 | 
				
			||||||
  if (TimerPeriod == 0) {
 | 
					  if (TimerPeriod == 0) {
 | 
				
			||||||
@@ -244,8 +248,8 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
WatchdogGetTimerPeriod (
 | 
					WatchdogGetTimerPeriod (
 | 
				
			||||||
  IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL         *This,
 | 
					  IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT64                                  *TimerPeriod
 | 
					  OUT UINT64                           *TimerPeriod
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (TimerPeriod == NULL) {
 | 
					  if (TimerPeriod == NULL) {
 | 
				
			||||||
@@ -289,26 +293,29 @@ WatchdogGetTimerPeriod (
 | 
				
			|||||||
  Retrieves the period of the timer interrupt in 100ns units.
 | 
					  Retrieves the period of the timer interrupt in 100ns units.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
STATIC EFI_WATCHDOG_TIMER_ARCH_PROTOCOL mWatchdogTimer = {
 | 
					STATIC EFI_WATCHDOG_TIMER_ARCH_PROTOCOL  mWatchdogTimer = {
 | 
				
			||||||
  WatchdogRegisterHandler,
 | 
					  WatchdogRegisterHandler,
 | 
				
			||||||
  WatchdogSetTimerPeriod,
 | 
					  WatchdogSetTimerPeriod,
 | 
				
			||||||
  WatchdogGetTimerPeriod
 | 
					  WatchdogGetTimerPeriod
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC EFI_EVENT mEfiExitBootServicesEvent;
 | 
					STATIC EFI_EVENT  mEfiExitBootServicesEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GenericWatchdogEntry (
 | 
					GenericWatchdogEntry (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  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;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,14 +9,14 @@
 | 
				
			|||||||
#ifndef MM_COMMUNICATE_H_
 | 
					#ifndef MM_COMMUNICATE_H_
 | 
				
			||||||
#define MM_COMMUNICATE_H_
 | 
					#define MM_COMMUNICATE_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MM_MAJOR_VER_MASK        0xEFFF0000
 | 
					#define MM_MAJOR_VER_MASK   0xEFFF0000
 | 
				
			||||||
#define MM_MINOR_VER_MASK        0x0000FFFF
 | 
					#define MM_MINOR_VER_MASK   0x0000FFFF
 | 
				
			||||||
#define MM_MAJOR_VER_SHIFT       16
 | 
					#define MM_MAJOR_VER_SHIFT  16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MM_MAJOR_VER(x) (((x) & MM_MAJOR_VER_MASK) >> MM_MAJOR_VER_SHIFT)
 | 
					#define MM_MAJOR_VER(x)  (((x) & MM_MAJOR_VER_MASK) >> MM_MAJOR_VER_SHIFT)
 | 
				
			||||||
#define MM_MINOR_VER(x) ((x) & MM_MINOR_VER_MASK)
 | 
					#define MM_MINOR_VER(x)  ((x) & MM_MINOR_VER_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MM_CALLER_MAJOR_VER      0x1UL
 | 
					#define MM_CALLER_MAJOR_VER  0x1UL
 | 
				
			||||||
#define MM_CALLER_MINOR_VER      0x0
 | 
					#define MM_CALLER_MINOR_VER  0x0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* MM_COMMUNICATE_H_ */
 | 
					#endif /* MM_COMMUNICATE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,15 +41,21 @@ 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
 | 
				
			||||||
@@ -63,18 +69,18 @@ STATIC EFI_HANDLE  mMmCommunicateHandle;
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
MmCommunication2Communicate (
 | 
					MmCommunication2Communicate (
 | 
				
			||||||
  IN CONST EFI_MM_COMMUNICATION2_PROTOCOL   *This,
 | 
					  IN CONST EFI_MM_COMMUNICATION2_PROTOCOL  *This,
 | 
				
			||||||
  IN OUT VOID                               *CommBufferPhysical,
 | 
					  IN OUT VOID                              *CommBufferPhysical,
 | 
				
			||||||
  IN OUT VOID                               *CommBufferVirtual,
 | 
					  IN OUT VOID                              *CommBufferVirtual,
 | 
				
			||||||
  IN OUT UINTN                              *CommSize OPTIONAL
 | 
					  IN OUT UINTN                             *CommSize OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_MM_COMMUNICATE_HEADER   *CommunicateHeader;
 | 
					  EFI_MM_COMMUNICATE_HEADER  *CommunicateHeader;
 | 
				
			||||||
  ARM_SMC_ARGS                CommunicateSmcArgs;
 | 
					  ARM_SMC_ARGS               CommunicateSmcArgs;
 | 
				
			||||||
  EFI_STATUS                  Status;
 | 
					  EFI_STATUS                 Status;
 | 
				
			||||||
  UINTN                       BufferSize;
 | 
					  UINTN                      BufferSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = EFI_ACCESS_DENIED;
 | 
					  Status     = EFI_ACCESS_DENIED;
 | 
				
			||||||
  BufferSize = 0;
 | 
					  BufferSize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ZeroMem (&CommunicateSmcArgs, sizeof (ARM_SMC_ARGS));
 | 
					  ZeroMem (&CommunicateSmcArgs, sizeof (ARM_SMC_ARGS));
 | 
				
			||||||
@@ -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
 | 
				
			||||||
@@ -143,41 +158,41 @@ MmCommunication2Communicate (
 | 
				
			|||||||
  ArmCallSmc (&CommunicateSmcArgs);
 | 
					  ArmCallSmc (&CommunicateSmcArgs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (CommunicateSmcArgs.Arg0) {
 | 
					  switch (CommunicateSmcArgs.Arg0) {
 | 
				
			||||||
  case ARM_SMC_MM_RET_SUCCESS:
 | 
					    case ARM_SMC_MM_RET_SUCCESS:
 | 
				
			||||||
    ZeroMem (CommBufferVirtual, BufferSize);
 | 
					      ZeroMem (CommBufferVirtual, BufferSize);
 | 
				
			||||||
    // On successful return, the size of data being returned is inferred from
 | 
					      // On successful return, the size of data being returned is inferred from
 | 
				
			||||||
    // MessageLength + Header.
 | 
					      // MessageLength + Header.
 | 
				
			||||||
    CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase;
 | 
					      CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase;
 | 
				
			||||||
    BufferSize = CommunicateHeader->MessageLength +
 | 
					      BufferSize        = CommunicateHeader->MessageLength +
 | 
				
			||||||
                 sizeof (CommunicateHeader->HeaderGuid) +
 | 
					                          sizeof (CommunicateHeader->HeaderGuid) +
 | 
				
			||||||
                 sizeof (CommunicateHeader->MessageLength);
 | 
					                          sizeof (CommunicateHeader->MessageLength);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CopyMem (
 | 
					      CopyMem (
 | 
				
			||||||
      CommBufferVirtual,
 | 
					        CommBufferVirtual,
 | 
				
			||||||
      (VOID *)mNsCommBuffMemRegion.VirtualBase,
 | 
					        (VOID *)mNsCommBuffMemRegion.VirtualBase,
 | 
				
			||||||
      BufferSize
 | 
					        BufferSize
 | 
				
			||||||
      );
 | 
					        );
 | 
				
			||||||
    Status = EFI_SUCCESS;
 | 
					      Status = EFI_SUCCESS;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case ARM_SMC_MM_RET_INVALID_PARAMS:
 | 
					    case ARM_SMC_MM_RET_INVALID_PARAMS:
 | 
				
			||||||
    Status = EFI_INVALID_PARAMETER;
 | 
					      Status = EFI_INVALID_PARAMETER;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case ARM_SMC_MM_RET_DENIED:
 | 
					    case ARM_SMC_MM_RET_DENIED:
 | 
				
			||||||
    Status = EFI_ACCESS_DENIED;
 | 
					      Status = EFI_ACCESS_DENIED;
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case ARM_SMC_MM_RET_NO_MEMORY:
 | 
					    case ARM_SMC_MM_RET_NO_MEMORY:
 | 
				
			||||||
    // Unexpected error since the CommSize was checked for zero length
 | 
					      // Unexpected error since the CommSize was checked for zero length
 | 
				
			||||||
    // prior to issuing the SMC
 | 
					      // prior to issuing the SMC
 | 
				
			||||||
    Status = EFI_OUT_OF_RESOURCES;
 | 
					      Status = EFI_OUT_OF_RESOURCES;
 | 
				
			||||||
    ASSERT (0);
 | 
					      ASSERT (0);
 | 
				
			||||||
    break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  default:
 | 
					    default:
 | 
				
			||||||
    Status = EFI_ACCESS_DENIED;
 | 
					      Status = EFI_ACCESS_DENIED;
 | 
				
			||||||
    ASSERT (0);
 | 
					      ASSERT (0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Status;
 | 
					  return Status;
 | 
				
			||||||
@@ -209,7 +224,7 @@ VOID
 | 
				
			|||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
NotifySetVirtualAddressMap (
 | 
					NotifySetVirtualAddressMap (
 | 
				
			||||||
  IN EFI_EVENT  Event,
 | 
					  IN EFI_EVENT  Event,
 | 
				
			||||||
  IN VOID      *Context
 | 
					  IN VOID       *Context
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS  Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
@@ -219,19 +234,23 @@ 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;
 | 
				
			||||||
  ARM_SMC_ARGS MmVersionArgs;
 | 
					  ARM_SMC_ARGS  MmVersionArgs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // MM_VERSION uses SMC32 calling conventions
 | 
					  // MM_VERSION uses SMC32 calling conventions
 | 
				
			||||||
  MmVersionArgs.Arg0 = ARM_SMC_ID_MM_VERSION_AARCH32;
 | 
					  MmVersionArgs.Arg0 = ARM_SMC_ID_MM_VERSION_AARCH32;
 | 
				
			||||||
@@ -240,27 +259,38 @@ 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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return Status;
 | 
					  return Status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC EFI_GUID* CONST mGuidedEventGuid[] = {
 | 
					STATIC EFI_GUID *CONST  mGuidedEventGuid[] = {
 | 
				
			||||||
  &gEfiEndOfDxeEventGroupGuid,
 | 
					  &gEfiEndOfDxeEventGroupGuid,
 | 
				
			||||||
  &gEfiEventExitBootServicesGuid,
 | 
					  &gEfiEventExitBootServicesGuid,
 | 
				
			||||||
  &gEfiEventReadyToBootGuid,
 | 
					  &gEfiEventReadyToBootGuid,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC EFI_EVENT mGuidedEvent[ARRAY_SIZE (mGuidedEventGuid)];
 | 
					STATIC EFI_EVENT  mGuidedEvent[ARRAY_SIZE (mGuidedEventGuid)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  Event notification that is fired when GUIDed Event Group is signaled.
 | 
					  Event notification that is fired when GUIDed Event Group is signaled.
 | 
				
			||||||
@@ -277,15 +307,15 @@ MmGuidedEventNotify (
 | 
				
			|||||||
  IN VOID       *Context
 | 
					  IN VOID       *Context
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_MM_COMMUNICATE_HEADER   Header;
 | 
					  EFI_MM_COMMUNICATE_HEADER  Header;
 | 
				
			||||||
  UINTN                       Size;
 | 
					  UINTN                      Size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Use Guid to initialize EFI_SMM_COMMUNICATE_HEADER structure
 | 
					  // Use Guid to initialize EFI_SMM_COMMUNICATE_HEADER structure
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  CopyGuid (&Header.HeaderGuid, Context);
 | 
					  CopyGuid (&Header.HeaderGuid, Context);
 | 
				
			||||||
  Header.MessageLength = 1;
 | 
					  Header.MessageLength = 1;
 | 
				
			||||||
  Header.Data[0] = 0;
 | 
					  Header.Data[0]       = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Size = sizeof (Header);
 | 
					  Size = sizeof (Header);
 | 
				
			||||||
  MmCommunication2Communicate (&mMmCommunication2, &Header, &Header, &Size);
 | 
					  MmCommunication2Communicate (&mMmCommunication2, &Header, &Header, &Size);
 | 
				
			||||||
@@ -308,23 +338,23 @@ MmGuidedEventNotify (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
MmCommunication2Initialize (
 | 
					MmCommunication2Initialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS                 Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
  UINTN                      Index;
 | 
					  UINTN       Index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check if we can make the MM call
 | 
					  // Check if we can make the MM call
 | 
				
			||||||
  Status = GetMmCompatibility ();
 | 
					  Status = GetMmCompatibility ();
 | 
				
			||||||
  if (EFI_ERROR(Status)) {
 | 
					  if (EFI_ERROR (Status)) {
 | 
				
			||||||
    goto ReturnErrorStatus;
 | 
					    goto ReturnErrorStatus;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mNsCommBuffMemRegion.PhysicalBase = PcdGet64 (PcdMmBufferBase);
 | 
					  mNsCommBuffMemRegion.PhysicalBase = PcdGet64 (PcdMmBufferBase);
 | 
				
			||||||
  // During boot , Virtual and Physical are same
 | 
					  // During boot , Virtual and Physical are same
 | 
				
			||||||
  mNsCommBuffMemRegion.VirtualBase = mNsCommBuffMemRegion.PhysicalBase;
 | 
					  mNsCommBuffMemRegion.VirtualBase = mNsCommBuffMemRegion.PhysicalBase;
 | 
				
			||||||
  mNsCommBuffMemRegion.Length = PcdGet64 (PcdMmBufferSize);
 | 
					  mNsCommBuffMemRegion.Length      = PcdGet64 (PcdMmBufferSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ASSERT (mNsCommBuffMemRegion.PhysicalBase != 0);
 | 
					  ASSERT (mNsCommBuffMemRegion.PhysicalBase != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -362,9 +398,12 @@ MmCommunication2Initialize (
 | 
				
			|||||||
                  EFI_NATIVE_INTERFACE,
 | 
					                  EFI_NATIVE_INTERFACE,
 | 
				
			||||||
                  &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>
 | 
				
			||||||
@@ -24,18 +23,18 @@
 | 
				
			|||||||
#include <Protocol/HardwareInterrupt.h>
 | 
					#include <Protocol/HardwareInterrupt.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The notification function to call on every timer interrupt.
 | 
					// The notification function to call on every timer interrupt.
 | 
				
			||||||
EFI_TIMER_NOTIFY      mTimerNotifyFunction     = (EFI_TIMER_NOTIFY)NULL;
 | 
					EFI_TIMER_NOTIFY  mTimerNotifyFunction     = (EFI_TIMER_NOTIFY)NULL;
 | 
				
			||||||
EFI_EVENT             EfiExitBootServicesEvent = (EFI_EVENT)NULL;
 | 
					EFI_EVENT         EfiExitBootServicesEvent = (EFI_EVENT)NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The current period of the timer interrupt
 | 
					// The current period of the timer interrupt
 | 
				
			||||||
UINT64 mTimerPeriod = 0;
 | 
					UINT64  mTimerPeriod = 0;
 | 
				
			||||||
// The latest Timer Tick calculated for mTimerPeriod
 | 
					// The latest Timer Tick calculated for mTimerPeriod
 | 
				
			||||||
UINT64 mTimerTicks = 0;
 | 
					UINT64  mTimerTicks = 0;
 | 
				
			||||||
// Number of elapsed period since the last Timer interrupt
 | 
					// Number of elapsed period since the last Timer interrupt
 | 
				
			||||||
UINT64 mElapsedPeriod = 1;
 | 
					UINT64  mElapsedPeriod = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Cached copy of the Hardware Interrupt protocol instance
 | 
					// Cached copy of the Hardware Interrupt protocol instance
 | 
				
			||||||
EFI_HARDWARE_INTERRUPT_PROTOCOL *gInterrupt = NULL;
 | 
					EFI_HARDWARE_INTERRUPT_PROTOCOL  *gInterrupt = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
  This function registers the handler NotifyFunction so it is called every time
 | 
					  This function registers the handler NotifyFunction so it is called every time
 | 
				
			||||||
@@ -133,9 +132,9 @@ TimerDriverSetTimerPeriod (
 | 
				
			|||||||
  IN UINT64                   TimerPeriod
 | 
					  IN UINT64                   TimerPeriod
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64      CounterValue;
 | 
					  UINT64   CounterValue;
 | 
				
			||||||
  UINT64      TimerTicks;
 | 
					  UINT64   TimerTicks;
 | 
				
			||||||
  EFI_TPL     OriginalTPL;
 | 
					  EFI_TPL  OriginalTPL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Always disable the timer
 | 
					  // Always disable the timer
 | 
				
			||||||
  ArmGenericTimerDisableTimer ();
 | 
					  ArmGenericTimerDisableTimer ();
 | 
				
			||||||
@@ -166,7 +165,7 @@ TimerDriverSetTimerPeriod (
 | 
				
			|||||||
    ArmGenericTimerEnableTimer ();
 | 
					    ArmGenericTimerEnableTimer ();
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    // Save the new timer period
 | 
					    // Save the new timer period
 | 
				
			||||||
    mTimerPeriod   = TimerPeriod;
 | 
					    mTimerPeriod = TimerPeriod;
 | 
				
			||||||
    // Reset the elapsed period
 | 
					    // Reset the elapsed period
 | 
				
			||||||
    mElapsedPeriod = 1;
 | 
					    mElapsedPeriod = 1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -192,8 +191,8 @@ TimerDriverSetTimerPeriod (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
TimerDriverGetTimerPeriod (
 | 
					TimerDriverGetTimerPeriod (
 | 
				
			||||||
  IN EFI_TIMER_ARCH_PROTOCOL   *This,
 | 
					  IN EFI_TIMER_ARCH_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT64                   *TimerPeriod
 | 
					  OUT UINT64                  *TimerPeriod
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (TimerPeriod == NULL) {
 | 
					  if (TimerPeriod == NULL) {
 | 
				
			||||||
@@ -262,7 +261,7 @@ TimerDriverGenerateSoftInterrupt (
 | 
				
			|||||||
  a period of time.
 | 
					  a period of time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_TIMER_ARCH_PROTOCOL   gTimer = {
 | 
					EFI_TIMER_ARCH_PROTOCOL  gTimer = {
 | 
				
			||||||
  TimerDriverRegisterHandler,
 | 
					  TimerDriverRegisterHandler,
 | 
				
			||||||
  TimerDriverSetTimerPeriod,
 | 
					  TimerDriverSetTimerPeriod,
 | 
				
			||||||
  TimerDriverGetTimerPeriod,
 | 
					  TimerDriverGetTimerPeriod,
 | 
				
			||||||
@@ -285,13 +284,13 @@ EFI_TIMER_ARCH_PROTOCOL   gTimer = {
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
TimerInterruptHandler (
 | 
					TimerInterruptHandler (
 | 
				
			||||||
  IN  HARDWARE_INTERRUPT_SOURCE   Source,
 | 
					  IN  HARDWARE_INTERRUPT_SOURCE  Source,
 | 
				
			||||||
  IN  EFI_SYSTEM_CONTEXT          SystemContext
 | 
					  IN  EFI_SYSTEM_CONTEXT         SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_TPL      OriginalTPL;
 | 
					  EFI_TPL  OriginalTPL;
 | 
				
			||||||
  UINT64       CurrentValue;
 | 
					  UINT64   CurrentValue;
 | 
				
			||||||
  UINT64       CompareValue;
 | 
					  UINT64   CompareValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // DXE core uses this callback for the EFI timer tick. The DXE core uses locks
 | 
					  // DXE core uses this callback for the EFI timer tick. The DXE core uses locks
 | 
				
			||||||
@@ -305,8 +304,7 @@ TimerInterruptHandler (
 | 
				
			|||||||
  gInterrupt->EndOfInterrupt (gInterrupt, Source);
 | 
					  gInterrupt->EndOfInterrupt (gInterrupt, Source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 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
 | 
				
			||||||
@@ -355,8 +352,8 @@ TimerInterruptHandler (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
TimerInitialize (
 | 
					TimerInitialize (
 | 
				
			||||||
  IN EFI_HANDLE         ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE   *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_HANDLE  Handle;
 | 
					  EFI_HANDLE  Handle;
 | 
				
			||||||
@@ -374,7 +371,7 @@ TimerInitialize (
 | 
				
			|||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Disable the timer
 | 
					  // Disable the timer
 | 
				
			||||||
  TimerCtrlReg = ArmGenericTimerGetTimerCtrlReg ();
 | 
					  TimerCtrlReg  = ArmGenericTimerGetTimerCtrlReg ();
 | 
				
			||||||
  TimerCtrlReg |= ARM_ARCH_TIMER_IMASK;
 | 
					  TimerCtrlReg |= ARM_ARCH_TIMER_IMASK;
 | 
				
			||||||
  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
  ArmGenericTimerSetTimerCtrlReg (TimerCtrlReg);
 | 
					  ArmGenericTimerSetTimerCtrlReg (TimerCtrlReg);
 | 
				
			||||||
@@ -405,17 +402,18 @@ TimerInitialize (
 | 
				
			|||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Set up default timer
 | 
					  // Set up default timer
 | 
				
			||||||
  Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32(PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
 | 
					  Status = TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32 (PcdTimerPeriod)); // TIMER_DEFAULT_PERIOD
 | 
				
			||||||
  ASSERT_EFI_ERROR (Status);
 | 
					  ASSERT_EFI_ERROR (Status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Handle = NULL;
 | 
					  Handle = NULL;
 | 
				
			||||||
  // 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Everything is ready, unmask and enable timer interrupts
 | 
					  // Everything is ready, unmask and enable timer interrupts
 | 
				
			||||||
  TimerCtrlReg = ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg = ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,16 +27,16 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "SemihostFs.h"
 | 
					#include "SemihostFs.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_SEMIHOST_FS_LABEL   L"SemihostFs"
 | 
					#define DEFAULT_SEMIHOST_FS_LABEL  L"SemihostFs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC CHAR16 *mSemihostFsLabel;
 | 
					STATIC CHAR16  *mSemihostFsLabel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gSemihostFs = {
 | 
					EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  gSemihostFs = {
 | 
				
			||||||
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
 | 
					  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
 | 
				
			||||||
  VolumeOpen
 | 
					  VolumeOpen
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_FILE gSemihostFsFile = {
 | 
					EFI_FILE  gSemihostFsFile = {
 | 
				
			||||||
  EFI_FILE_PROTOCOL_REVISION,
 | 
					  EFI_FILE_PROTOCOL_REVISION,
 | 
				
			||||||
  FileOpen,
 | 
					  FileOpen,
 | 
				
			||||||
  FileClose,
 | 
					  FileClose,
 | 
				
			||||||
@@ -54,43 +54,45 @@ EFI_FILE gSemihostFsFile = {
 | 
				
			|||||||
// Device path for semi-hosting. It contains our auto-generated Caller ID GUID.
 | 
					// Device path for semi-hosting. It contains our auto-generated Caller ID GUID.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  VENDOR_DEVICE_PATH        Guid;
 | 
					  VENDOR_DEVICE_PATH          Guid;
 | 
				
			||||||
  EFI_DEVICE_PATH_PROTOCOL  End;
 | 
					  EFI_DEVICE_PATH_PROTOCOL    End;
 | 
				
			||||||
} SEMIHOST_DEVICE_PATH;
 | 
					} SEMIHOST_DEVICE_PATH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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 {
 | 
				
			||||||
  LIST_ENTRY    Link;
 | 
					  LIST_ENTRY       Link;
 | 
				
			||||||
  UINT64        Signature;
 | 
					  UINT64           Signature;
 | 
				
			||||||
  EFI_FILE      File;
 | 
					  EFI_FILE         File;
 | 
				
			||||||
  CHAR8         *FileName;
 | 
					  CHAR8            *FileName;
 | 
				
			||||||
  UINT64        OpenMode;
 | 
					  UINT64           OpenMode;
 | 
				
			||||||
  UINT32        Position;
 | 
					  UINT32           Position;
 | 
				
			||||||
  UINTN         SemihostHandle;
 | 
					  UINTN            SemihostHandle;
 | 
				
			||||||
  BOOLEAN       IsRoot;
 | 
					  BOOLEAN          IsRoot;
 | 
				
			||||||
  EFI_FILE_INFO Info;
 | 
					  EFI_FILE_INFO    Info;
 | 
				
			||||||
} SEMIHOST_FCB;
 | 
					} SEMIHOST_FCB;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SEMIHOST_FCB_SIGNATURE      SIGNATURE_32( 'S', 'H', 'F', 'C' )
 | 
					#define SEMIHOST_FCB_SIGNATURE  SIGNATURE_32( 'S', 'H', 'F', 'C' )
 | 
				
			||||||
#define SEMIHOST_FCB_FROM_THIS(a)   CR(a, SEMIHOST_FCB, File, SEMIHOST_FCB_SIGNATURE)
 | 
					#define SEMIHOST_FCB_FROM_THIS(a)  CR(a, SEMIHOST_FCB, File, SEMIHOST_FCB_SIGNATURE)
 | 
				
			||||||
#define SEMIHOST_FCB_FROM_LINK(a)   CR(a, SEMIHOST_FCB, Link, SEMIHOST_FCB_SIGNATURE);
 | 
					#define SEMIHOST_FCB_FROM_LINK(a)  CR(a, SEMIHOST_FCB, Link, SEMIHOST_FCB_SIGNATURE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_HANDLE  gInstallHandle = NULL;
 | 
					EFI_HANDLE  gInstallHandle = NULL;
 | 
				
			||||||
LIST_ENTRY  gFileList = INITIALIZE_LIST_HEAD_VARIABLE (gFileList);
 | 
					LIST_ENTRY  gFileList      = INITIALIZE_LIST_HEAD_VARIABLE (gFileList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SEMIHOST_FCB *
 | 
					SEMIHOST_FCB *
 | 
				
			||||||
AllocateFCB (
 | 
					AllocateFCB (
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB *Fcb;
 | 
					  SEMIHOST_FCB  *Fcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = AllocateZeroPool (sizeof (SEMIHOST_FCB));
 | 
					  Fcb = AllocateZeroPool (sizeof (SEMIHOST_FCB));
 | 
				
			||||||
  if (Fcb != NULL) {
 | 
					  if (Fcb != NULL) {
 | 
				
			||||||
@@ -103,7 +105,7 @@ AllocateFCB (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
FreeFCB (
 | 
					FreeFCB (
 | 
				
			||||||
  IN SEMIHOST_FCB *Fcb
 | 
					  IN SEMIHOST_FCB  *Fcb
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Remove Fcb from gFileList.
 | 
					  // Remove Fcb from gFileList.
 | 
				
			||||||
@@ -115,15 +117,13 @@ 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,
 | 
				
			||||||
  OUT EFI_FILE                        **Root
 | 
					  OUT EFI_FILE                         **Root
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB *RootFcb;
 | 
					  SEMIHOST_FCB  *RootFcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Root == NULL) {
 | 
					  if (Root == NULL) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
@@ -134,7 +134,7 @@ VolumeOpen (
 | 
				
			|||||||
    return EFI_OUT_OF_RESOURCES;
 | 
					    return EFI_OUT_OF_RESOURCES;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  RootFcb->IsRoot = TRUE;
 | 
					  RootFcb->IsRoot         = TRUE;
 | 
				
			||||||
  RootFcb->Info.Attribute = EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY;
 | 
					  RootFcb->Info.Attribute = EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  InsertTailList (&gFileList, &RootFcb->Link);
 | 
					  InsertTailList (&gFileList, &RootFcb->Link);
 | 
				
			||||||
@@ -191,29 +191,33 @@ FileOpen (
 | 
				
			|||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Length = StrLen (FileName) + 1;
 | 
					  Length        = StrLen (FileName) + 1;
 | 
				
			||||||
  AsciiFileName = AllocatePool (Length);
 | 
					  AsciiFileName = AllocatePool (Length);
 | 
				
			||||||
  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)) {
 | 
				
			||||||
@@ -279,7 +284,7 @@ FileOpen (
 | 
				
			|||||||
  FileFcb->Info.FileSize     = Length;
 | 
					  FileFcb->Info.FileSize     = Length;
 | 
				
			||||||
  FileFcb->Info.PhysicalSize = Length;
 | 
					  FileFcb->Info.PhysicalSize = Length;
 | 
				
			||||||
  FileFcb->Info.Attribute    = ((OpenMode & EFI_FILE_MODE_CREATE) != 0) ?
 | 
					  FileFcb->Info.Attribute    = ((OpenMode & EFI_FILE_MODE_CREATE) != 0) ?
 | 
				
			||||||
                                 Attributes : 0;
 | 
					                               Attributes : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  InsertTailList (&gFileList, &FileFcb->Link);
 | 
					  InsertTailList (&gFileList, &FileFcb->Link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -308,7 +313,7 @@ STATIC
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
TruncateFile (
 | 
					TruncateFile (
 | 
				
			||||||
  IN CHAR8  *FileName,
 | 
					  IN CHAR8  *FileName,
 | 
				
			||||||
  IN UINTN   Size
 | 
					  IN UINTN  Size
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS     Status;
 | 
					  EFI_STATUS     Status;
 | 
				
			||||||
@@ -338,7 +343,7 @@ TruncateFile (
 | 
				
			|||||||
    goto Error;
 | 
					    goto Error;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Read = 0;
 | 
					  Read      = 0;
 | 
				
			||||||
  Remaining = Size;
 | 
					  Remaining = Size;
 | 
				
			||||||
  while (Remaining > 0) {
 | 
					  while (Remaining > 0) {
 | 
				
			||||||
    ToRead = Remaining;
 | 
					    ToRead = Remaining;
 | 
				
			||||||
@@ -346,11 +351,12 @@ TruncateFile (
 | 
				
			|||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      goto Error;
 | 
					      goto Error;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Remaining -= ToRead;
 | 
					    Remaining -= ToRead;
 | 
				
			||||||
    Read      += ToRead;
 | 
					    Read      += ToRead;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Return = SemihostFileClose (FileHandle);
 | 
					  Return     = SemihostFileClose (FileHandle);
 | 
				
			||||||
  FileHandle = 0;
 | 
					  FileHandle = 0;
 | 
				
			||||||
  if (RETURN_ERROR (Return)) {
 | 
					  if (RETURN_ERROR (Return)) {
 | 
				
			||||||
    goto Error;
 | 
					    goto Error;
 | 
				
			||||||
@@ -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);
 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -402,13 +408,13 @@ FileClose (
 | 
				
			|||||||
  IN EFI_FILE  *This
 | 
					  IN EFI_FILE  *This
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB   *Fcb;
 | 
					  SEMIHOST_FCB  *Fcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (This == NULL) {
 | 
					  if (This == NULL) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS(This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!Fcb->IsRoot) {
 | 
					  if (!Fcb->IsRoot) {
 | 
				
			||||||
    SemihostFileClose (Fcb->SemihostHandle);
 | 
					    SemihostFileClose (Fcb->SemihostHandle);
 | 
				
			||||||
@@ -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);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -441,7 +448,7 @@ FileClose (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileDelete (
 | 
					FileDelete (
 | 
				
			||||||
  IN EFI_FILE *This
 | 
					  IN EFI_FILE  *This
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB   *Fcb;
 | 
					  SEMIHOST_FCB   *Fcb;
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
@@ -566,14 +574,15 @@ ExtendFile (
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Remaining = Size;
 | 
					  Remaining = Size;
 | 
				
			||||||
  SetMem (WriteBuffer, 0, sizeof(WriteBuffer));
 | 
					  SetMem (WriteBuffer, 0, sizeof (WriteBuffer));
 | 
				
			||||||
  while (Remaining > 0) {
 | 
					  while (Remaining > 0) {
 | 
				
			||||||
    WriteNb = MIN (Remaining, sizeof(WriteBuffer));
 | 
					    WriteNb   = MIN (Remaining, sizeof (WriteBuffer));
 | 
				
			||||||
    WriteSize = WriteNb;
 | 
					    WriteSize = WriteNb;
 | 
				
			||||||
    Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, WriteBuffer);
 | 
					    Return    = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, WriteBuffer);
 | 
				
			||||||
    if (RETURN_ERROR (Return)) {
 | 
					    if (RETURN_ERROR (Return)) {
 | 
				
			||||||
      return EFI_DEVICE_ERROR;
 | 
					      return EFI_DEVICE_ERROR;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Remaining -= WriteNb;
 | 
					    Remaining -= WriteNb;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -599,9 +608,9 @@ ExtendFile (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileWrite (
 | 
					FileWrite (
 | 
				
			||||||
  IN     EFI_FILE *This,
 | 
					  IN     EFI_FILE  *This,
 | 
				
			||||||
  IN OUT UINTN    *BufferSize,
 | 
					  IN OUT UINTN     *BufferSize,
 | 
				
			||||||
  IN     VOID     *Buffer
 | 
					  IN     VOID      *Buffer
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB   *Fcb;
 | 
					  SEMIHOST_FCB   *Fcb;
 | 
				
			||||||
@@ -617,8 +626,9 @@ FileWrite (
 | 
				
			|||||||
  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 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,11 +642,12 @@ FileWrite (
 | 
				
			|||||||
    if (EFI_ERROR (Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      return Status;
 | 
					      return Status;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Fcb->Info.FileSize = Fcb->Position;
 | 
					    Fcb->Info.FileSize = Fcb->Position;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  WriteSize = *BufferSize;
 | 
					  WriteSize = *BufferSize;
 | 
				
			||||||
  Return = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, Buffer);
 | 
					  Return    = SemihostFileWrite (Fcb->SemihostHandle, &WriteSize, Buffer);
 | 
				
			||||||
  if (RETURN_ERROR (Return)) {
 | 
					  if (RETURN_ERROR (Return)) {
 | 
				
			||||||
    return EFI_DEVICE_ERROR;
 | 
					    return EFI_DEVICE_ERROR;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
@@ -668,17 +680,17 @@ FileWrite (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileGetPosition (
 | 
					FileGetPosition (
 | 
				
			||||||
  IN  EFI_FILE    *This,
 | 
					  IN  EFI_FILE  *This,
 | 
				
			||||||
  OUT UINT64      *Position
 | 
					  OUT UINT64    *Position
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB *Fcb;
 | 
					  SEMIHOST_FCB  *Fcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((This == NULL) || (Position == NULL)) {
 | 
					  if ((This == NULL) || (Position == NULL)) {
 | 
				
			||||||
    return EFI_INVALID_PARAMETER;
 | 
					    return EFI_INVALID_PARAMETER;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS(This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  *Position = Fcb->Position;
 | 
					  *Position = Fcb->Position;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -701,8 +713,8 @@ FileGetPosition (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileSetPosition (
 | 
					FileSetPosition (
 | 
				
			||||||
  IN EFI_FILE *This,
 | 
					  IN EFI_FILE  *This,
 | 
				
			||||||
  IN UINT64   Position
 | 
					  IN UINT64    Position
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB   *Fcb;
 | 
					  SEMIHOST_FCB   *Fcb;
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
@@ -760,14 +772,14 @@ GetFileInfo (
 | 
				
			|||||||
  OUT    VOID          *Buffer
 | 
					  OUT    VOID          *Buffer
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_FILE_INFO   *Info;
 | 
					  EFI_FILE_INFO  *Info;
 | 
				
			||||||
  UINTN           NameSize;
 | 
					  UINTN          NameSize;
 | 
				
			||||||
  UINTN           ResultSize;
 | 
					  UINTN          ResultSize;
 | 
				
			||||||
  UINTN           Index;
 | 
					  UINTN          Index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Fcb->IsRoot) {
 | 
					  if (Fcb->IsRoot) {
 | 
				
			||||||
    NameSize = 0;
 | 
					    NameSize   = 0;
 | 
				
			||||||
    ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof(CHAR16);
 | 
					    ResultSize = SIZE_OF_EFI_FILE_INFO + sizeof (CHAR16);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    NameSize   = AsciiStrLen (Fcb->FileName) + 1;
 | 
					    NameSize   = AsciiStrLen (Fcb->FileName) + 1;
 | 
				
			||||||
    ResultSize = SIZE_OF_EFI_FILE_INFO + NameSize * sizeof (CHAR16);
 | 
					    ResultSize = SIZE_OF_EFI_FILE_INFO + NameSize * sizeof (CHAR16);
 | 
				
			||||||
@@ -787,7 +799,7 @@ GetFileInfo (
 | 
				
			|||||||
  Info->Size = ResultSize;
 | 
					  Info->Size = ResultSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Fcb->IsRoot) {
 | 
					  if (Fcb->IsRoot) {
 | 
				
			||||||
    Info->FileName[0]  = L'\0';
 | 
					    Info->FileName[0] = L'\0';
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    for (Index = 0; Index < NameSize; Index++) {
 | 
					    for (Index = 0; Index < NameSize; Index++) {
 | 
				
			||||||
      Info->FileName[Index] = Fcb->FileName[Index];
 | 
					      Info->FileName[Index] = Fcb->FileName[Index];
 | 
				
			||||||
@@ -818,9 +830,9 @@ GetFileInfo (
 | 
				
			|||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
GetFilesystemInfo (
 | 
					GetFilesystemInfo (
 | 
				
			||||||
  IN     SEMIHOST_FCB *Fcb,
 | 
					  IN     SEMIHOST_FCB  *Fcb,
 | 
				
			||||||
  IN OUT UINTN        *BufferSize,
 | 
					  IN OUT UINTN         *BufferSize,
 | 
				
			||||||
  OUT    VOID         *Buffer
 | 
					  OUT    VOID          *Buffer
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_FILE_SYSTEM_INFO  *Info;
 | 
					  EFI_FILE_SYSTEM_INFO  *Info;
 | 
				
			||||||
@@ -882,18 +894,19 @@ FileGetInfo (
 | 
				
			|||||||
  OUT    VOID      *Buffer
 | 
					  OUT    VOID      *Buffer
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB *Fcb;
 | 
					  SEMIHOST_FCB  *Fcb;
 | 
				
			||||||
  EFI_STATUS   Status;
 | 
					  EFI_STATUS    Status;
 | 
				
			||||||
  UINTN        ResultSize;
 | 
					  UINTN         ResultSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS(This);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS (This);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
 | 
					  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
 | 
				
			||||||
    Status = GetFilesystemInfo (Fcb, BufferSize, Buffer);
 | 
					    Status = GetFilesystemInfo (Fcb, BufferSize, Buffer);
 | 
				
			||||||
@@ -963,11 +976,12 @@ SetFileInfo (
 | 
				
			|||||||
    return EFI_ACCESS_DENIED;
 | 
					    return EFI_ACCESS_DENIED;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Length = StrLen (Info->FileName) + 1;
 | 
					  Length        = StrLen (Info->FileName) + 1;
 | 
				
			||||||
  AsciiFileName = AllocatePool (Length);
 | 
					  AsciiFileName = AllocatePool (Length);
 | 
				
			||||||
  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) {
 | 
				
			||||||
@@ -1155,18 +1179,19 @@ FileSetInfo (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileFlush (
 | 
					FileFlush (
 | 
				
			||||||
  IN EFI_FILE *File
 | 
					  IN EFI_FILE  *File
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  SEMIHOST_FCB *Fcb;
 | 
					  SEMIHOST_FCB  *Fcb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Fcb = SEMIHOST_FCB_FROM_THIS(File);
 | 
					  Fcb = SEMIHOST_FCB_FROM_THIS (File);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (Fcb->IsRoot) {
 | 
					  if (Fcb->IsRoot) {
 | 
				
			||||||
    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;
 | 
				
			||||||
@@ -1176,11 +1201,11 @@ FileFlush (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
SemihostFsEntryPoint (
 | 
					SemihostFsEntryPoint (
 | 
				
			||||||
  IN EFI_HANDLE           ImageHandle,
 | 
					  IN EFI_HANDLE        ImageHandle,
 | 
				
			||||||
  IN EFI_SYSTEM_TABLE     *SystemTable
 | 
					  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  EFI_STATUS    Status;
 | 
					  EFI_STATUS  Status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = EFI_NOT_FOUND;
 | 
					  Status = EFI_NOT_FOUND;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1192,12 +1217,14 @@ SemihostFsEntryPoint (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Status = gBS->InstallMultipleProtocolInterfaces (
 | 
					    Status = gBS->InstallMultipleProtocolInterfaces (
 | 
				
			||||||
                    &gInstallHandle,
 | 
					                    &gInstallHandle,
 | 
				
			||||||
                    &gEfiSimpleFileSystemProtocolGuid, &gSemihostFs,
 | 
					                    &gEfiSimpleFileSystemProtocolGuid,
 | 
				
			||||||
                    &gEfiDevicePathProtocolGuid,       &gDevicePath,
 | 
					                    &gSemihostFs,
 | 
				
			||||||
 | 
					                    &gEfiDevicePathProtocolGuid,
 | 
				
			||||||
 | 
					                    &gDevicePath,
 | 
				
			||||||
                    NULL
 | 
					                    NULL
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (EFI_ERROR(Status)) {
 | 
					    if (EFI_ERROR (Status)) {
 | 
				
			||||||
      FreePool (mSemihostFsLabel);
 | 
					      FreePool (mSemihostFsLabel);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,8 +12,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
VolumeOpen (
 | 
					VolumeOpen (
 | 
				
			||||||
  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
 | 
					  IN  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL  *This,
 | 
				
			||||||
  OUT EFI_FILE                        **Root
 | 
					  OUT EFI_FILE                         **Root
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -79,7 +79,7 @@ FileClose (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileDelete (
 | 
					FileDelete (
 | 
				
			||||||
  IN EFI_FILE *This
 | 
					  IN EFI_FILE  *This
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -127,9 +127,9 @@ FileRead (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileWrite (
 | 
					FileWrite (
 | 
				
			||||||
  IN     EFI_FILE *This,
 | 
					  IN     EFI_FILE  *This,
 | 
				
			||||||
  IN OUT UINTN    *BufferSize,
 | 
					  IN OUT UINTN     *BufferSize,
 | 
				
			||||||
  IN     VOID     *Buffer
 | 
					  IN     VOID      *Buffer
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -145,8 +145,8 @@ FileWrite (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileGetPosition (
 | 
					FileGetPosition (
 | 
				
			||||||
  IN  EFI_FILE    *File,
 | 
					  IN  EFI_FILE  *File,
 | 
				
			||||||
  OUT UINT64      *Position
 | 
					  OUT UINT64    *Position
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -164,8 +164,8 @@ FileGetPosition (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileSetPosition (
 | 
					FileSetPosition (
 | 
				
			||||||
  IN EFI_FILE *File,
 | 
					  IN EFI_FILE  *File,
 | 
				
			||||||
  IN UINT64   Position
 | 
					  IN UINT64    Position
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -239,8 +239,7 @@ FileSetInfo (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
FileFlush (
 | 
					FileFlush (
 | 
				
			||||||
  IN EFI_FILE *File
 | 
					  IN EFI_FILE  *File
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // SEMIHOST_FS_H_
 | 
					#endif // SEMIHOST_FS_H_
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -20,7 +19,7 @@
 | 
				
			|||||||
  .p2align  2                     ; \
 | 
					  .p2align  2                     ; \
 | 
				
			||||||
  Name:
 | 
					  Name:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ASM_FUNC(Name)            _ASM_FUNC(ASM_PFX(Name), .text. ## Name)
 | 
					#define ASM_FUNC(Name)  _ASM_FUNC(ASM_PFX(Name), .text. ## Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MOV32(Reg, Val)                       \
 | 
					#define MOV32(Reg, Val)                       \
 | 
				
			||||||
  movw      Reg, #(Val) & 0xffff            ; \
 | 
					  movw      Reg, #(Val) & 0xffff            ; \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.
 | 
				
			||||||
@@ -42,7 +40,7 @@
 | 
				
			|||||||
  .type     Name, %function       ; \
 | 
					  .type     Name, %function       ; \
 | 
				
			||||||
  Name:
 | 
					  Name:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ASM_FUNC(Name)            _ASM_FUNC(ASM_PFX(Name), .text. ## Name)
 | 
					#define ASM_FUNC(Name)  _ASM_FUNC(ASM_PFX(Name), .text. ## Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MOV32(Reg, Val)                   \
 | 
					#define MOV32(Reg, Val)                   \
 | 
				
			||||||
  movz      Reg, (Val) >> 16, lsl #16   ; \
 | 
					  movz      Reg, (Val) >> 16, lsl #16   ; \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,108 +13,108 @@
 | 
				
			|||||||
#include <Chipset/AArch64Mmu.h>
 | 
					#include <Chipset/AArch64Mmu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ARM Interrupt ID in Exception Table
 | 
					// ARM Interrupt ID in Exception Table
 | 
				
			||||||
#define ARM_ARCH_EXCEPTION_IRQ            EXCEPT_AARCH64_IRQ
 | 
					#define ARM_ARCH_EXCEPTION_IRQ  EXCEPT_AARCH64_IRQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CPACR - Coprocessor Access Control Register definitions
 | 
					// CPACR - Coprocessor Access Control Register definitions
 | 
				
			||||||
#define CPACR_TTA_EN            (1UL << 28)
 | 
					#define CPACR_TTA_EN          (1UL << 28)
 | 
				
			||||||
#define CPACR_FPEN_EL1          (1UL << 20)
 | 
					#define CPACR_FPEN_EL1        (1UL << 20)
 | 
				
			||||||
#define CPACR_FPEN_FULL         (3UL << 20)
 | 
					#define CPACR_FPEN_FULL       (3UL << 20)
 | 
				
			||||||
#define CPACR_CP_FULL_ACCESS    0x300000
 | 
					#define CPACR_CP_FULL_ACCESS  0x300000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Coprocessor Trap Register (CPTR)
 | 
					// Coprocessor Trap Register (CPTR)
 | 
				
			||||||
#define AARCH64_CPTR_TFP        (1 << 10)
 | 
					#define AARCH64_CPTR_TFP  (1 << 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ID_AA64PFR0 - AArch64 Processor Feature Register 0 definitions
 | 
					// ID_AA64PFR0 - AArch64 Processor Feature Register 0 definitions
 | 
				
			||||||
#define AARCH64_PFR0_FP         (0xF << 16)
 | 
					#define AARCH64_PFR0_FP   (0xF << 16)
 | 
				
			||||||
#define AARCH64_PFR0_GIC        (0xF << 24)
 | 
					#define AARCH64_PFR0_GIC  (0xF << 24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SCR - Secure Configuration Register definitions
 | 
					// SCR - Secure Configuration Register definitions
 | 
				
			||||||
#define SCR_NS                  (1 << 0)
 | 
					#define SCR_NS   (1 << 0)
 | 
				
			||||||
#define SCR_IRQ                 (1 << 1)
 | 
					#define SCR_IRQ  (1 << 1)
 | 
				
			||||||
#define SCR_FIQ                 (1 << 2)
 | 
					#define SCR_FIQ  (1 << 2)
 | 
				
			||||||
#define SCR_EA                  (1 << 3)
 | 
					#define SCR_EA   (1 << 3)
 | 
				
			||||||
#define SCR_FW                  (1 << 4)
 | 
					#define SCR_FW   (1 << 4)
 | 
				
			||||||
#define SCR_AW                  (1 << 5)
 | 
					#define SCR_AW   (1 << 5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MIDR - Main ID Register definitions
 | 
					// MIDR - Main ID Register definitions
 | 
				
			||||||
#define ARM_CPU_TYPE_SHIFT      4
 | 
					#define ARM_CPU_TYPE_SHIFT  4
 | 
				
			||||||
#define ARM_CPU_TYPE_MASK       0xFFF
 | 
					#define ARM_CPU_TYPE_MASK   0xFFF
 | 
				
			||||||
#define ARM_CPU_TYPE_AEMV8      0xD0F
 | 
					#define ARM_CPU_TYPE_AEMV8  0xD0F
 | 
				
			||||||
#define ARM_CPU_TYPE_A53        0xD03
 | 
					#define ARM_CPU_TYPE_A53    0xD03
 | 
				
			||||||
#define ARM_CPU_TYPE_A57        0xD07
 | 
					#define ARM_CPU_TYPE_A57    0xD07
 | 
				
			||||||
#define ARM_CPU_TYPE_A72        0xD08
 | 
					#define ARM_CPU_TYPE_A72    0xD08
 | 
				
			||||||
#define ARM_CPU_TYPE_A15        0xC0F
 | 
					#define ARM_CPU_TYPE_A15    0xC0F
 | 
				
			||||||
#define ARM_CPU_TYPE_A9         0xC09
 | 
					#define ARM_CPU_TYPE_A9     0xC09
 | 
				
			||||||
#define ARM_CPU_TYPE_A7         0xC07
 | 
					#define ARM_CPU_TYPE_A7     0xC07
 | 
				
			||||||
#define ARM_CPU_TYPE_A5         0xC05
 | 
					#define ARM_CPU_TYPE_A5     0xC05
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_CPU_REV_MASK        ((0xF << 20) | (0xF) )
 | 
					#define ARM_CPU_REV_MASK  ((0xF << 20) | (0xF) )
 | 
				
			||||||
#define ARM_CPU_REV(rn, pn)     ((((rn) & 0xF) << 20) | ((pn) & 0xF))
 | 
					#define ARM_CPU_REV(rn, pn)  ((((rn) & 0xF) << 20) | ((pn) & 0xF))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Hypervisor Configuration Register
 | 
					// Hypervisor Configuration Register
 | 
				
			||||||
#define ARM_HCR_FMO       BIT3
 | 
					#define ARM_HCR_FMO  BIT3
 | 
				
			||||||
#define ARM_HCR_IMO       BIT4
 | 
					#define ARM_HCR_IMO  BIT4
 | 
				
			||||||
#define ARM_HCR_AMO       BIT5
 | 
					#define ARM_HCR_AMO  BIT5
 | 
				
			||||||
#define ARM_HCR_TSC       BIT19
 | 
					#define ARM_HCR_TSC  BIT19
 | 
				
			||||||
#define ARM_HCR_TGE       BIT27
 | 
					#define ARM_HCR_TGE  BIT27
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Exception Syndrome Register
 | 
					// Exception Syndrome Register
 | 
				
			||||||
#define AARCH64_ESR_EC(Ecr)    ((0x3F << 26) & (Ecr))
 | 
					#define AARCH64_ESR_EC(Ecr)   ((0x3F << 26) & (Ecr))
 | 
				
			||||||
#define AARCH64_ESR_ISS(Ecr)   ((0x1FFFFFF) & (Ecr))
 | 
					#define AARCH64_ESR_ISS(Ecr)  ((0x1FFFFFF) & (Ecr))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define AARCH64_ESR_EC_SMC32   (0x13 << 26)
 | 
					#define AARCH64_ESR_EC_SMC32  (0x13 << 26)
 | 
				
			||||||
#define AARCH64_ESR_EC_SMC64   (0x17 << 26)
 | 
					#define AARCH64_ESR_EC_SMC64  (0x17 << 26)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AArch64 Exception Level
 | 
					// AArch64 Exception Level
 | 
				
			||||||
#define AARCH64_EL3       0xC
 | 
					#define AARCH64_EL3  0xC
 | 
				
			||||||
#define AARCH64_EL2       0x8
 | 
					#define AARCH64_EL2  0x8
 | 
				
			||||||
#define AARCH64_EL1       0x4
 | 
					#define AARCH64_EL1  0x4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Saved Program Status Register definitions
 | 
					// Saved Program Status Register definitions
 | 
				
			||||||
#define SPSR_A                  BIT8
 | 
					#define SPSR_A  BIT8
 | 
				
			||||||
#define SPSR_I                  BIT7
 | 
					#define SPSR_I  BIT7
 | 
				
			||||||
#define SPSR_F                  BIT6
 | 
					#define SPSR_F  BIT6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPSR_AARCH32            BIT4
 | 
					#define SPSR_AARCH32  BIT4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPSR_AARCH32_MODE_USER  0x0
 | 
					#define SPSR_AARCH32_MODE_USER   0x0
 | 
				
			||||||
#define SPSR_AARCH32_MODE_FIQ   0x1
 | 
					#define SPSR_AARCH32_MODE_FIQ    0x1
 | 
				
			||||||
#define SPSR_AARCH32_MODE_IRQ   0x2
 | 
					#define SPSR_AARCH32_MODE_IRQ    0x2
 | 
				
			||||||
#define SPSR_AARCH32_MODE_SVC   0x3
 | 
					#define SPSR_AARCH32_MODE_SVC    0x3
 | 
				
			||||||
#define SPSR_AARCH32_MODE_ABORT 0x7
 | 
					#define SPSR_AARCH32_MODE_ABORT  0x7
 | 
				
			||||||
#define SPSR_AARCH32_MODE_UNDEF 0xB
 | 
					#define SPSR_AARCH32_MODE_UNDEF  0xB
 | 
				
			||||||
#define SPSR_AARCH32_MODE_SYS   0xF
 | 
					#define SPSR_AARCH32_MODE_SYS    0xF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Counter-timer Hypervisor Control register definitions
 | 
					// Counter-timer Hypervisor Control register definitions
 | 
				
			||||||
#define CNTHCTL_EL2_EL1PCTEN    BIT0
 | 
					#define CNTHCTL_EL2_EL1PCTEN  BIT0
 | 
				
			||||||
#define CNTHCTL_EL2_EL1PCEN     BIT1
 | 
					#define CNTHCTL_EL2_EL1PCEN   BIT1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_VECTOR_TABLE_ALIGNMENT ((1 << 11)-1)
 | 
					#define ARM_VECTOR_TABLE_ALIGNMENT  ((1 << 11)-1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Vector table offset definitions
 | 
					// Vector table offset definitions
 | 
				
			||||||
#define ARM_VECTOR_CUR_SP0_SYNC 0x000
 | 
					#define ARM_VECTOR_CUR_SP0_SYNC  0x000
 | 
				
			||||||
#define ARM_VECTOR_CUR_SP0_IRQ  0x080
 | 
					#define ARM_VECTOR_CUR_SP0_IRQ   0x080
 | 
				
			||||||
#define ARM_VECTOR_CUR_SP0_FIQ  0x100
 | 
					#define ARM_VECTOR_CUR_SP0_FIQ   0x100
 | 
				
			||||||
#define ARM_VECTOR_CUR_SP0_SERR 0x180
 | 
					#define ARM_VECTOR_CUR_SP0_SERR  0x180
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_VECTOR_CUR_SPX_SYNC 0x200
 | 
					#define ARM_VECTOR_CUR_SPX_SYNC  0x200
 | 
				
			||||||
#define ARM_VECTOR_CUR_SPX_IRQ  0x280
 | 
					#define ARM_VECTOR_CUR_SPX_IRQ   0x280
 | 
				
			||||||
#define ARM_VECTOR_CUR_SPX_FIQ  0x300
 | 
					#define ARM_VECTOR_CUR_SPX_FIQ   0x300
 | 
				
			||||||
#define ARM_VECTOR_CUR_SPX_SERR 0x380
 | 
					#define ARM_VECTOR_CUR_SPX_SERR  0x380
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_VECTOR_LOW_A64_SYNC 0x400
 | 
					#define ARM_VECTOR_LOW_A64_SYNC  0x400
 | 
				
			||||||
#define ARM_VECTOR_LOW_A64_IRQ  0x480
 | 
					#define ARM_VECTOR_LOW_A64_IRQ   0x480
 | 
				
			||||||
#define ARM_VECTOR_LOW_A64_FIQ  0x500
 | 
					#define ARM_VECTOR_LOW_A64_FIQ   0x500
 | 
				
			||||||
#define ARM_VECTOR_LOW_A64_SERR 0x580
 | 
					#define ARM_VECTOR_LOW_A64_SERR  0x580
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_VECTOR_LOW_A32_SYNC 0x600
 | 
					#define ARM_VECTOR_LOW_A32_SYNC  0x600
 | 
				
			||||||
#define ARM_VECTOR_LOW_A32_IRQ  0x680
 | 
					#define ARM_VECTOR_LOW_A32_IRQ   0x680
 | 
				
			||||||
#define ARM_VECTOR_LOW_A32_FIQ  0x700
 | 
					#define ARM_VECTOR_LOW_A32_FIQ   0x700
 | 
				
			||||||
#define ARM_VECTOR_LOW_A32_SERR 0x780
 | 
					#define ARM_VECTOR_LOW_A32_SERR  0x780
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The ID_AA64MMFR2_EL1 register was added in ARMv8.2. Since we
 | 
					// The ID_AA64MMFR2_EL1 register was added in ARMv8.2. Since we
 | 
				
			||||||
// build for ARMv8.0, we need to define the register here.
 | 
					// build for ARMv8.0, we need to define the register here.
 | 
				
			||||||
#define ID_AA64MMFR2_EL1 S3_0_C0_C7_2
 | 
					#define ID_AA64MMFR2_EL1  S3_0_C0_C7_2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define VECTOR_BASE(tbl)          \
 | 
					#define VECTOR_BASE(tbl)          \
 | 
				
			||||||
  .section .text.##tbl##,"ax";    \
 | 
					  .section .text.##tbl##,"ax";    \
 | 
				
			||||||
@@ -151,7 +151,7 @@ ArmReadTpidrurw (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteTpidrurw (
 | 
					ArmWriteTpidrurw (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -163,7 +163,7 @@ ArmGetTCR (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetTCR (
 | 
					ArmSetTCR (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -175,7 +175,7 @@ ArmGetMAIR (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetMAIR (
 | 
					ArmSetMAIR (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -210,7 +210,7 @@ ArmDisableAllExceptions (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmWriteHcr (
 | 
					ArmWriteHcr (
 | 
				
			||||||
  IN UINTN Hcr
 | 
					  IN UINTN  Hcr
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -225,7 +225,7 @@ ArmReadCurrentEL (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
ArmWriteCptr (
 | 
					ArmWriteCptr (
 | 
				
			||||||
  IN  UINT64 Cptr
 | 
					  IN  UINT64  Cptr
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
@@ -235,7 +235,7 @@ ArmReadCntHctl (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmWriteCntHctl (
 | 
					ArmWriteCntHctl (
 | 
				
			||||||
  IN UINT32 CntHctl
 | 
					  IN UINT32  CntHctl
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // AARCH64_H_
 | 
					#endif // AARCH64_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,12 +12,12 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// Memory Attribute Indirection register Definitions
 | 
					// Memory Attribute Indirection register Definitions
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define MAIR_ATTR_DEVICE_MEMORY                 0x0ULL
 | 
					#define MAIR_ATTR_DEVICE_MEMORY                0x0ULL
 | 
				
			||||||
#define MAIR_ATTR_NORMAL_MEMORY_NON_CACHEABLE   0x44ULL
 | 
					#define MAIR_ATTR_NORMAL_MEMORY_NON_CACHEABLE  0x44ULL
 | 
				
			||||||
#define MAIR_ATTR_NORMAL_MEMORY_WRITE_THROUGH   0xBBULL
 | 
					#define MAIR_ATTR_NORMAL_MEMORY_WRITE_THROUGH  0xBBULL
 | 
				
			||||||
#define MAIR_ATTR_NORMAL_MEMORY_WRITE_BACK      0xFFULL
 | 
					#define MAIR_ATTR_NORMAL_MEMORY_WRITE_BACK     0xFFULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAIR_ATTR(n,value)                      ((value) << (((n) >> 2)*8))
 | 
					#define MAIR_ATTR(n, value)  ((value) << (((n) >> 2)*8))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Long-descriptor Translation Table format
 | 
					// Long-descriptor Translation Table format
 | 
				
			||||||
@@ -27,7 +27,7 @@
 | 
				
			|||||||
// The first offset starts at 12bit. There are 4 levels of 9-bit address range from level 3 to level 0
 | 
					// The first offset starts at 12bit. There are 4 levels of 9-bit address range from level 3 to level 0
 | 
				
			||||||
#define TT_ADDRESS_OFFSET_AT_LEVEL(TableLevel)  (12 + ((3 - (TableLevel)) * 9))
 | 
					#define TT_ADDRESS_OFFSET_AT_LEVEL(TableLevel)  (12 + ((3 - (TableLevel)) * 9))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_BLOCK_ENTRY_SIZE_AT_LEVEL(Level)     (1ULL << TT_ADDRESS_OFFSET_AT_LEVEL(Level))
 | 
					#define TT_BLOCK_ENTRY_SIZE_AT_LEVEL(Level)  (1ULL << TT_ADDRESS_OFFSET_AT_LEVEL(Level))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get the associated entry in the given Translation Table
 | 
					// Get the associated entry in the given Translation Table
 | 
				
			||||||
#define TT_GET_ENTRY_FOR_ADDRESS(TranslationTable, Level, Address)  \
 | 
					#define TT_GET_ENTRY_FOR_ADDRESS(TranslationTable, Level, Address)  \
 | 
				
			||||||
@@ -35,164 +35,161 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Return the smallest address granularity from the table level.
 | 
					// Return the smallest address granularity from the table level.
 | 
				
			||||||
// The first offset starts at 12bit. There are 4 levels of 9-bit address range from level 3 to level 0
 | 
					// The first offset starts at 12bit. There are 4 levels of 9-bit address range from level 3 to level 0
 | 
				
			||||||
#define TT_ADDRESS_AT_LEVEL(TableLevel)       (1ULL << TT_ADDRESS_OFFSET_AT_LEVEL(TableLevel))
 | 
					#define TT_ADDRESS_AT_LEVEL(TableLevel)  (1ULL << TT_ADDRESS_OFFSET_AT_LEVEL(TableLevel))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount) \
 | 
					#define TT_LAST_BLOCK_ADDRESS(TranslationTable, EntryCount) \
 | 
				
			||||||
    ((UINT64*)((EFI_PHYSICAL_ADDRESS)(TranslationTable) + (((EntryCount) - 1) * sizeof(UINT64))))
 | 
					    ((UINT64*)((EFI_PHYSICAL_ADDRESS)(TranslationTable) + (((EntryCount) - 1) * sizeof(UINT64))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// There are 512 entries per table when 4K Granularity
 | 
					// There are 512 entries per table when 4K Granularity
 | 
				
			||||||
#define TT_ENTRY_COUNT                          512
 | 
					#define TT_ENTRY_COUNT                  512
 | 
				
			||||||
#define TT_ALIGNMENT_BLOCK_ENTRY                BIT12
 | 
					#define TT_ALIGNMENT_BLOCK_ENTRY        BIT12
 | 
				
			||||||
#define TT_ALIGNMENT_DESCRIPTION_TABLE          BIT12
 | 
					#define TT_ALIGNMENT_DESCRIPTION_TABLE  BIT12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_ADDRESS_MASK_BLOCK_ENTRY             (0xFFFFFFFFFULL << 12)
 | 
					#define TT_ADDRESS_MASK_BLOCK_ENTRY        (0xFFFFFFFFFULL << 12)
 | 
				
			||||||
#define TT_ADDRESS_MASK_DESCRIPTION_TABLE       (0xFFFFFFFFFULL << 12)
 | 
					#define TT_ADDRESS_MASK_DESCRIPTION_TABLE  (0xFFFFFFFFFULL << 12)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_TYPE_MASK                            0x3
 | 
					#define TT_TYPE_MASK                0x3
 | 
				
			||||||
#define TT_TYPE_TABLE_ENTRY                     0x3
 | 
					#define TT_TYPE_TABLE_ENTRY         0x3
 | 
				
			||||||
#define TT_TYPE_BLOCK_ENTRY                     0x1
 | 
					#define TT_TYPE_BLOCK_ENTRY         0x1
 | 
				
			||||||
#define TT_TYPE_BLOCK_ENTRY_LEVEL3              0x3
 | 
					#define TT_TYPE_BLOCK_ENTRY_LEVEL3  0x3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_ATTR_INDX_MASK                       (0x7 << 2)
 | 
					#define TT_ATTR_INDX_MASK                  (0x7 << 2)
 | 
				
			||||||
#define TT_ATTR_INDX_DEVICE_MEMORY              (0x0 << 2)
 | 
					#define TT_ATTR_INDX_DEVICE_MEMORY         (0x0 << 2)
 | 
				
			||||||
#define TT_ATTR_INDX_MEMORY_NON_CACHEABLE       (0x1 << 2)
 | 
					#define TT_ATTR_INDX_MEMORY_NON_CACHEABLE  (0x1 << 2)
 | 
				
			||||||
#define TT_ATTR_INDX_MEMORY_WRITE_THROUGH       (0x2 << 2)
 | 
					#define TT_ATTR_INDX_MEMORY_WRITE_THROUGH  (0x2 << 2)
 | 
				
			||||||
#define TT_ATTR_INDX_MEMORY_WRITE_BACK          (0x3 << 2)
 | 
					#define TT_ATTR_INDX_MEMORY_WRITE_BACK     (0x3 << 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_AP_MASK                              (0x3UL << 6)
 | 
					#define TT_AP_MASK   (0x3UL << 6)
 | 
				
			||||||
#define TT_AP_NO_RW                             (0x0UL << 6)
 | 
					#define TT_AP_NO_RW  (0x0UL << 6)
 | 
				
			||||||
#define TT_AP_RW_RW                             (0x1UL << 6)
 | 
					#define TT_AP_RW_RW  (0x1UL << 6)
 | 
				
			||||||
#define TT_AP_NO_RO                             (0x2UL << 6)
 | 
					#define TT_AP_NO_RO  (0x2UL << 6)
 | 
				
			||||||
#define TT_AP_RO_RO                             (0x3UL << 6)
 | 
					#define TT_AP_RO_RO  (0x3UL << 6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_NS                                   BIT5
 | 
					#define TT_NS  BIT5
 | 
				
			||||||
#define TT_AF                                   BIT10
 | 
					#define TT_AF  BIT10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_SH_NON_SHAREABLE                     (0x0 << 8)
 | 
					#define TT_SH_NON_SHAREABLE    (0x0 << 8)
 | 
				
			||||||
#define TT_SH_OUTER_SHAREABLE                   (0x2 << 8)
 | 
					#define TT_SH_OUTER_SHAREABLE  (0x2 << 8)
 | 
				
			||||||
#define TT_SH_INNER_SHAREABLE                   (0x3 << 8)
 | 
					#define TT_SH_INNER_SHAREABLE  (0x3 << 8)
 | 
				
			||||||
#define TT_SH_MASK                              (0x3 << 8)
 | 
					#define TT_SH_MASK             (0x3 << 8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_PXN_MASK                             BIT53
 | 
					#define TT_PXN_MASK  BIT53
 | 
				
			||||||
#define TT_UXN_MASK                             BIT54   // EL1&0
 | 
					#define TT_UXN_MASK  BIT54                              // EL1&0
 | 
				
			||||||
#define TT_XN_MASK                              BIT54   // EL2 / EL3
 | 
					#define TT_XN_MASK   BIT54                              // EL2 / EL3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_ATTRIBUTES_MASK                      ((0xFFFULL << 52) | (0x3FFULL << 2))
 | 
					#define TT_ATTRIBUTES_MASK  ((0xFFFULL << 52) | (0x3FFULL << 2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_TABLE_PXN                            BIT59
 | 
					#define TT_TABLE_PXN  BIT59
 | 
				
			||||||
#define TT_TABLE_UXN                            BIT60   // EL1&0
 | 
					#define TT_TABLE_UXN  BIT60                             // EL1&0
 | 
				
			||||||
#define TT_TABLE_XN                             BIT60   // EL2 / EL3
 | 
					#define TT_TABLE_XN   BIT60                             // EL2 / EL3
 | 
				
			||||||
#define TT_TABLE_NS                             BIT63
 | 
					#define TT_TABLE_NS   BIT63
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_TABLE_AP_MASK                        (BIT62 | BIT61)
 | 
					#define TT_TABLE_AP_MASK             (BIT62 | BIT61)
 | 
				
			||||||
#define TT_TABLE_AP_NO_PERMISSION               (0x0ULL << 61)
 | 
					#define TT_TABLE_AP_NO_PERMISSION    (0x0ULL << 61)
 | 
				
			||||||
#define TT_TABLE_AP_EL0_NO_ACCESS               (0x1ULL << 61)
 | 
					#define TT_TABLE_AP_EL0_NO_ACCESS    (0x1ULL << 61)
 | 
				
			||||||
#define TT_TABLE_AP_NO_WRITE_ACCESS             (0x2ULL << 61)
 | 
					#define TT_TABLE_AP_NO_WRITE_ACCESS  (0x2ULL << 61)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Translation Control Register
 | 
					// Translation Control Register
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define TCR_T0SZ_MASK                           0x3FUL
 | 
					#define TCR_T0SZ_MASK  0x3FUL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_PS_4GB                              (0UL << 16)
 | 
					#define TCR_PS_4GB    (0UL << 16)
 | 
				
			||||||
#define TCR_PS_64GB                             (1UL << 16)
 | 
					#define TCR_PS_64GB   (1UL << 16)
 | 
				
			||||||
#define TCR_PS_1TB                              (2UL << 16)
 | 
					#define TCR_PS_1TB    (2UL << 16)
 | 
				
			||||||
#define TCR_PS_4TB                              (3UL << 16)
 | 
					#define TCR_PS_4TB    (3UL << 16)
 | 
				
			||||||
#define TCR_PS_16TB                             (4UL << 16)
 | 
					#define TCR_PS_16TB   (4UL << 16)
 | 
				
			||||||
#define TCR_PS_256TB                            (5UL << 16)
 | 
					#define TCR_PS_256TB  (5UL << 16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_TG0_4KB                             (0UL << 14)
 | 
					#define TCR_TG0_4KB  (0UL << 14)
 | 
				
			||||||
#define TCR_TG1_4KB                             (2UL << 30)
 | 
					#define TCR_TG1_4KB  (2UL << 30)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_IPS_4GB                             (0ULL << 32)
 | 
					#define TCR_IPS_4GB    (0ULL << 32)
 | 
				
			||||||
#define TCR_IPS_64GB                            (1ULL << 32)
 | 
					#define TCR_IPS_64GB   (1ULL << 32)
 | 
				
			||||||
#define TCR_IPS_1TB                             (2ULL << 32)
 | 
					#define TCR_IPS_1TB    (2ULL << 32)
 | 
				
			||||||
#define TCR_IPS_4TB                             (3ULL << 32)
 | 
					#define TCR_IPS_4TB    (3ULL << 32)
 | 
				
			||||||
#define TCR_IPS_16TB                            (4ULL << 32)
 | 
					#define TCR_IPS_16TB   (4ULL << 32)
 | 
				
			||||||
#define TCR_IPS_256TB                           (5ULL << 32)
 | 
					#define TCR_IPS_256TB  (5ULL << 32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_EPD1                                (1UL << 23)
 | 
					#define TCR_EPD1  (1UL << 23)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TTBR_ASID_FIELD                      (48)
 | 
					#define TTBR_ASID_FIELD  (48)
 | 
				
			||||||
#define TTBR_ASID_MASK                       (0xFF << TTBR_ASID_FIELD)
 | 
					#define TTBR_ASID_MASK   (0xFF << TTBR_ASID_FIELD)
 | 
				
			||||||
#define TTBR_BADDR_MASK                      (0xFFFFFFFFFFFF ) // The width of this field depends on the values in TxSZ. Addr occupies bottom 48bits
 | 
					#define TTBR_BADDR_MASK  (0xFFFFFFFFFFFF )                     // The width of this field depends on the values in TxSZ. Addr occupies bottom 48bits
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_EL1_T0SZ_FIELD                   (0)
 | 
					#define TCR_EL1_T0SZ_FIELD   (0)
 | 
				
			||||||
#define TCR_EL1_EPD0_FIELD                   (7)
 | 
					#define TCR_EL1_EPD0_FIELD   (7)
 | 
				
			||||||
#define TCR_EL1_IRGN0_FIELD                  (8)
 | 
					#define TCR_EL1_IRGN0_FIELD  (8)
 | 
				
			||||||
#define TCR_EL1_ORGN0_FIELD                  (10)
 | 
					#define TCR_EL1_ORGN0_FIELD  (10)
 | 
				
			||||||
#define TCR_EL1_SH0_FIELD                    (12)
 | 
					#define TCR_EL1_SH0_FIELD    (12)
 | 
				
			||||||
#define TCR_EL1_TG0_FIELD                    (14)
 | 
					#define TCR_EL1_TG0_FIELD    (14)
 | 
				
			||||||
#define TCR_EL1_T1SZ_FIELD                   (16)
 | 
					#define TCR_EL1_T1SZ_FIELD   (16)
 | 
				
			||||||
#define TCR_EL1_A1_FIELD                     (22)
 | 
					#define TCR_EL1_A1_FIELD     (22)
 | 
				
			||||||
#define TCR_EL1_EPD1_FIELD                   (23)
 | 
					#define TCR_EL1_EPD1_FIELD   (23)
 | 
				
			||||||
#define TCR_EL1_IRGN1_FIELD                  (24)
 | 
					#define TCR_EL1_IRGN1_FIELD  (24)
 | 
				
			||||||
#define TCR_EL1_ORGN1_FIELD                  (26)
 | 
					#define TCR_EL1_ORGN1_FIELD  (26)
 | 
				
			||||||
#define TCR_EL1_SH1_FIELD                    (28)
 | 
					#define TCR_EL1_SH1_FIELD    (28)
 | 
				
			||||||
#define TCR_EL1_TG1_FIELD                    (30)
 | 
					#define TCR_EL1_TG1_FIELD    (30)
 | 
				
			||||||
#define TCR_EL1_IPS_FIELD                    (32)
 | 
					#define TCR_EL1_IPS_FIELD    (32)
 | 
				
			||||||
#define TCR_EL1_AS_FIELD                     (36)
 | 
					#define TCR_EL1_AS_FIELD     (36)
 | 
				
			||||||
#define TCR_EL1_TBI0_FIELD                   (37)
 | 
					#define TCR_EL1_TBI0_FIELD   (37)
 | 
				
			||||||
#define TCR_EL1_TBI1_FIELD                   (38)
 | 
					#define TCR_EL1_TBI1_FIELD   (38)
 | 
				
			||||||
#define TCR_EL1_T0SZ_MASK                    (0x1FUL << TCR_EL1_T0SZ_FIELD)
 | 
					#define TCR_EL1_T0SZ_MASK    (0x1FUL << TCR_EL1_T0SZ_FIELD)
 | 
				
			||||||
#define TCR_EL1_EPD0_MASK                    (0x01UL << TCR_EL1_EPD0_FIELD)
 | 
					#define TCR_EL1_EPD0_MASK    (0x01UL << TCR_EL1_EPD0_FIELD)
 | 
				
			||||||
#define TCR_EL1_IRGN0_MASK                   (0x03UL << TCR_EL1_IRGN0_FIELD)
 | 
					#define TCR_EL1_IRGN0_MASK   (0x03UL << TCR_EL1_IRGN0_FIELD)
 | 
				
			||||||
#define TCR_EL1_ORGN0_MASK                   (0x03UL << TCR_EL1_ORGN0_FIELD)
 | 
					#define TCR_EL1_ORGN0_MASK   (0x03UL << TCR_EL1_ORGN0_FIELD)
 | 
				
			||||||
#define TCR_EL1_SH0_MASK                     (0x03UL << TCR_EL1_SH0_FIELD)
 | 
					#define TCR_EL1_SH0_MASK     (0x03UL << TCR_EL1_SH0_FIELD)
 | 
				
			||||||
#define TCR_EL1_TG0_MASK                     (0x01UL << TCR_EL1_TG0_FIELD)
 | 
					#define TCR_EL1_TG0_MASK     (0x01UL << TCR_EL1_TG0_FIELD)
 | 
				
			||||||
#define TCR_EL1_T1SZ_MASK                    (0x1FUL << TCR_EL1_T1SZ_FIELD)
 | 
					#define TCR_EL1_T1SZ_MASK    (0x1FUL << TCR_EL1_T1SZ_FIELD)
 | 
				
			||||||
#define TCR_EL1_A1_MASK                      (0x01UL << TCR_EL1_A1_FIELD)
 | 
					#define TCR_EL1_A1_MASK      (0x01UL << TCR_EL1_A1_FIELD)
 | 
				
			||||||
#define TCR_EL1_EPD1_MASK                    (0x01UL << TCR_EL1_EPD1_FIELD)
 | 
					#define TCR_EL1_EPD1_MASK    (0x01UL << TCR_EL1_EPD1_FIELD)
 | 
				
			||||||
#define TCR_EL1_IRGN1_MASK                   (0x03UL << TCR_EL1_IRGN1_FIELD)
 | 
					#define TCR_EL1_IRGN1_MASK   (0x03UL << TCR_EL1_IRGN1_FIELD)
 | 
				
			||||||
#define TCR_EL1_ORGN1_MASK                   (0x03UL << TCR_EL1_ORGN1_FIELD)
 | 
					#define TCR_EL1_ORGN1_MASK   (0x03UL << TCR_EL1_ORGN1_FIELD)
 | 
				
			||||||
#define TCR_EL1_SH1_MASK                     (0x03UL << TCR_EL1_SH1_FIELD)
 | 
					#define TCR_EL1_SH1_MASK     (0x03UL << TCR_EL1_SH1_FIELD)
 | 
				
			||||||
#define TCR_EL1_TG1_MASK                     (0x01UL << TCR_EL1_TG1_FIELD)
 | 
					#define TCR_EL1_TG1_MASK     (0x01UL << TCR_EL1_TG1_FIELD)
 | 
				
			||||||
#define TCR_EL1_IPS_MASK                     (0x07UL << TCR_EL1_IPS_FIELD)
 | 
					#define TCR_EL1_IPS_MASK     (0x07UL << TCR_EL1_IPS_FIELD)
 | 
				
			||||||
#define TCR_EL1_AS_MASK                      (0x01UL << TCR_EL1_AS_FIELD)
 | 
					#define TCR_EL1_AS_MASK      (0x01UL << TCR_EL1_AS_FIELD)
 | 
				
			||||||
#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_IRGN0_FIELD  (8)
 | 
				
			||||||
 | 
					#define TCR_EL23_ORGN0_FIELD  (10)
 | 
				
			||||||
 | 
					#define TCR_EL23_SH0_FIELD    (12)
 | 
				
			||||||
 | 
					#define TCR_EL23_TG0_FIELD    (14)
 | 
				
			||||||
 | 
					#define TCR_EL23_PS_FIELD     (16)
 | 
				
			||||||
 | 
					#define TCR_EL23_T0SZ_MASK    (0x1FUL << TCR_EL23_T0SZ_FIELD)
 | 
				
			||||||
 | 
					#define TCR_EL23_IRGN0_MASK   (0x03UL << TCR_EL23_IRGN0_FIELD)
 | 
				
			||||||
 | 
					#define TCR_EL23_ORGN0_MASK   (0x03UL << TCR_EL23_ORGN0_FIELD)
 | 
				
			||||||
 | 
					#define TCR_EL23_SH0_MASK     (0x03UL << TCR_EL23_SH0_FIELD)
 | 
				
			||||||
 | 
					#define TCR_EL23_TG0_MASK     (0x01UL << TCR_EL23_TG0_FIELD)
 | 
				
			||||||
 | 
					#define TCR_EL23_PS_MASK      (0x07UL << TCR_EL23_PS_FIELD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_EL23_T0SZ_FIELD                  (0)
 | 
					#define TCR_RGN_OUTER_NON_CACHEABLE        (0x0UL << 10)
 | 
				
			||||||
#define TCR_EL23_IRGN0_FIELD                 (8)
 | 
					#define TCR_RGN_OUTER_WRITE_BACK_ALLOC     (0x1UL << 10)
 | 
				
			||||||
#define TCR_EL23_ORGN0_FIELD                 (10)
 | 
					#define TCR_RGN_OUTER_WRITE_THROUGH        (0x2UL << 10)
 | 
				
			||||||
#define TCR_EL23_SH0_FIELD                   (12)
 | 
					#define TCR_RGN_OUTER_WRITE_BACK_NO_ALLOC  (0x3UL << 10)
 | 
				
			||||||
#define TCR_EL23_TG0_FIELD                   (14)
 | 
					 | 
				
			||||||
#define TCR_EL23_PS_FIELD                    (16)
 | 
					 | 
				
			||||||
#define TCR_EL23_T0SZ_MASK                   (0x1FUL << TCR_EL23_T0SZ_FIELD)
 | 
					 | 
				
			||||||
#define TCR_EL23_IRGN0_MASK                  (0x03UL << TCR_EL23_IRGN0_FIELD)
 | 
					 | 
				
			||||||
#define TCR_EL23_ORGN0_MASK                  (0x03UL << TCR_EL23_ORGN0_FIELD)
 | 
					 | 
				
			||||||
#define TCR_EL23_SH0_MASK                    (0x03UL << TCR_EL23_SH0_FIELD)
 | 
					 | 
				
			||||||
#define TCR_EL23_TG0_MASK                    (0x01UL << TCR_EL23_TG0_FIELD)
 | 
					 | 
				
			||||||
#define TCR_EL23_PS_MASK                     (0x07UL << TCR_EL23_PS_FIELD)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TCR_RGN_INNER_NON_CACHEABLE        (0x0UL << 8)
 | 
				
			||||||
 | 
					#define TCR_RGN_INNER_WRITE_BACK_ALLOC     (0x1UL << 8)
 | 
				
			||||||
 | 
					#define TCR_RGN_INNER_WRITE_THROUGH        (0x2UL << 8)
 | 
				
			||||||
 | 
					#define TCR_RGN_INNER_WRITE_BACK_NO_ALLOC  (0x3UL << 8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_RGN_OUTER_NON_CACHEABLE          (0x0UL << 10)
 | 
					#define TCR_SH_NON_SHAREABLE    (0x0UL << 12)
 | 
				
			||||||
#define TCR_RGN_OUTER_WRITE_BACK_ALLOC       (0x1UL << 10)
 | 
					#define TCR_SH_OUTER_SHAREABLE  (0x2UL << 12)
 | 
				
			||||||
#define TCR_RGN_OUTER_WRITE_THROUGH          (0x2UL << 10)
 | 
					#define TCR_SH_INNER_SHAREABLE  (0x3UL << 12)
 | 
				
			||||||
#define TCR_RGN_OUTER_WRITE_BACK_NO_ALLOC    (0x3UL << 10)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TCR_RGN_INNER_NON_CACHEABLE          (0x0UL << 8)
 | 
					#define TCR_PASZ_32BITS_4GB    (0x0UL)
 | 
				
			||||||
#define TCR_RGN_INNER_WRITE_BACK_ALLOC       (0x1UL << 8)
 | 
					#define TCR_PASZ_36BITS_64GB   (0x1UL)
 | 
				
			||||||
#define TCR_RGN_INNER_WRITE_THROUGH          (0x2UL << 8)
 | 
					#define TCR_PASZ_40BITS_1TB    (0x2UL)
 | 
				
			||||||
#define TCR_RGN_INNER_WRITE_BACK_NO_ALLOC    (0x3UL << 8)
 | 
					#define TCR_PASZ_42BITS_4TB    (0x3UL)
 | 
				
			||||||
 | 
					#define TCR_PASZ_44BITS_16TB   (0x4UL)
 | 
				
			||||||
#define TCR_SH_NON_SHAREABLE                 (0x0UL << 12)
 | 
					#define TCR_PASZ_48BITS_256TB  (0x5UL)
 | 
				
			||||||
#define TCR_SH_OUTER_SHAREABLE               (0x2UL << 12)
 | 
					 | 
				
			||||||
#define TCR_SH_INNER_SHAREABLE               (0x3UL << 12)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define TCR_PASZ_32BITS_4GB                  (0x0UL)
 | 
					 | 
				
			||||||
#define TCR_PASZ_36BITS_64GB                 (0x1UL)
 | 
					 | 
				
			||||||
#define TCR_PASZ_40BITS_1TB                  (0x2UL)
 | 
					 | 
				
			||||||
#define TCR_PASZ_42BITS_4TB                  (0x3UL)
 | 
					 | 
				
			||||||
#define TCR_PASZ_44BITS_16TB                 (0x4UL)
 | 
					 | 
				
			||||||
#define TCR_PASZ_48BITS_256TB                (0x5UL)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit
 | 
					// The value written to the T*SZ fields are defined as 2^(64-T*SZ). So a 39Bit
 | 
				
			||||||
// Virtual address range for 512GB of virtual space sets T*SZ to 25
 | 
					// Virtual address range for 512GB of virtual space sets T*SZ to 25
 | 
				
			||||||
#define INPUT_ADDRESS_SIZE_TO_TXSZ(a)        (64 - a)
 | 
					#define INPUT_ADDRESS_SIZE_TO_TXSZ(a)  (64 - a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uses LPAE Page Table format
 | 
					// Uses LPAE Page Table format
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // AARCH64_MMU_H_
 | 
					#endif // AARCH64_MMU_H_
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// Cortex A5x feature bit definitions
 | 
					// Cortex A5x feature bit definitions
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define A5X_FEATURE_SMP     (1 << 6)
 | 
					#define A5X_FEATURE_SMP  (1 << 6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Helper functions to access CPU Extended Control Register
 | 
					// Helper functions to access CPU Extended Control Register
 | 
				
			||||||
@@ -26,19 +26,19 @@ ArmReadCpuExCr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCpuExCr (
 | 
					ArmWriteCpuExCr (
 | 
				
			||||||
  IN  UINT64 Val
 | 
					  IN  UINT64  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetCpuExCrBit (
 | 
					ArmSetCpuExCrBit (
 | 
				
			||||||
  IN  UINT64    Bits
 | 
					  IN  UINT64  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmUnsetCpuExCrBit (
 | 
					ArmUnsetCpuExCrBit (
 | 
				
			||||||
  IN  UINT64    Bits
 | 
					  IN  UINT64  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_CORTEX_A5X_H_
 | 
					#endif // ARM_CORTEX_A5X_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,28 +26,27 @@
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// Cortex A9 Watchdog
 | 
					// Cortex A9 Watchdog
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define ARM_A9_WATCHDOG_REGION           0x600
 | 
					#define ARM_A9_WATCHDOG_REGION  0x600
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_A9_WATCHDOG_LOAD_REGISTER    0x20
 | 
					#define ARM_A9_WATCHDOG_LOAD_REGISTER     0x20
 | 
				
			||||||
#define ARM_A9_WATCHDOG_CONTROL_REGISTER 0x28
 | 
					#define ARM_A9_WATCHDOG_CONTROL_REGISTER  0x28
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_A9_WATCHDOG_WATCHDOG_MODE    (1 << 3)
 | 
					#define ARM_A9_WATCHDOG_WATCHDOG_MODE  (1 << 3)
 | 
				
			||||||
#define ARM_A9_WATCHDOG_TIMER_MODE       (0 << 3)
 | 
					#define ARM_A9_WATCHDOG_TIMER_MODE     (0 << 3)
 | 
				
			||||||
#define ARM_A9_WATCHDOG_SINGLE_SHOT      (0 << 1)
 | 
					#define ARM_A9_WATCHDOG_SINGLE_SHOT    (0 << 1)
 | 
				
			||||||
#define ARM_A9_WATCHDOG_AUTORELOAD       (1 << 1)
 | 
					#define ARM_A9_WATCHDOG_AUTORELOAD     (1 << 1)
 | 
				
			||||||
#define ARM_A9_WATCHDOG_ENABLE           1
 | 
					#define ARM_A9_WATCHDOG_ENABLE         1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// SCU register offsets & masks
 | 
					// SCU register offsets & masks
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define A9_SCU_CONTROL_OFFSET       0x0
 | 
					#define A9_SCU_CONTROL_OFFSET     0x0
 | 
				
			||||||
#define A9_SCU_CONFIG_OFFSET        0x4
 | 
					#define A9_SCU_CONFIG_OFFSET      0x4
 | 
				
			||||||
#define A9_SCU_INVALL_OFFSET        0xC
 | 
					#define A9_SCU_INVALL_OFFSET      0xC
 | 
				
			||||||
#define A9_SCU_FILT_START_OFFSET    0x40
 | 
					#define A9_SCU_FILT_START_OFFSET  0x40
 | 
				
			||||||
#define A9_SCU_FILT_END_OFFSET      0x44
 | 
					#define A9_SCU_FILT_END_OFFSET    0x44
 | 
				
			||||||
#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
 | 
				
			||||||
@@ -56,4 +55,3 @@ ArmGetScuBaseAddress (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_CORTEX_A9_H_
 | 
					#endif // ARM_CORTEX_A9_H_
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,19 +13,19 @@
 | 
				
			|||||||
#include <Chipset/ArmV7Mmu.h>
 | 
					#include <Chipset/ArmV7Mmu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ARM Interrupt ID in Exception Table
 | 
					// ARM Interrupt ID in Exception Table
 | 
				
			||||||
#define ARM_ARCH_EXCEPTION_IRQ            EXCEPT_ARM_IRQ
 | 
					#define ARM_ARCH_EXCEPTION_IRQ  EXCEPT_ARM_IRQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ID_PFR1 - ARM Processor Feature Register 1 definitions
 | 
					// ID_PFR1 - ARM Processor Feature Register 1 definitions
 | 
				
			||||||
#define ARM_PFR1_SEC        (0xFUL << 4)
 | 
					#define ARM_PFR1_SEC    (0xFUL << 4)
 | 
				
			||||||
#define ARM_PFR1_TIMER      (0xFUL << 16)
 | 
					#define ARM_PFR1_TIMER  (0xFUL << 16)
 | 
				
			||||||
#define ARM_PFR1_GIC        (0xFUL << 28)
 | 
					#define ARM_PFR1_GIC    (0xFUL << 28)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Domain Access Control Register
 | 
					// Domain Access Control Register
 | 
				
			||||||
#define DOMAIN_ACCESS_CONTROL_MASK(a)     (3UL << (2 * (a)))
 | 
					#define DOMAIN_ACCESS_CONTROL_MASK(a)      (3UL << (2 * (a)))
 | 
				
			||||||
#define DOMAIN_ACCESS_CONTROL_NONE(a)     (0UL << (2 * (a)))
 | 
					#define DOMAIN_ACCESS_CONTROL_NONE(a)      (0UL << (2 * (a)))
 | 
				
			||||||
#define DOMAIN_ACCESS_CONTROL_CLIENT(a)   (1UL << (2 * (a)))
 | 
					#define DOMAIN_ACCESS_CONTROL_CLIENT(a)    (1UL << (2 * (a)))
 | 
				
			||||||
#define DOMAIN_ACCESS_CONTROL_RESERVED(a) (2UL << (2 * (a)))
 | 
					#define DOMAIN_ACCESS_CONTROL_RESERVED(a)  (2UL << (2 * (a)))
 | 
				
			||||||
#define DOMAIN_ACCESS_CONTROL_MANAGER(a)  (3UL << (2 * (a)))
 | 
					#define DOMAIN_ACCESS_CONTROL_MANAGER(a)   (3UL << (2 * (a)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CPSR - Coprocessor Status Register definitions
 | 
					// CPSR - Coprocessor Status Register definitions
 | 
				
			||||||
#define CPSR_MODE_USER       0x10
 | 
					#define CPSR_MODE_USER       0x10
 | 
				
			||||||
@@ -41,48 +41,47 @@
 | 
				
			|||||||
#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)
 | 
				
			||||||
#define CPACR_CP_FULL(cp)       ((0x3 << ((cp) << 1)) & 0x0FFFFFFF)
 | 
					#define CPACR_CP_FULL(cp)    ((0x3 << ((cp) << 1)) & 0x0FFFFFFF)
 | 
				
			||||||
#define CPACR_ASEDIS            (1 << 31)
 | 
					#define CPACR_ASEDIS          (1 << 31)
 | 
				
			||||||
#define CPACR_D32DIS            (1 << 30)
 | 
					#define CPACR_D32DIS          (1 << 30)
 | 
				
			||||||
#define CPACR_CP_FULL_ACCESS    0x0FFFFFFF
 | 
					#define CPACR_CP_FULL_ACCESS  0x0FFFFFFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NSACR - Non-Secure Access Control Register definitions
 | 
					// NSACR - Non-Secure Access Control Register definitions
 | 
				
			||||||
#define NSACR_CP(cp)            ((1 << (cp)) & 0x3FFF)
 | 
					#define NSACR_CP(cp)  ((1 << (cp)) & 0x3FFF)
 | 
				
			||||||
#define NSACR_NSD32DIS          (1 << 14)
 | 
					#define NSACR_NSD32DIS  (1 << 14)
 | 
				
			||||||
#define NSACR_NSASEDIS          (1 << 15)
 | 
					#define NSACR_NSASEDIS  (1 << 15)
 | 
				
			||||||
#define NSACR_PLE               (1 << 16)
 | 
					#define NSACR_PLE       (1 << 16)
 | 
				
			||||||
#define NSACR_TL                (1 << 17)
 | 
					#define NSACR_TL        (1 << 17)
 | 
				
			||||||
#define NSACR_NS_SMP            (1 << 18)
 | 
					#define NSACR_NS_SMP    (1 << 18)
 | 
				
			||||||
#define NSACR_RFR               (1 << 19)
 | 
					#define NSACR_RFR       (1 << 19)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SCR - Secure Configuration Register definitions
 | 
					// SCR - Secure Configuration Register definitions
 | 
				
			||||||
#define SCR_NS                  (1 << 0)
 | 
					#define SCR_NS   (1 << 0)
 | 
				
			||||||
#define SCR_IRQ                 (1 << 1)
 | 
					#define SCR_IRQ  (1 << 1)
 | 
				
			||||||
#define SCR_FIQ                 (1 << 2)
 | 
					#define SCR_FIQ  (1 << 2)
 | 
				
			||||||
#define SCR_EA                  (1 << 3)
 | 
					#define SCR_EA   (1 << 3)
 | 
				
			||||||
#define SCR_FW                  (1 << 4)
 | 
					#define SCR_FW   (1 << 4)
 | 
				
			||||||
#define SCR_AW                  (1 << 5)
 | 
					#define SCR_AW   (1 << 5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MIDR - Main ID Register definitions
 | 
					// MIDR - Main ID Register definitions
 | 
				
			||||||
#define ARM_CPU_TYPE_SHIFT      4
 | 
					#define ARM_CPU_TYPE_SHIFT  4
 | 
				
			||||||
#define ARM_CPU_TYPE_MASK       0xFFF
 | 
					#define ARM_CPU_TYPE_MASK   0xFFF
 | 
				
			||||||
#define ARM_CPU_TYPE_AEMV8      0xD0F
 | 
					#define ARM_CPU_TYPE_AEMV8  0xD0F
 | 
				
			||||||
#define ARM_CPU_TYPE_A53        0xD03
 | 
					#define ARM_CPU_TYPE_A53    0xD03
 | 
				
			||||||
#define ARM_CPU_TYPE_A57        0xD07
 | 
					#define ARM_CPU_TYPE_A57    0xD07
 | 
				
			||||||
#define ARM_CPU_TYPE_A15        0xC0F
 | 
					#define ARM_CPU_TYPE_A15    0xC0F
 | 
				
			||||||
#define ARM_CPU_TYPE_A12        0xC0D
 | 
					#define ARM_CPU_TYPE_A12    0xC0D
 | 
				
			||||||
#define ARM_CPU_TYPE_A9         0xC09
 | 
					#define ARM_CPU_TYPE_A9     0xC09
 | 
				
			||||||
#define ARM_CPU_TYPE_A7         0xC07
 | 
					#define ARM_CPU_TYPE_A7     0xC07
 | 
				
			||||||
#define ARM_CPU_TYPE_A5         0xC05
 | 
					#define ARM_CPU_TYPE_A5     0xC05
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_CPU_REV_MASK        ((0xF << 20) | (0xF) )
 | 
					#define ARM_CPU_REV_MASK  ((0xF << 20) | (0xF) )
 | 
				
			||||||
#define ARM_CPU_REV(rn, pn)     ((((rn) & 0xF) << 20) | ((pn) & 0xF))
 | 
					#define ARM_CPU_REV(rn, pn)  ((((rn) & 0xF) << 20) | ((pn) & 0xF))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_VECTOR_TABLE_ALIGNMENT ((1 << 5)-1)
 | 
					#define ARM_VECTOR_TABLE_ALIGNMENT  ((1 << 5)-1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
@@ -105,7 +104,7 @@ ArmReadTpidrurw (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteTpidrurw (
 | 
					ArmWriteTpidrurw (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
@@ -117,7 +116,7 @@ ArmReadNsacr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteNsacr (
 | 
					ArmWriteNsacr (
 | 
				
			||||||
  IN  UINT32   Nsacr
 | 
					  IN  UINT32  Nsacr
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_V7_H_
 | 
					#endif // ARM_V7_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,183 +9,182 @@
 | 
				
			|||||||
#ifndef ARMV7_MMU_H_
 | 
					#ifndef ARMV7_MMU_H_
 | 
				
			||||||
#define ARMV7_MMU_H_
 | 
					#define ARMV7_MMU_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TTBR_NOT_OUTER_SHAREABLE             BIT5
 | 
					#define TTBR_NOT_OUTER_SHAREABLE            BIT5
 | 
				
			||||||
#define TTBR_RGN_OUTER_NON_CACHEABLE         0
 | 
					#define TTBR_RGN_OUTER_NON_CACHEABLE        0
 | 
				
			||||||
#define TTBR_RGN_OUTER_WRITE_BACK_ALLOC      BIT3
 | 
					#define TTBR_RGN_OUTER_WRITE_BACK_ALLOC     BIT3
 | 
				
			||||||
#define TTBR_RGN_OUTER_WRITE_THROUGH         BIT4
 | 
					#define TTBR_RGN_OUTER_WRITE_THROUGH        BIT4
 | 
				
			||||||
#define TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC   (BIT3|BIT4)
 | 
					#define TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC  (BIT3|BIT4)
 | 
				
			||||||
#define TTBR_SHAREABLE                       BIT1
 | 
					#define TTBR_SHAREABLE                      BIT1
 | 
				
			||||||
#define TTBR_NON_SHAREABLE                   0
 | 
					#define TTBR_NON_SHAREABLE                  0
 | 
				
			||||||
#define TTBR_INNER_CACHEABLE                 BIT0
 | 
					#define TTBR_INNER_CACHEABLE                BIT0
 | 
				
			||||||
#define TTBR_INNER_NON_CACHEABLE             0
 | 
					#define TTBR_INNER_NON_CACHEABLE            0
 | 
				
			||||||
#define TTBR_RGN_INNER_NON_CACHEABLE         0
 | 
					#define TTBR_RGN_INNER_NON_CACHEABLE        0
 | 
				
			||||||
#define TTBR_RGN_INNER_WRITE_BACK_ALLOC      BIT6
 | 
					#define TTBR_RGN_INNER_WRITE_BACK_ALLOC     BIT6
 | 
				
			||||||
#define TTBR_RGN_INNER_WRITE_THROUGH         BIT0
 | 
					#define TTBR_RGN_INNER_WRITE_THROUGH        BIT0
 | 
				
			||||||
#define TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC   (BIT0|BIT6)
 | 
					#define TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC  (BIT0|BIT6)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TTBR_WRITE_THROUGH              ( TTBR_RGN_OUTER_WRITE_THROUGH | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE)
 | 
					#define TTBR_WRITE_THROUGH        ( TTBR_RGN_OUTER_WRITE_THROUGH | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE)
 | 
				
			||||||
#define TTBR_WRITE_BACK_NO_ALLOC        ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE)
 | 
					#define TTBR_WRITE_BACK_NO_ALLOC  ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE)
 | 
				
			||||||
#define TTBR_NON_CACHEABLE              ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_INNER_NON_CACHEABLE )
 | 
					#define TTBR_NON_CACHEABLE        ( TTBR_RGN_OUTER_NON_CACHEABLE | TTBR_INNER_NON_CACHEABLE )
 | 
				
			||||||
#define TTBR_WRITE_BACK_ALLOC           ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE)
 | 
					#define TTBR_WRITE_BACK_ALLOC     ( TTBR_RGN_OUTER_WRITE_BACK_ALLOC | TTBR_INNER_CACHEABLE | TTBR_SHAREABLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TTBR_MP_WRITE_THROUGH           ( TTBR_RGN_OUTER_WRITE_THROUGH | TTBR_RGN_INNER_WRITE_THROUGH | TTBR_SHAREABLE)
 | 
					#define TTBR_MP_WRITE_THROUGH        ( TTBR_RGN_OUTER_WRITE_THROUGH | TTBR_RGN_INNER_WRITE_THROUGH | TTBR_SHAREABLE)
 | 
				
			||||||
#define TTBR_MP_WRITE_BACK_NO_ALLOC     ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC | TTBR_SHAREABLE)
 | 
					#define TTBR_MP_WRITE_BACK_NO_ALLOC  ( TTBR_RGN_OUTER_WRITE_BACK_NO_ALLOC | TTBR_RGN_INNER_WRITE_BACK_NO_ALLOC | TTBR_SHAREABLE)
 | 
				
			||||||
#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_SIZE            (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
				
			||||||
 | 
					#define TRANSLATION_TABLE_SECTION_ALIGNMENT       (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
				
			||||||
 | 
					#define TRANSLATION_TABLE_SECTION_ALIGNMENT_MASK  (TRANSLATION_TABLE_SECTION_ALIGNMENT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TRANSLATION_TABLE_SECTION_COUNT                 4096
 | 
					#define TRANSLATION_TABLE_PAGE_COUNT           256
 | 
				
			||||||
#define TRANSLATION_TABLE_SECTION_SIZE                  (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
					#define TRANSLATION_TABLE_PAGE_SIZE            (sizeof(UINT32) * TRANSLATION_TABLE_PAGE_COUNT)
 | 
				
			||||||
#define TRANSLATION_TABLE_SECTION_ALIGNMENT             (sizeof(UINT32) * TRANSLATION_TABLE_SECTION_COUNT)
 | 
					#define TRANSLATION_TABLE_PAGE_ALIGNMENT       (sizeof(UINT32) * TRANSLATION_TABLE_PAGE_COUNT)
 | 
				
			||||||
#define TRANSLATION_TABLE_SECTION_ALIGNMENT_MASK        (TRANSLATION_TABLE_SECTION_ALIGNMENT - 1)
 | 
					#define TRANSLATION_TABLE_PAGE_ALIGNMENT_MASK  (TRANSLATION_TABLE_PAGE_ALIGNMENT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TRANSLATION_TABLE_PAGE_COUNT                 256
 | 
					#define TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(table, address)  ((UINT32 *)(table) + (((UINTN)(address)) >> 20))
 | 
				
			||||||
#define TRANSLATION_TABLE_PAGE_SIZE                  (sizeof(UINT32) * TRANSLATION_TABLE_PAGE_COUNT)
 | 
					 | 
				
			||||||
#define TRANSLATION_TABLE_PAGE_ALIGNMENT             (sizeof(UINT32) * TRANSLATION_TABLE_PAGE_COUNT)
 | 
					 | 
				
			||||||
#define TRANSLATION_TABLE_PAGE_ALIGNMENT_MASK        (TRANSLATION_TABLE_PAGE_ALIGNMENT - 1)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define TRANSLATION_TABLE_ENTRY_FOR_VIRTUAL_ADDRESS(table, address) ((UINT32 *)(table) + (((UINTN)(address)) >> 20))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Translation table descriptor types
 | 
					// Translation table descriptor types
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_TYPE_MASK         ((1UL << 18) | (3UL << 0))
 | 
					#define TT_DESCRIPTOR_SECTION_TYPE_MASK          ((1UL << 18) | (3UL << 0))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_TYPE_FAULT        (0UL << 0)
 | 
					#define TT_DESCRIPTOR_SECTION_TYPE_FAULT         (0UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE   (1UL << 0)
 | 
					#define TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE    (1UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_TYPE_SECTION      ((0UL << 18) | (2UL << 0))
 | 
					#define TT_DESCRIPTOR_SECTION_TYPE_SECTION       ((0UL << 18) | (2UL << 0))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION ((1UL << 18) | (2UL << 0))
 | 
					#define TT_DESCRIPTOR_SECTION_TYPE_SUPERSECTION  ((1UL << 18) | (2UL << 0))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(Desc) (((Desc) & 3UL) == TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE)
 | 
					#define TT_DESCRIPTOR_SECTION_TYPE_IS_PAGE_TABLE(Desc)  (((Desc) & 3UL) == TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Translation table descriptor types
 | 
					// Translation table descriptor types
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_TYPE_MASK         (3UL << 0)
 | 
					#define TT_DESCRIPTOR_PAGE_TYPE_MASK       (3UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_TYPE_FAULT        (0UL << 0)
 | 
					#define TT_DESCRIPTOR_PAGE_TYPE_FAULT      (0UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_TYPE_PAGE         (2UL << 0)
 | 
					#define TT_DESCRIPTOR_PAGE_TYPE_PAGE       (2UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_TYPE_PAGE_XN      (3UL << 0)
 | 
					#define TT_DESCRIPTOR_PAGE_TYPE_PAGE_XN    (3UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_TYPE_LARGEPAGE    (1UL << 0)
 | 
					#define TT_DESCRIPTOR_PAGE_TYPE_LARGEPAGE  (1UL << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Section descriptor definitions
 | 
					// Section descriptor definitions
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_SIZE                              (0x00100000)
 | 
					#define TT_DESCRIPTOR_SECTION_SIZE  (0x00100000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_NS_MASK                           (1UL << 19)
 | 
					#define TT_DESCRIPTOR_SECTION_NS_MASK  (1UL << 19)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_NS                                (1UL << 19)
 | 
					#define TT_DESCRIPTOR_SECTION_NS       (1UL << 19)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_NG_MASK                           (1UL << 17)
 | 
					#define TT_DESCRIPTOR_SECTION_NG_MASK    (1UL << 17)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_NG_GLOBAL                         (0UL << 17)
 | 
					#define TT_DESCRIPTOR_SECTION_NG_GLOBAL  (0UL << 17)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_NG_LOCAL                          (1UL << 17)
 | 
					#define TT_DESCRIPTOR_SECTION_NG_LOCAL   (1UL << 17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_NG_MASK                              (1UL << 11)
 | 
					#define TT_DESCRIPTOR_PAGE_NG_MASK    (1UL << 11)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_NG_GLOBAL                            (0UL << 11)
 | 
					#define TT_DESCRIPTOR_PAGE_NG_GLOBAL  (0UL << 11)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_NG_LOCAL                             (1UL << 11)
 | 
					#define TT_DESCRIPTOR_PAGE_NG_LOCAL   (1UL << 11)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_S_MASK                            (1UL << 16)
 | 
					#define TT_DESCRIPTOR_SECTION_S_MASK        (1UL << 16)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      (0UL << 16)
 | 
					#define TT_DESCRIPTOR_SECTION_S_NOT_SHARED  (0UL << 16)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_S_SHARED                          (1UL << 16)
 | 
					#define TT_DESCRIPTOR_SECTION_S_SHARED      (1UL << 16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_S_MASK                               (1UL << 10)
 | 
					#define TT_DESCRIPTOR_PAGE_S_MASK        (1UL << 10)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_S_NOT_SHARED                         (0UL << 10)
 | 
					#define TT_DESCRIPTOR_PAGE_S_NOT_SHARED  (0UL << 10)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_S_SHARED                             (1UL << 10)
 | 
					#define TT_DESCRIPTOR_PAGE_S_SHARED      (1UL << 10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_MASK                           ((1UL << 15) | (3UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_MASK   ((1UL << 15) | (3UL << 10))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_NO_NO                          ((0UL << 15) | (0UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_NO_NO  ((0UL << 15) | (0UL << 10))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_RW_NO                          ((0UL << 15) | (1UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_RW_NO  ((0UL << 15) | (1UL << 10))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_RW_RO                          ((0UL << 15) | (2UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_RW_RO  ((0UL << 15) | (2UL << 10))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_RW_RW                          ((0UL << 15) | (3UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_RW_RW  ((0UL << 15) | (3UL << 10))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_RO_NO                          ((1UL << 15) | (1UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_RO_NO  ((1UL << 15) | (1UL << 10))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_AP_RO_RO                          ((1UL << 15) | (3UL << 10))
 | 
					#define TT_DESCRIPTOR_SECTION_AP_RO_RO  ((1UL << 15) | (3UL << 10))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_MASK                              ((1UL << 9) | (3UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_MASK   ((1UL << 9) | (3UL << 4))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_NO_NO                             ((0UL << 9) | (0UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_NO_NO  ((0UL << 9) | (0UL << 4))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_RW_NO                             ((0UL << 9) | (1UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_RW_NO  ((0UL << 9) | (1UL << 4))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_RW_RO                             ((0UL << 9) | (2UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_RW_RO  ((0UL << 9) | (2UL << 4))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_RW_RW                             ((0UL << 9) | (3UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_RW_RW  ((0UL << 9) | (3UL << 4))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_RO_NO                             ((1UL << 9) | (1UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_RO_NO  ((1UL << 9) | (1UL << 4))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_AP_RO_RO                             ((1UL << 9) | (3UL << 4))
 | 
					#define TT_DESCRIPTOR_PAGE_AP_RO_RO  ((1UL << 9) | (3UL << 4))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_XN_MASK                           (0x1UL << 4)
 | 
					#define TT_DESCRIPTOR_SECTION_XN_MASK    (0x1UL << 4)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_XN_MASK                              (0x1UL << 0)
 | 
					#define TT_DESCRIPTOR_PAGE_XN_MASK       (0x1UL << 0)
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_XN_MASK                         (0x1UL << 15)
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_XN_MASK  (0x1UL << 15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK                   ((3UL << 12) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK                    ((3UL << 12) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHEABLE_MASK                      (1UL << 3)
 | 
					#define TT_DESCRIPTOR_SECTION_CACHEABLE_MASK                       (1UL << 3)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED       ((0UL << 12) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_STRONGLY_ORDERED        ((0UL << 12) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE       ((0UL << 12) | (0UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE        ((0UL << 12) | (0UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC ((0UL << 12) | (1UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC  ((0UL << 12) | (1UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_NO_ALLOC    ((0UL << 12) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_NO_ALLOC     ((0UL << 12) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE          ((1UL << 12) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE           ((1UL << 12) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC       ((1UL << 12) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC        ((1UL << 12) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_SHAREABLE_DEVICE   ((2UL << 12) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_SHAREABLE_DEVICE    ((2UL << 12) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_SIZE                               (0x00001000)
 | 
					#define TT_DESCRIPTOR_PAGE_SIZE  (0x00001000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK                   ((3UL << 6) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK                    ((3UL << 6) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHEABLE_MASK                       (1UL << 3)
 | 
					#define TT_DESCRIPTOR_PAGE_CACHEABLE_MASK                       (1UL << 3)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED       ((0UL << 6) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_STRONGLY_ORDERED        ((0UL << 6) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE       ((0UL << 6) | (0UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE        ((0UL << 6) | (0UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC ((0UL << 6) | (1UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC  ((0UL << 6) | (1UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_NO_ALLOC    ((0UL << 6) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_NO_ALLOC     ((0UL << 6) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE          ((1UL << 6) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE           ((1UL << 6) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC       ((1UL << 6) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC        ((1UL << 6) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_SHAREABLE_DEVICE   ((2UL << 6) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_SHAREABLE_DEVICE    ((2UL << 6) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK                   ((3UL << 12) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK                    ((3UL << 12) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_STRONGLY_ORDERED       ((0UL << 12) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_STRONGLY_ORDERED        ((0UL << 12) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_SHAREABLE_DEVICE       ((0UL << 12) | (0UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_SHAREABLE_DEVICE        ((0UL << 12) | (0UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC ((0UL << 12) | (1UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC  ((0UL << 12) | (1UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_WRITE_BACK_NO_ALLOC    ((0UL << 12) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_WRITE_BACK_NO_ALLOC     ((0UL << 12) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_NON_CACHEABLE          ((1UL << 12) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_NON_CACHEABLE           ((1UL << 12) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_WRITE_BACK_ALLOC       ((1UL << 12) | (1UL << 3) | (1UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_WRITE_BACK_ALLOC        ((1UL << 12) | (1UL << 3) | (1UL << 2))
 | 
				
			||||||
#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_NON_SHAREABLE_DEVICE   ((2UL << 12) | (0UL << 3) | (0UL << 2))
 | 
					#define TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_NON_SHAREABLE_DEVICE    ((2UL << 12) | (0UL << 3) | (0UL << 2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_AP_MASK) >> 6) & TT_DESCRIPTOR_PAGE_AP_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_AP(Desc)                         ((((Desc) & TT_DESCRIPTOR_SECTION_AP_MASK) >> 6) & TT_DESCRIPTOR_PAGE_AP_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_NG(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_NG_MASK) >> 6) & TT_DESCRIPTOR_PAGE_NG_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_NG(Desc)                         ((((Desc) & TT_DESCRIPTOR_SECTION_NG_MASK) >> 6) & TT_DESCRIPTOR_PAGE_NG_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_S(Desc)                  ((((Desc) & TT_DESCRIPTOR_SECTION_S_MASK) >> 6) & TT_DESCRIPTOR_PAGE_S_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_S(Desc)                          ((((Desc) & TT_DESCRIPTOR_SECTION_S_MASK) >> 6) & TT_DESCRIPTOR_PAGE_S_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_XN(Desc,IsLargePage)      ((IsLargePage)? \
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_XN(Desc, IsLargePage)            ((IsLargePage)?\
 | 
				
			||||||
                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) << 11) & TT_DESCRIPTOR_LARGEPAGE_XN_MASK):    \
 | 
					                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) << 11) & TT_DESCRIPTOR_LARGEPAGE_XN_MASK):    \
 | 
				
			||||||
                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) >> 4) & TT_DESCRIPTOR_PAGE_XN_MASK))
 | 
					                                                                    ((((Desc) & TT_DESCRIPTOR_SECTION_XN_MASK) >> 4) & TT_DESCRIPTOR_PAGE_XN_MASK))
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(Desc,IsLargePage)      (IsLargePage? \
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_PAGE_CACHE_POLICY(Desc, IsLargePage)  (IsLargePage?    \
 | 
				
			||||||
                                                                    (((Desc) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK): \
 | 
					                                                                    (((Desc) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK): \
 | 
				
			||||||
                                                                    (((((Desc) & (0x3 << 12)) >> 6) | (Desc & (0x3 << 2)))))
 | 
					                                                                    (((((Desc) & (0x3 << 12)) >> 6) | (Desc & (0x3 << 2)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(Desc)                  ((((Desc) & TT_DESCRIPTOR_PAGE_AP_MASK) << 6) & TT_DESCRIPTOR_SECTION_AP_MASK)
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_SECTION_AP(Desc)  ((((Desc) & TT_DESCRIPTOR_PAGE_AP_MASK) << 6) & TT_DESCRIPTOR_SECTION_AP_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(Desc,IsLargePage)      (IsLargePage? \
 | 
					#define TT_DESCRIPTOR_CONVERT_TO_SECTION_CACHE_POLICY(Desc, IsLargePage)  (IsLargePage?    \
 | 
				
			||||||
                                                                    (((Desc) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK): \
 | 
					                                                                    (((Desc) & TT_DESCRIPTOR_LARGEPAGE_CACHE_POLICY_MASK) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK): \
 | 
				
			||||||
                                                                    (((((Desc) & (0x3 << 6)) << 6) | (Desc & (0x3 << 2)))))
 | 
					                                                                    (((((Desc) & (0x3 << 6)) << 6) | (Desc & (0x3 << 2)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK                (TT_DESCRIPTOR_SECTION_NS_MASK | TT_DESCRIPTOR_SECTION_NG_MASK | \
 | 
					#define TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK  (TT_DESCRIPTOR_SECTION_NS_MASK | TT_DESCRIPTOR_SECTION_NG_MASK |               \
 | 
				
			||||||
                                                             TT_DESCRIPTOR_SECTION_S_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | \
 | 
					                                                             TT_DESCRIPTOR_SECTION_S_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | \
 | 
				
			||||||
                                                             TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK)
 | 
					                                                             TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK                   (TT_DESCRIPTOR_PAGE_NG_MASK | TT_DESCRIPTOR_PAGE_S_MASK | \
 | 
					#define TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK  (TT_DESCRIPTOR_PAGE_NG_MASK | TT_DESCRIPTOR_PAGE_S_MASK |                  \
 | 
				
			||||||
                                                             TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_XN_MASK | \
 | 
					                                                             TT_DESCRIPTOR_PAGE_AP_MASK | TT_DESCRIPTOR_PAGE_XN_MASK | \
 | 
				
			||||||
                                                             TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK)
 | 
					                                                             TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_DOMAIN_MASK                       (0x0FUL << 5)
 | 
					#define TT_DESCRIPTOR_SECTION_DOMAIN_MASK  (0x0FUL << 5)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_DOMAIN(a)                         (((a) & 0x0FUL) << 5)
 | 
					#define TT_DESCRIPTOR_SECTION_DOMAIN(a)  (((a) & 0x0FUL) << 5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK                 (0xFFF00000)
 | 
					#define TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK       (0xFFF00000)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK            (0xFFFFFC00)
 | 
					#define TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK  (0xFFFFFC00)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_BASE_ADDRESS(a)                   ((a) & TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK)
 | 
					#define TT_DESCRIPTOR_SECTION_BASE_ADDRESS(a)  ((a) & TT_DESCRIPTOR_SECTION_BASE_ADDRESS_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_BASE_SHIFT                        20
 | 
					#define TT_DESCRIPTOR_SECTION_BASE_SHIFT  20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK                 (0xFFFFF000)
 | 
					#define TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK  (0xFFFFF000)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_INDEX_MASK                        (0x000FF000)
 | 
					#define TT_DESCRIPTOR_PAGE_INDEX_MASK         (0x000FF000)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_BASE_ADDRESS(a)                   ((a) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK)
 | 
					#define TT_DESCRIPTOR_PAGE_BASE_ADDRESS(a)  ((a) & TT_DESCRIPTOR_PAGE_BASE_ADDRESS_MASK)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_BASE_SHIFT                        12
 | 
					#define TT_DESCRIPTOR_PAGE_BASE_SHIFT  12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_WRITE_BACK(NonSecure)         (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           | \
 | 
					#define TT_DESCRIPTOR_SECTION_WRITE_BACK(NonSecure)     (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           |     \
 | 
				
			||||||
                                                            ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
					                                                            ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_S_SHARED                          | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_S_SHARED                          | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_DOMAIN(0)                         | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_DOMAIN(0)                         | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC)
 | 
					                                                            TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_BACK_ALLOC)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_WRITE_THROUGH(NonSecure)      (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           | \
 | 
					#define TT_DESCRIPTOR_SECTION_WRITE_THROUGH(NonSecure)  (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           |     \
 | 
				
			||||||
                                                            ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
					                                                            ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_S_SHARED                          | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_S_SHARED                          | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_DOMAIN(0)                         | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_DOMAIN(0)                         | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)
 | 
					                                                            TT_DESCRIPTOR_SECTION_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_DEVICE(NonSecure)             (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           | \
 | 
					#define TT_DESCRIPTOR_SECTION_DEVICE(NonSecure)         (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           |     \
 | 
				
			||||||
                                                            ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
					                                                            ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      | \
 | 
				
			||||||
@@ -193,7 +192,7 @@
 | 
				
			|||||||
                                                            TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_XN_MASK                           | \
 | 
					                                                            TT_DESCRIPTOR_SECTION_XN_MASK                           | \
 | 
				
			||||||
                                                            TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE)
 | 
					                                                            TT_DESCRIPTOR_SECTION_CACHE_POLICY_SHAREABLE_DEVICE)
 | 
				
			||||||
#define TT_DESCRIPTOR_SECTION_UNCACHED(NonSecure)          (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           | \
 | 
					#define TT_DESCRIPTOR_SECTION_UNCACHED(NonSecure)       (TT_DESCRIPTOR_SECTION_TYPE_SECTION                                                           |    \
 | 
				
			||||||
                                                           ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
					                                                           ((NonSecure) ?  TT_DESCRIPTOR_SECTION_NS : 0)    | \
 | 
				
			||||||
                                                           TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
					                                                           TT_DESCRIPTOR_SECTION_NG_GLOBAL                         | \
 | 
				
			||||||
                                                           TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      | \
 | 
					                                                           TT_DESCRIPTOR_SECTION_S_NOT_SHARED                      | \
 | 
				
			||||||
@@ -201,33 +200,33 @@
 | 
				
			|||||||
                                                           TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
					                                                           TT_DESCRIPTOR_SECTION_AP_RW_RW                          | \
 | 
				
			||||||
                                                           TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE)
 | 
					                                                           TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_WRITE_BACK              (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \
 | 
					#define TT_DESCRIPTOR_PAGE_WRITE_BACK     (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           |          \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_S_SHARED                                                       | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_S_SHARED                                                       | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC)
 | 
					                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_WRITE_THROUGH           (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \
 | 
					#define TT_DESCRIPTOR_PAGE_WRITE_THROUGH  (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           |          \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_S_SHARED                                                       | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_S_SHARED                                                       | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)
 | 
					                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_DEVICE                  (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \
 | 
					#define TT_DESCRIPTOR_PAGE_DEVICE         (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           |          \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_S_NOT_SHARED                                                   | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_S_NOT_SHARED                                                   | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_XN_MASK                                                        | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_XN_MASK                                                        | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE)
 | 
					                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE)
 | 
				
			||||||
#define TT_DESCRIPTOR_PAGE_UNCACHED                (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           | \
 | 
					#define TT_DESCRIPTOR_PAGE_UNCACHED       (TT_DESCRIPTOR_PAGE_TYPE_PAGE                                                           |          \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_NG_GLOBAL                                                      | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_S_NOT_SHARED                                                   | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_S_NOT_SHARED                                                   | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
					                                                        TT_DESCRIPTOR_PAGE_AP_RW_RW                                                       | \
 | 
				
			||||||
                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE)
 | 
					                                                        TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// First Level Descriptors
 | 
					// First Level Descriptors
 | 
				
			||||||
typedef UINT32    ARM_FIRST_LEVEL_DESCRIPTOR;
 | 
					typedef UINT32 ARM_FIRST_LEVEL_DESCRIPTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Second Level Descriptors
 | 
					// Second Level Descriptors
 | 
				
			||||||
typedef UINT32    ARM_PAGE_TABLE_ENTRY;
 | 
					typedef UINT32 ARM_PAGE_TABLE_ENTRY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
ConvertSectionAttributesToPageAttributes (
 | 
					ConvertSectionAttributesToPageAttributes (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,52 +9,50 @@
 | 
				
			|||||||
#ifndef ARM_MP_CORE_INFO_GUID_H_
 | 
					#ifndef ARM_MP_CORE_INFO_GUID_H_
 | 
				
			||||||
#define ARM_MP_CORE_INFO_GUID_H_
 | 
					#define ARM_MP_CORE_INFO_GUID_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_CPUS_PER_MPCORE_SYSTEM    0x04
 | 
					#define MAX_CPUS_PER_MPCORE_SYSTEM  0x04
 | 
				
			||||||
#define SCU_CONFIG_REG_OFFSET         0x04
 | 
					#define SCU_CONFIG_REG_OFFSET       0x04
 | 
				
			||||||
#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;
 | 
				
			||||||
  EFI_PHYSICAL_ADDRESS  MailboxGetAddress;
 | 
					  EFI_PHYSICAL_ADDRESS    MailboxGetAddress;
 | 
				
			||||||
  EFI_PHYSICAL_ADDRESS  MailboxClearAddress;
 | 
					  EFI_PHYSICAL_ADDRESS    MailboxClearAddress;
 | 
				
			||||||
  UINT64                MailboxClearValue;
 | 
					  UINT64                  MailboxClearValue;
 | 
				
			||||||
} ARM_CORE_INFO;
 | 
					} ARM_CORE_INFO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct{
 | 
					typedef struct {
 | 
				
			||||||
        UINT64   Signature;
 | 
					  UINT64      Signature;
 | 
				
			||||||
        UINT32   Length;
 | 
					  UINT32      Length;
 | 
				
			||||||
        UINT32   Revision;
 | 
					  UINT32      Revision;
 | 
				
			||||||
        UINT64   OemId;
 | 
					  UINT64      OemId;
 | 
				
			||||||
        UINT64   OemTableId;
 | 
					  UINT64      OemTableId;
 | 
				
			||||||
        UINTN    OemRevision;
 | 
					  UINTN       OemRevision;
 | 
				
			||||||
        UINTN    CreatorId;
 | 
					  UINTN       CreatorId;
 | 
				
			||||||
        UINTN    CreatorRevision;
 | 
					  UINTN       CreatorRevision;
 | 
				
			||||||
        EFI_GUID Identifier;
 | 
					  EFI_GUID    Identifier;
 | 
				
			||||||
        UINTN    DataLen;
 | 
					  UINTN       DataLen;
 | 
				
			||||||
} ARM_PROCESSOR_TABLE_HEADER;
 | 
					} ARM_PROCESSOR_TABLE_HEADER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
        ARM_PROCESSOR_TABLE_HEADER   Header;
 | 
					  ARM_PROCESSOR_TABLE_HEADER    Header;
 | 
				
			||||||
        UINTN                        NumberOfEntries;
 | 
					  UINTN                         NumberOfEntries;
 | 
				
			||||||
        ARM_CORE_INFO                *ArmCpus;
 | 
					  ARM_CORE_INFO                 *ArmCpus;
 | 
				
			||||||
} ARM_PROCESSOR_TABLE;
 | 
					} 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_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_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_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_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_OEM_REVISION      0x00000001
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_CREATOR_ID       0xA5A5A5A5
 | 
					#define EFI_ARM_PROCESSOR_TABLE_CREATOR_ID        0xA5A5A5A5
 | 
				
			||||||
#define EFI_ARM_PROCESSOR_TABLE_CREATOR_REVISION 0x01000001
 | 
					#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_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,22 +13,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// The ARM Architecture Reference Manual for ARMv8-A defines up
 | 
					// The ARM Architecture Reference Manual for ARMv8-A defines up
 | 
				
			||||||
// to 7 levels of cache, L1 through L7.
 | 
					// to 7 levels of cache, L1 through L7.
 | 
				
			||||||
#define MAX_ARM_CACHE_LEVEL   7
 | 
					#define MAX_ARM_CACHE_LEVEL  7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Defines the structure of the CSSELR (Cache Size Selection) register
 | 
					/// Defines the structure of the CSSELR (Cache Size Selection) register
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT32    InD       :1;  ///< Instruction not Data bit
 | 
					    UINT32    InD      : 1;  ///< Instruction not Data bit
 | 
				
			||||||
    UINT32    Level     :3;  ///< Cache level (zero based)
 | 
					    UINT32    Level    : 3;  ///< Cache level (zero based)
 | 
				
			||||||
    UINT32    TnD       :1;  ///< Allocation not Data bit
 | 
					    UINT32    TnD      : 1;  ///< Allocation not Data bit
 | 
				
			||||||
    UINT32    Reserved  :27; ///< Reserved, RES0
 | 
					    UINT32    Reserved : 27; ///< Reserved, RES0
 | 
				
			||||||
  } Bits; ///< Bitfield definition of the register
 | 
					  } Bits;         ///< Bitfield definition of the register
 | 
				
			||||||
  UINT32 Data; ///< The entire 32-bit value
 | 
					  UINT32    Data; ///< The entire 32-bit value
 | 
				
			||||||
} 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
 | 
				
			||||||
@@ -39,35 +38,35 @@ typedef enum
 | 
				
			|||||||
/// Defines the structure of the CCSIDR (Current Cache Size ID) register
 | 
					/// Defines the structure of the CCSIDR (Current Cache Size ID) register
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT64    LineSize           :3;  ///< Line size (Log2(Num bytes in cache) - 4)
 | 
					    UINT64    LineSize      : 3;      ///< Line size (Log2(Num bytes in cache) - 4)
 | 
				
			||||||
    UINT64    Associativity      :10; ///< Associativity - 1
 | 
					    UINT64    Associativity : 10;     ///< Associativity - 1
 | 
				
			||||||
    UINT64    NumSets            :15; ///< Number of sets in the cache -1
 | 
					    UINT64    NumSets       : 15;     ///< Number of sets in the cache -1
 | 
				
			||||||
    UINT64    Unknown            :4;  ///< Reserved, UNKNOWN
 | 
					    UINT64    Unknown       : 4;      ///< Reserved, UNKNOWN
 | 
				
			||||||
    UINT64    Reserved           :32; ///< Reserved, RES0
 | 
					    UINT64    Reserved      : 32;     ///< Reserved, RES0
 | 
				
			||||||
  } BitsNonCcidx; ///< Bitfield definition of the register when FEAT_CCIDX is not supported.
 | 
					  } BitsNonCcidx; ///< Bitfield definition of the register when FEAT_CCIDX is not supported.
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT64    LineSize           :3;  ///< Line size (Log2(Num bytes in cache) - 4)
 | 
					    UINT64    LineSize      : 3;      ///< Line size (Log2(Num bytes in cache) - 4)
 | 
				
			||||||
    UINT64    Associativity      :21; ///< Associativity - 1
 | 
					    UINT64    Associativity : 21;     ///< Associativity - 1
 | 
				
			||||||
    UINT64    Reserved1          :8;  ///< Reserved, RES0
 | 
					    UINT64    Reserved1     : 8;      ///< Reserved, RES0
 | 
				
			||||||
    UINT64    NumSets            :24; ///< Number of sets in the cache -1
 | 
					    UINT64    NumSets       : 24;     ///< Number of sets in the cache -1
 | 
				
			||||||
    UINT64    Reserved2          :8;  ///< Reserved, RES0
 | 
					    UINT64    Reserved2     : 8;      ///< Reserved, RES0
 | 
				
			||||||
  } BitsCcidxAA64; ///< Bitfield definition of the register when FEAT_IDX is supported.
 | 
					  } BitsCcidxAA64; ///< Bitfield definition of the register when FEAT_IDX is supported.
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT64    LineSize           : 3;
 | 
					    UINT64    LineSize      : 3;
 | 
				
			||||||
    UINT64    Associativity      : 21;
 | 
					    UINT64    Associativity : 21;
 | 
				
			||||||
    UINT64    Reserved           : 8;
 | 
					    UINT64    Reserved      : 8;
 | 
				
			||||||
    UINT64    Unallocated        : 32;
 | 
					    UINT64    Unallocated   : 32;
 | 
				
			||||||
  } BitsCcidxAA32;
 | 
					  } BitsCcidxAA32;
 | 
				
			||||||
  UINT64 Data; ///< The entire 64-bit value
 | 
					  UINT64    Data; ///< The entire 64-bit value
 | 
				
			||||||
} CCSIDR_DATA;
 | 
					} CCSIDR_DATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Defines the structure of the AARCH32 CCSIDR2 register.
 | 
					/// Defines the structure of the AARCH32 CCSIDR2 register.
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT32 NumSets               :24; ///< Number of sets in the cache - 1
 | 
					    UINT32    NumSets  : 24;          ///< Number of sets in the cache - 1
 | 
				
			||||||
    UINT32 Reserved              :8;  ///< Reserved, RES0
 | 
					    UINT32    Reserved : 8;           ///< Reserved, RES0
 | 
				
			||||||
  } Bits; ///< Bitfield definition of the register
 | 
					  } Bits;         ///< Bitfield definition of the register
 | 
				
			||||||
  UINT32 Data; ///< The entire 32-bit value
 | 
					  UINT32    Data; ///< The entire 32-bit value
 | 
				
			||||||
} CCSIDR2_DATA;
 | 
					} CCSIDR2_DATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Defines the structure of the CLIDR (Cache Level ID) register.
 | 
					/** Defines the structure of the CLIDR (Cache Level ID) register.
 | 
				
			||||||
@@ -77,19 +76,19 @@ typedef union {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  struct {
 | 
					  struct {
 | 
				
			||||||
    UINT32    Ctype1   : 3; ///< Level 1 cache type
 | 
					    UINT32    Ctype1 : 3;   ///< Level 1 cache type
 | 
				
			||||||
    UINT32    Ctype2   : 3; ///< Level 2 cache type
 | 
					    UINT32    Ctype2 : 3;   ///< Level 2 cache type
 | 
				
			||||||
    UINT32    Ctype3   : 3; ///< Level 3 cache type
 | 
					    UINT32    Ctype3 : 3;   ///< Level 3 cache type
 | 
				
			||||||
    UINT32    Ctype4   : 3; ///< Level 4 cache type
 | 
					    UINT32    Ctype4 : 3;   ///< Level 4 cache type
 | 
				
			||||||
    UINT32    Ctype5   : 3; ///< Level 5 cache type
 | 
					    UINT32    Ctype5 : 3;   ///< Level 5 cache type
 | 
				
			||||||
    UINT32    Ctype6   : 3; ///< Level 6 cache type
 | 
					    UINT32    Ctype6 : 3;   ///< Level 6 cache type
 | 
				
			||||||
    UINT32    Ctype7   : 3; ///< Level 7 cache type
 | 
					    UINT32    Ctype7 : 3;   ///< Level 7 cache type
 | 
				
			||||||
    UINT32    LoUIS    : 3; ///< Level of Unification Inner Shareable
 | 
					    UINT32    LoUIS  : 3;   ///< Level of Unification Inner Shareable
 | 
				
			||||||
    UINT32    LoC      : 3; ///< Level of Coherency
 | 
					    UINT32    LoC    : 3;   ///< Level of Coherency
 | 
				
			||||||
    UINT32    LoUU     : 3; ///< Level of Unification Uniprocessor
 | 
					    UINT32    LoUU   : 3;   ///< Level of Unification Uniprocessor
 | 
				
			||||||
    UINT32    Icb      : 3; ///< Inner Cache Boundary
 | 
					    UINT32    Icb    : 3;   ///< Inner Cache Boundary
 | 
				
			||||||
  } Bits; ///< Bitfield definition of the register
 | 
					  } Bits;         ///< Bitfield definition of the register
 | 
				
			||||||
  UINT32 Data; ///< The entire 32-bit value
 | 
					  UINT32    Data; ///< The entire 32-bit value
 | 
				
			||||||
} CLIDR_DATA;
 | 
					} CLIDR_DATA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// The cache types reported in the CLIDR register.
 | 
					/// The cache types reported in the CLIDR register.
 | 
				
			||||||
@@ -107,6 +106,6 @@ typedef enum {
 | 
				
			|||||||
  ClidrCacheTypeMax
 | 
					  ClidrCacheTypeMax
 | 
				
			||||||
} CLIDR_CACHE_TYPE;
 | 
					} CLIDR_CACHE_TYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CLIDR_GET_CACHE_TYPE(x, level) ((x >> (3 * (level))) & 0b111)
 | 
					#define CLIDR_GET_CACHE_TYPE(x, level)  ((x >> (3 * (level))) & 0b111)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_CACHE_H_ */
 | 
					#endif /* ARM_CACHE_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,34 +16,34 @@
 | 
				
			|||||||
#ifndef ARM_FFA_SVC_H_
 | 
					#ifndef ARM_FFA_SVC_H_
 | 
				
			||||||
#define ARM_FFA_SVC_H_
 | 
					#define ARM_FFA_SVC_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SVC_ID_FFA_VERSION_AARCH32                  0x84000063
 | 
					#define ARM_SVC_ID_FFA_VERSION_AARCH32               0x84000063
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32      0x8400006F
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32   0x8400006F
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32     0x84000070
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32  0x84000070
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64      0xC400006F
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64   0xC400006F
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64     0xC4000070
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64  0xC4000070
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Generic IDs when using AArch32 or AArch64 execution state */
 | 
					/* Generic IDs when using AArch32 or AArch64 execution state */
 | 
				
			||||||
#ifdef MDE_CPU_AARCH64
 | 
					#ifdef MDE_CPU_AARCH64
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ     ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ   ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP    ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP  ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ     ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ   ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH32
 | 
				
			||||||
#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP    ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32
 | 
					#define ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP  ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH32
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPM_MAJOR_VERSION_FFA                           1
 | 
					#define SPM_MAJOR_VERSION_FFA  1
 | 
				
			||||||
#define SPM_MINOR_VERSION_FFA                           0
 | 
					#define SPM_MINOR_VERSION_FFA  0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_FFA_SPM_RET_SUCCESS                          0
 | 
					#define ARM_FFA_SPM_RET_SUCCESS             0
 | 
				
			||||||
#define ARM_FFA_SPM_RET_NOT_SUPPORTED                   -1
 | 
					#define ARM_FFA_SPM_RET_NOT_SUPPORTED       -1
 | 
				
			||||||
#define ARM_FFA_SPM_RET_INVALID_PARAMETERS              -2
 | 
					#define ARM_FFA_SPM_RET_INVALID_PARAMETERS  -2
 | 
				
			||||||
#define ARM_FFA_SPM_RET_NO_MEMORY                       -3
 | 
					#define ARM_FFA_SPM_RET_NO_MEMORY           -3
 | 
				
			||||||
#define ARM_FFA_SPM_RET_BUSY                            -4
 | 
					#define ARM_FFA_SPM_RET_BUSY                -4
 | 
				
			||||||
#define ARM_FFA_SPM_RET_INTERRUPTED                     -5
 | 
					#define ARM_FFA_SPM_RET_INTERRUPTED         -5
 | 
				
			||||||
#define ARM_FFA_SPM_RET_DENIED                          -6
 | 
					#define ARM_FFA_SPM_RET_DENIED              -6
 | 
				
			||||||
#define ARM_FFA_SPM_RET_RETRY                           -7
 | 
					#define ARM_FFA_SPM_RET_RETRY               -7
 | 
				
			||||||
#define ARM_FFA_SPM_RET_ABORTED                         -8
 | 
					#define ARM_FFA_SPM_RET_ABORTED             -8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// For now, the destination id to be used in the FF-A calls
 | 
					// For now, the destination id to be used in the FF-A calls
 | 
				
			||||||
// is being hard-coded. Subsequently, support will be added
 | 
					// is being hard-coded. Subsequently, support will be added
 | 
				
			||||||
@@ -51,6 +51,6 @@
 | 
				
			|||||||
// This is the endpoint id used by the optee os's implementation
 | 
					// This is the endpoint id used by the optee os's implementation
 | 
				
			||||||
// of the spmc.
 | 
					// of the spmc.
 | 
				
			||||||
// https://github.com/OP-TEE/optee_os/blob/master/core/arch/arm/kernel/stmm_sp.c#L66
 | 
					// https://github.com/OP-TEE/optee_os/blob/master/core/arch/arm/kernel/stmm_sp.c#L66
 | 
				
			||||||
#define ARM_FFA_DESTINATION_ENDPOINT_ID                  3
 | 
					#define ARM_FFA_DESTINATION_ENDPOINT_ID  3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_FFA_SVC_H_
 | 
					#endif // ARM_FFA_SVC_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,49 +14,49 @@
 | 
				
			|||||||
 * delegated events and request the Secure partition manager to perform
 | 
					 * delegated events and request the Secure partition manager to perform
 | 
				
			||||||
 * privileged operations on its behalf.
 | 
					 * privileged operations on its behalf.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define ARM_SVC_ID_SPM_VERSION_AARCH32             0x84000060
 | 
					#define ARM_SVC_ID_SPM_VERSION_AARCH32            0x84000060
 | 
				
			||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH32       0x84000061
 | 
					#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH32      0x84000061
 | 
				
			||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH32   0x84000064
 | 
					#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH32  0x84000064
 | 
				
			||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH32   0x84000065
 | 
					#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH32  0x84000065
 | 
				
			||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64       0xC4000061
 | 
					#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64      0xC4000061
 | 
				
			||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64   0xC4000064
 | 
					#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64  0xC4000064
 | 
				
			||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64   0xC4000065
 | 
					#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64  0xC4000065
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Generic IDs when using AArch32 or AArch64 execution state */
 | 
					/* Generic IDs when using AArch32 or AArch64 execution state */
 | 
				
			||||||
#ifdef MDE_CPU_AARCH64
 | 
					#ifdef MDE_CPU_AARCH64
 | 
				
			||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE               ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64
 | 
					#define ARM_SVC_ID_SP_EVENT_COMPLETE      ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64
 | 
				
			||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES       ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64
 | 
					#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES  ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64
 | 
				
			||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES       ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64
 | 
					#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES  ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE               ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH32
 | 
					#define ARM_SVC_ID_SP_EVENT_COMPLETE      ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH32
 | 
				
			||||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES       ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH32
 | 
					#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES  ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH32
 | 
				
			||||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES       ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH32
 | 
					#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES  ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH32
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SET_MEM_ATTR_DATA_PERM_MASK       0x3
 | 
					#define SET_MEM_ATTR_DATA_PERM_MASK       0x3
 | 
				
			||||||
#define SET_MEM_ATTR_DATA_PERM_SHIFT        0
 | 
					#define SET_MEM_ATTR_DATA_PERM_SHIFT      0
 | 
				
			||||||
#define SET_MEM_ATTR_DATA_PERM_NO_ACCESS    0
 | 
					#define SET_MEM_ATTR_DATA_PERM_NO_ACCESS  0
 | 
				
			||||||
#define SET_MEM_ATTR_DATA_PERM_RW           1
 | 
					#define SET_MEM_ATTR_DATA_PERM_RW         1
 | 
				
			||||||
#define SET_MEM_ATTR_DATA_PERM_RO           3
 | 
					#define SET_MEM_ATTR_DATA_PERM_RO         3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SET_MEM_ATTR_CODE_PERM_MASK   0x1
 | 
					#define SET_MEM_ATTR_CODE_PERM_MASK   0x1
 | 
				
			||||||
#define SET_MEM_ATTR_CODE_PERM_SHIFT    2
 | 
					#define SET_MEM_ATTR_CODE_PERM_SHIFT  2
 | 
				
			||||||
#define SET_MEM_ATTR_CODE_PERM_X        0
 | 
					#define SET_MEM_ATTR_CODE_PERM_X      0
 | 
				
			||||||
#define SET_MEM_ATTR_CODE_PERM_XN       1
 | 
					#define SET_MEM_ATTR_CODE_PERM_XN     1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SET_MEM_ATTR_MAKE_PERM_REQUEST(d_perm, c_perm)                            \
 | 
					#define SET_MEM_ATTR_MAKE_PERM_REQUEST(d_perm, c_perm)                            \
 | 
				
			||||||
    ((((c_perm) & SET_MEM_ATTR_CODE_PERM_MASK) << SET_MEM_ATTR_CODE_PERM_SHIFT) | \
 | 
					    ((((c_perm) & SET_MEM_ATTR_CODE_PERM_MASK) << SET_MEM_ATTR_CODE_PERM_SHIFT) | \
 | 
				
			||||||
    (( (d_perm) & SET_MEM_ATTR_DATA_PERM_MASK) << SET_MEM_ATTR_DATA_PERM_SHIFT))
 | 
					    (( (d_perm) & SET_MEM_ATTR_DATA_PERM_MASK) << SET_MEM_ATTR_DATA_PERM_SHIFT))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* MM SVC Return error codes */
 | 
					/* MM SVC Return error codes */
 | 
				
			||||||
#define ARM_SVC_SPM_RET_SUCCESS               0
 | 
					#define ARM_SVC_SPM_RET_SUCCESS         0
 | 
				
			||||||
#define ARM_SVC_SPM_RET_NOT_SUPPORTED        -1
 | 
					#define ARM_SVC_SPM_RET_NOT_SUPPORTED   -1
 | 
				
			||||||
#define ARM_SVC_SPM_RET_INVALID_PARAMS       -2
 | 
					#define ARM_SVC_SPM_RET_INVALID_PARAMS  -2
 | 
				
			||||||
#define ARM_SVC_SPM_RET_DENIED               -3
 | 
					#define ARM_SVC_SPM_RET_DENIED          -3
 | 
				
			||||||
#define ARM_SVC_SPM_RET_NO_MEMORY            -5
 | 
					#define ARM_SVC_SPM_RET_NO_MEMORY       -5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPM_MAJOR_VERSION                     0
 | 
					#define SPM_MAJOR_VERSION  0
 | 
				
			||||||
#define SPM_MINOR_VERSION                     1
 | 
					#define SPM_MINOR_VERSION  1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_MM_SVC_H_
 | 
					#endif // ARM_MM_SVC_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,64 +17,64 @@
 | 
				
			|||||||
 * SMC function IDs for Standard Service queries
 | 
					 * SMC function IDs for Standard Service queries
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SMC_ID_STD_CALL_COUNT     0x8400ff00
 | 
					#define ARM_SMC_ID_STD_CALL_COUNT  0x8400ff00
 | 
				
			||||||
#define ARM_SMC_ID_STD_UID            0x8400ff01
 | 
					#define ARM_SMC_ID_STD_UID         0x8400ff01
 | 
				
			||||||
/*                                    0x8400ff02 is reserved */
 | 
					/*                                    0x8400ff02 is reserved */
 | 
				
			||||||
#define ARM_SMC_ID_STD_REVISION       0x8400ff03
 | 
					#define ARM_SMC_ID_STD_REVISION  0x8400ff03
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The 'Standard Service Call UID' is supposed to return the Standard
 | 
					 * The 'Standard Service Call UID' is supposed to return the Standard
 | 
				
			||||||
 * Service UUID. This is a 128-bit value.
 | 
					 * Service UUID. This is a 128-bit value.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define ARM_SMC_STD_UUID0       0x108d905b
 | 
					#define ARM_SMC_STD_UUID0  0x108d905b
 | 
				
			||||||
#define ARM_SMC_STD_UUID1       0x47e8f863
 | 
					#define ARM_SMC_STD_UUID1  0x47e8f863
 | 
				
			||||||
#define ARM_SMC_STD_UUID2       0xfbc02dae
 | 
					#define ARM_SMC_STD_UUID2  0xfbc02dae
 | 
				
			||||||
#define ARM_SMC_STD_UUID3       0xe2f64156
 | 
					#define ARM_SMC_STD_UUID3  0xe2f64156
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * ARM Standard Service Calls revision numbers
 | 
					 * ARM Standard Service Calls revision numbers
 | 
				
			||||||
 * The current revision is:  0.1
 | 
					 * The current revision is:  0.1
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define ARM_SMC_STD_REVISION_MAJOR    0x0
 | 
					#define ARM_SMC_STD_REVISION_MAJOR  0x0
 | 
				
			||||||
#define ARM_SMC_STD_REVISION_MINOR    0x1
 | 
					#define ARM_SMC_STD_REVISION_MINOR  0x1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Management Mode (MM) calls cover a subset of the Standard Service Call range.
 | 
					 * Management Mode (MM) calls cover a subset of the Standard Service Call range.
 | 
				
			||||||
 * The list below is not exhaustive.
 | 
					 * The list below is not exhaustive.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define ARM_SMC_ID_MM_VERSION_AARCH32              0x84000040
 | 
					#define ARM_SMC_ID_MM_VERSION_AARCH32  0x84000040
 | 
				
			||||||
#define ARM_SMC_ID_MM_VERSION_AARCH64              0xC4000040
 | 
					#define ARM_SMC_ID_MM_VERSION_AARCH64  0xC4000040
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Request service from secure standalone MM environment
 | 
					// Request service from secure standalone MM environment
 | 
				
			||||||
#define ARM_SMC_ID_MM_COMMUNICATE_AARCH32          0x84000041
 | 
					#define ARM_SMC_ID_MM_COMMUNICATE_AARCH32  0x84000041
 | 
				
			||||||
#define ARM_SMC_ID_MM_COMMUNICATE_AARCH64          0xC4000041
 | 
					#define ARM_SMC_ID_MM_COMMUNICATE_AARCH64  0xC4000041
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Generic ID when using AArch32 or AArch64 execution state */
 | 
					/* Generic ID when using AArch32 or AArch64 execution state */
 | 
				
			||||||
#ifdef MDE_CPU_AARCH64
 | 
					#ifdef MDE_CPU_AARCH64
 | 
				
			||||||
#define ARM_SMC_ID_MM_COMMUNICATE   ARM_SMC_ID_MM_COMMUNICATE_AARCH64
 | 
					#define ARM_SMC_ID_MM_COMMUNICATE  ARM_SMC_ID_MM_COMMUNICATE_AARCH64
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
#define ARM_SMC_ID_MM_COMMUNICATE   ARM_SMC_ID_MM_COMMUNICATE_AARCH32
 | 
					#define ARM_SMC_ID_MM_COMMUNICATE  ARM_SMC_ID_MM_COMMUNICATE_AARCH32
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* MM return error codes */
 | 
					/* MM return error codes */
 | 
				
			||||||
#define ARM_SMC_MM_RET_SUCCESS              0
 | 
					#define ARM_SMC_MM_RET_SUCCESS         0
 | 
				
			||||||
#define ARM_SMC_MM_RET_NOT_SUPPORTED       -1
 | 
					#define ARM_SMC_MM_RET_NOT_SUPPORTED   -1
 | 
				
			||||||
#define ARM_SMC_MM_RET_INVALID_PARAMS      -2
 | 
					#define ARM_SMC_MM_RET_INVALID_PARAMS  -2
 | 
				
			||||||
#define ARM_SMC_MM_RET_DENIED              -3
 | 
					#define ARM_SMC_MM_RET_DENIED          -3
 | 
				
			||||||
#define ARM_SMC_MM_RET_NO_MEMORY           -4
 | 
					#define ARM_SMC_MM_RET_NO_MEMORY       -4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ARM Architecture Calls
 | 
					// ARM Architecture Calls
 | 
				
			||||||
#define SMCCC_VERSION           0x80000000
 | 
					#define SMCCC_VERSION            0x80000000
 | 
				
			||||||
#define SMCCC_ARCH_FEATURES     0x80000001
 | 
					#define SMCCC_ARCH_FEATURES      0x80000001
 | 
				
			||||||
#define SMCCC_ARCH_SOC_ID       0x80000002
 | 
					#define SMCCC_ARCH_SOC_ID        0x80000002
 | 
				
			||||||
#define SMCCC_ARCH_WORKAROUND_1 0x80008000
 | 
					#define SMCCC_ARCH_WORKAROUND_1  0x80008000
 | 
				
			||||||
#define SMCCC_ARCH_WORKAROUND_2 0x80007FFF
 | 
					#define SMCCC_ARCH_WORKAROUND_2  0x80007FFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SMC_ARCH_CALL_SUCCESS            0
 | 
					#define SMC_ARCH_CALL_SUCCESS            0
 | 
				
			||||||
#define SMC_ARCH_CALL_NOT_SUPPORTED     -1
 | 
					#define SMC_ARCH_CALL_NOT_SUPPORTED      -1
 | 
				
			||||||
#define SMC_ARCH_CALL_NOT_REQUIRED      -2
 | 
					#define SMC_ARCH_CALL_NOT_REQUIRED       -2
 | 
				
			||||||
#define SMC_ARCH_CALL_INVALID_PARAMETER -3
 | 
					#define SMC_ARCH_CALL_INVALID_PARAMETER  -3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Power State Coordination Interface (PSCI) calls cover a subset of the
 | 
					 * Power State Coordination Interface (PSCI) calls cover a subset of the
 | 
				
			||||||
@@ -101,15 +101,15 @@
 | 
				
			|||||||
  ((ARM_SMC_PSCI_VERSION_MAJOR << 16) | ARM_SMC_PSCI_VERSION_MINOR)
 | 
					  ((ARM_SMC_PSCI_VERSION_MAJOR << 16) | ARM_SMC_PSCI_VERSION_MINOR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PSCI return error codes */
 | 
					/* PSCI return error codes */
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_SUCCESS            0
 | 
					#define ARM_SMC_PSCI_RET_SUCCESS         0
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_NOT_SUPPORTED      -1
 | 
					#define ARM_SMC_PSCI_RET_NOT_SUPPORTED   -1
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_INVALID_PARAMS     -2
 | 
					#define ARM_SMC_PSCI_RET_INVALID_PARAMS  -2
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_DENIED             -3
 | 
					#define ARM_SMC_PSCI_RET_DENIED          -3
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_ALREADY_ON         -4
 | 
					#define ARM_SMC_PSCI_RET_ALREADY_ON      -4
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_ON_PENDING         -5
 | 
					#define ARM_SMC_PSCI_RET_ON_PENDING      -5
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_INTERN_FAIL        -6
 | 
					#define ARM_SMC_PSCI_RET_INTERN_FAIL     -6
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_NOT_PRESENT        -7
 | 
					#define ARM_SMC_PSCI_RET_NOT_PRESENT     -7
 | 
				
			||||||
#define ARM_SMC_PSCI_RET_DISABLED           -8
 | 
					#define ARM_SMC_PSCI_RET_DISABLED        -8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SMC_PSCI_TARGET_CPU32(Aff2, Aff1, Aff0) \
 | 
					#define ARM_SMC_PSCI_TARGET_CPU32(Aff2, Aff1, Aff0) \
 | 
				
			||||||
  ((((Aff2) & 0xFF) << 16) | (((Aff1) & 0xFF) << 8) | ((Aff0) & 0xFF))
 | 
					  ((((Aff2) & 0xFF) << 16) | (((Aff1) & 0xFF) << 8) | ((Aff0) & 0xFF))
 | 
				
			||||||
@@ -120,10 +120,10 @@
 | 
				
			|||||||
#define ARM_SMC_PSCI_TARGET_GET_AFF0(TargetId)  ((TargetId) & 0xFF)
 | 
					#define ARM_SMC_PSCI_TARGET_GET_AFF0(TargetId)  ((TargetId) & 0xFF)
 | 
				
			||||||
#define ARM_SMC_PSCI_TARGET_GET_AFF1(TargetId)  (((TargetId) >> 8) & 0xFF)
 | 
					#define ARM_SMC_PSCI_TARGET_GET_AFF1(TargetId)  (((TargetId) >> 8) & 0xFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_0    0
 | 
					#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_0  0
 | 
				
			||||||
#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_1    1
 | 
					#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_1  1
 | 
				
			||||||
#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_2    2
 | 
					#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_2  2
 | 
				
			||||||
#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_3    3
 | 
					#define ARM_SMC_ID_PSCI_AFFINITY_LEVEL_3  3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SMC_ID_PSCI_AFFINITY_INFO_ON          0
 | 
					#define ARM_SMC_ID_PSCI_AFFINITY_INFO_ON          0
 | 
				
			||||||
#define ARM_SMC_ID_PSCI_AFFINITY_INFO_OFF         1
 | 
					#define ARM_SMC_ID_PSCI_AFFINITY_INFO_OFF         1
 | 
				
			||||||
@@ -132,9 +132,9 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * SMC function IDs for Trusted OS Service queries
 | 
					 * SMC function IDs for Trusted OS Service queries
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define ARM_SMC_ID_TOS_CALL_COUNT     0xbf00ff00
 | 
					#define ARM_SMC_ID_TOS_CALL_COUNT  0xbf00ff00
 | 
				
			||||||
#define ARM_SMC_ID_TOS_UID            0xbf00ff01
 | 
					#define ARM_SMC_ID_TOS_UID         0xbf00ff01
 | 
				
			||||||
/*                                    0xbf00ff02 is reserved */
 | 
					/*                                    0xbf00ff02 is reserved */
 | 
				
			||||||
#define ARM_SMC_ID_TOS_REVISION       0xbf00ff03
 | 
					#define ARM_SMC_ID_TOS_REVISION  0xbf00ff03
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_STD_SMC_H_
 | 
					#endif // ARM_STD_SMC_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,12 +26,12 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
DisassembleInstruction (
 | 
					DisassembleInstruction (
 | 
				
			||||||
  IN  UINT8     **OpCodePtr,
 | 
					  IN  UINT8      **OpCodePtr,
 | 
				
			||||||
  IN  BOOLEAN   Thumb,
 | 
					  IN  BOOLEAN    Thumb,
 | 
				
			||||||
  IN  BOOLEAN   Extended,
 | 
					  IN  BOOLEAN    Extended,
 | 
				
			||||||
  IN OUT UINT32 *ItBlock,
 | 
					  IN OUT UINT32  *ItBlock,
 | 
				
			||||||
  OUT CHAR8     *Buf,
 | 
					  OUT CHAR8      *Buf,
 | 
				
			||||||
  OUT UINTN     Size
 | 
					  OUT UINTN      Size
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_DISASSEMBLER_LIB_H_
 | 
					#endif // ARM_DISASSEMBLER_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ ArmGenericTimerGetTimerFreq (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerVal (
 | 
					ArmGenericTimerSetTimerVal (
 | 
				
			||||||
  IN   UINTN   Value
 | 
					  IN   UINTN  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -67,7 +67,7 @@ ArmGenericTimerGetTimerCtrlReg (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerCtrlReg (
 | 
					ArmGenericTimerSetTimerCtrlReg (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
@@ -79,7 +79,7 @@ ArmGenericTimerGetCompareVal (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetCompareVal (
 | 
					ArmGenericTimerSetCompareVal (
 | 
				
			||||||
  IN   UINT64   Value
 | 
					  IN   UINT64  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_GENERIC_TIMER_COUNTER_LIB_H_
 | 
					#endif // ARM_GENERIC_TIMER_COUNTER_LIB_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 (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,36 +12,36 @@
 | 
				
			|||||||
#include <Library/ArmGicArchLib.h>
 | 
					#include <Library/ArmGicArchLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC Distributor
 | 
					// GIC Distributor
 | 
				
			||||||
#define ARM_GIC_ICDDCR          0x000 // Distributor Control Register
 | 
					#define ARM_GIC_ICDDCR   0x000        // Distributor Control Register
 | 
				
			||||||
#define ARM_GIC_ICDICTR         0x004 // Interrupt Controller Type Register
 | 
					#define ARM_GIC_ICDICTR  0x004        // Interrupt Controller Type Register
 | 
				
			||||||
#define ARM_GIC_ICDIIDR         0x008 // Implementer Identification Register
 | 
					#define ARM_GIC_ICDIIDR  0x008        // Implementer Identification Register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Each reg base below repeats for Number of interrupts / 4 (see GIC spec)
 | 
					// Each reg base below repeats for Number of interrupts / 4 (see GIC spec)
 | 
				
			||||||
#define ARM_GIC_ICDISR          0x080 // Interrupt Security Registers
 | 
					#define ARM_GIC_ICDISR   0x080        // Interrupt Security Registers
 | 
				
			||||||
#define ARM_GIC_ICDISER         0x100 // Interrupt Set-Enable Registers
 | 
					#define ARM_GIC_ICDISER  0x100        // Interrupt Set-Enable Registers
 | 
				
			||||||
#define ARM_GIC_ICDICER         0x180 // Interrupt Clear-Enable Registers
 | 
					#define ARM_GIC_ICDICER  0x180        // Interrupt Clear-Enable Registers
 | 
				
			||||||
#define ARM_GIC_ICDSPR          0x200 // Interrupt Set-Pending Registers
 | 
					#define ARM_GIC_ICDSPR   0x200        // Interrupt Set-Pending Registers
 | 
				
			||||||
#define ARM_GIC_ICDICPR         0x280 // Interrupt Clear-Pending Registers
 | 
					#define ARM_GIC_ICDICPR  0x280        // Interrupt Clear-Pending Registers
 | 
				
			||||||
#define ARM_GIC_ICDABR          0x300 // Active Bit Registers
 | 
					#define ARM_GIC_ICDABR   0x300        // Active Bit Registers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Each reg base below repeats for Number of interrupts / 4
 | 
					// Each reg base below repeats for Number of interrupts / 4
 | 
				
			||||||
#define ARM_GIC_ICDIPR          0x400 // Interrupt Priority Registers
 | 
					#define ARM_GIC_ICDIPR  0x400         // Interrupt Priority Registers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Each reg base below repeats for Number of interrupts
 | 
					// Each reg base below repeats for Number of interrupts
 | 
				
			||||||
#define ARM_GIC_ICDIPTR         0x800 // Interrupt Processor Target Registers
 | 
					#define ARM_GIC_ICDIPTR  0x800        // Interrupt Processor Target Registers
 | 
				
			||||||
#define ARM_GIC_ICDICFR         0xC00 // Interrupt Configuration Registers
 | 
					#define ARM_GIC_ICDICFR  0xC00        // Interrupt Configuration Registers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_GIC_ICDPPISR        0xD00 // PPI Status register
 | 
					#define ARM_GIC_ICDPPISR  0xD00       // PPI Status register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// just one of these
 | 
					// just one of these
 | 
				
			||||||
#define ARM_GIC_ICDSGIR         0xF00 // Software Generated Interrupt Register
 | 
					#define ARM_GIC_ICDSGIR  0xF00        // Software Generated Interrupt Register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GICv3 specific registers
 | 
					// GICv3 specific registers
 | 
				
			||||||
#define ARM_GICD_IROUTER        0x6100 // Interrupt Routing Registers
 | 
					#define ARM_GICD_IROUTER  0x6100       // Interrupt Routing Registers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GICD_CTLR bits
 | 
					// GICD_CTLR bits
 | 
				
			||||||
#define ARM_GIC_ICDDCR_ARE      (1 << 4) // Affinity Routing Enable (ARE)
 | 
					#define ARM_GIC_ICDDCR_ARE  (1 << 4)     // Affinity Routing Enable (ARE)
 | 
				
			||||||
#define ARM_GIC_ICDDCR_DS       (1 << 6) // Disable Security (DS)
 | 
					#define ARM_GIC_ICDDCR_DS   (1 << 6)     // Disable Security (DS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GICD_ICDICFR bits
 | 
					// GICD_ICDICFR bits
 | 
				
			||||||
#define ARM_GIC_ICDICFR_WIDTH            32   // ICDICFR is a 32 bit register
 | 
					#define ARM_GIC_ICDICFR_WIDTH            32   // ICDICFR is a 32 bit register
 | 
				
			||||||
@@ -52,125 +52,124 @@
 | 
				
			|||||||
#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
 | 
				
			||||||
#define ARM_GICR_SGI_VLPI_FRAME_SIZE     SIZE_64KB
 | 
					#define ARM_GICR_SGI_VLPI_FRAME_SIZE      SIZE_64KB
 | 
				
			||||||
#define ARM_GICR_SGI_RESERVED_FRAME_SIZE SIZE_64KB
 | 
					#define ARM_GICR_SGI_RESERVED_FRAME_SIZE  SIZE_64KB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC Redistributor Control frame
 | 
					// GIC Redistributor Control frame
 | 
				
			||||||
#define ARM_GICR_TYPER          0x0008  // Redistributor Type Register
 | 
					#define ARM_GICR_TYPER  0x0008          // Redistributor Type Register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC Redistributor TYPER bit assignments
 | 
					// GIC Redistributor TYPER bit assignments
 | 
				
			||||||
#define ARM_GICR_TYPER_PLPIS        (1 << 0)              // Physical LPIs
 | 
					#define ARM_GICR_TYPER_PLPIS      (1 << 0)                // Physical LPIs
 | 
				
			||||||
#define ARM_GICR_TYPER_VLPIS        (1 << 1)              // Virtual LPIs
 | 
					#define ARM_GICR_TYPER_VLPIS      (1 << 1)                // Virtual LPIs
 | 
				
			||||||
#define ARM_GICR_TYPER_DIRECTLPI    (1 << 3)              // Direct LPIs
 | 
					#define ARM_GICR_TYPER_DIRECTLPI  (1 << 3)                // Direct LPIs
 | 
				
			||||||
#define ARM_GICR_TYPER_LAST         (1 << 4)              // Last Redistributor in series
 | 
					#define ARM_GICR_TYPER_LAST       (1 << 4)                // Last Redistributor in series
 | 
				
			||||||
#define ARM_GICR_TYPER_DPGS         (1 << 5)              // Disable Processor Group
 | 
					#define ARM_GICR_TYPER_DPGS       (1 << 5)                // Disable Processor Group
 | 
				
			||||||
                                                          // Selection Support
 | 
					                                                          // Selection Support
 | 
				
			||||||
#define ARM_GICR_TYPER_PROCNO       (0xFFFF << 8)         // Processor Number
 | 
					#define ARM_GICR_TYPER_PROCNO        (0xFFFF << 8)         // Processor Number
 | 
				
			||||||
#define ARM_GICR_TYPER_COMMONLPIAFF (0x3 << 24)           // Common LPI Affinity
 | 
					#define ARM_GICR_TYPER_COMMONLPIAFF  (0x3 << 24)           // Common LPI Affinity
 | 
				
			||||||
#define ARM_GICR_TYPER_AFFINITY     (0xFFFFFFFFULL << 32) // Redistributor Affinity
 | 
					#define ARM_GICR_TYPER_AFFINITY      (0xFFFFFFFFULL << 32) // Redistributor Affinity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_GICR_TYPER_GET_AFFINITY(TypeReg)  (((TypeReg) & \
 | 
					#define ARM_GICR_TYPER_GET_AFFINITY(TypeReg)  (((TypeReg) & \
 | 
				
			||||||
                                                ARM_GICR_TYPER_AFFINITY) >> 32)
 | 
					                                                ARM_GICR_TYPER_AFFINITY) >> 32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC SGI & PPI Redistributor frame
 | 
					// GIC SGI & PPI Redistributor frame
 | 
				
			||||||
#define ARM_GICR_ISENABLER      0x0100  // Interrupt Set-Enable Registers
 | 
					#define ARM_GICR_ISENABLER  0x0100      // Interrupt Set-Enable Registers
 | 
				
			||||||
#define ARM_GICR_ICENABLER      0x0180  // Interrupt Clear-Enable Registers
 | 
					#define ARM_GICR_ICENABLER  0x0180      // Interrupt Clear-Enable Registers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC Cpu interface
 | 
					// GIC Cpu interface
 | 
				
			||||||
#define ARM_GIC_ICCICR          0x00  // CPU Interface Control Register
 | 
					#define ARM_GIC_ICCICR   0x00         // CPU Interface Control Register
 | 
				
			||||||
#define ARM_GIC_ICCPMR          0x04  // Interrupt Priority Mask Register
 | 
					#define ARM_GIC_ICCPMR   0x04         // Interrupt Priority Mask Register
 | 
				
			||||||
#define ARM_GIC_ICCBPR          0x08  // Binary Point Register
 | 
					#define ARM_GIC_ICCBPR   0x08         // Binary Point Register
 | 
				
			||||||
#define ARM_GIC_ICCIAR          0x0C  // Interrupt Acknowledge Register
 | 
					#define ARM_GIC_ICCIAR   0x0C         // Interrupt Acknowledge Register
 | 
				
			||||||
#define ARM_GIC_ICCEIOR         0x10  // End Of Interrupt Register
 | 
					#define ARM_GIC_ICCEIOR  0x10         // End Of Interrupt Register
 | 
				
			||||||
#define ARM_GIC_ICCRPR          0x14  // Running Priority Register
 | 
					#define ARM_GIC_ICCRPR   0x14         // Running Priority Register
 | 
				
			||||||
#define ARM_GIC_ICCPIR          0x18  // Highest Pending Interrupt Register
 | 
					#define ARM_GIC_ICCPIR   0x18         // Highest Pending Interrupt Register
 | 
				
			||||||
#define ARM_GIC_ICCABPR         0x1C  // Aliased Binary Point Register
 | 
					#define ARM_GIC_ICCABPR  0x1C         // Aliased Binary Point Register
 | 
				
			||||||
#define ARM_GIC_ICCIIDR         0xFC  // Identification Register
 | 
					#define ARM_GIC_ICCIIDR  0xFC         // Identification Register
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_GIC_ICDSGIR_FILTER_TARGETLIST       0x0
 | 
					#define ARM_GIC_ICDSGIR_FILTER_TARGETLIST    0x0
 | 
				
			||||||
#define ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE     0x1
 | 
					#define ARM_GIC_ICDSGIR_FILTER_EVERYONEELSE  0x1
 | 
				
			||||||
#define ARM_GIC_ICDSGIR_FILTER_ITSELF           0x2
 | 
					#define ARM_GIC_ICDSGIR_FILTER_ITSELF        0x2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bit-masks to configure the CPU Interface Control register
 | 
					// Bit-masks to configure the CPU Interface Control register
 | 
				
			||||||
#define ARM_GIC_ICCICR_ENABLE_SECURE            0x01
 | 
					#define ARM_GIC_ICCICR_ENABLE_SECURE         0x01
 | 
				
			||||||
#define ARM_GIC_ICCICR_ENABLE_NS                0x02
 | 
					#define ARM_GIC_ICCICR_ENABLE_NS             0x02
 | 
				
			||||||
#define ARM_GIC_ICCICR_ACK_CTL                  0x04
 | 
					#define ARM_GIC_ICCICR_ACK_CTL               0x04
 | 
				
			||||||
#define ARM_GIC_ICCICR_SIGNAL_SECURE_TO_FIQ     0x08
 | 
					#define ARM_GIC_ICCICR_SIGNAL_SECURE_TO_FIQ  0x08
 | 
				
			||||||
#define ARM_GIC_ICCICR_USE_SBPR                 0x10
 | 
					#define ARM_GIC_ICCICR_USE_SBPR              0x10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bit Mask for GICC_IIDR
 | 
					// Bit Mask for GICC_IIDR
 | 
				
			||||||
#define ARM_GIC_ICCIIDR_GET_PRODUCT_ID(IccIidr)   (((IccIidr) >> 20) & 0xFFF)
 | 
					#define ARM_GIC_ICCIIDR_GET_PRODUCT_ID(IccIidr)    (((IccIidr) >> 20) & 0xFFF)
 | 
				
			||||||
#define ARM_GIC_ICCIIDR_GET_ARCH_VERSION(IccIidr) (((IccIidr) >> 16) & 0xF)
 | 
					#define ARM_GIC_ICCIIDR_GET_ARCH_VERSION(IccIidr)  (((IccIidr) >> 16) & 0xF)
 | 
				
			||||||
#define ARM_GIC_ICCIIDR_GET_REVISION(IccIidr)     (((IccIidr) >> 12) & 0xF)
 | 
					#define ARM_GIC_ICCIIDR_GET_REVISION(IccIidr)      (((IccIidr) >> 12) & 0xF)
 | 
				
			||||||
#define ARM_GIC_ICCIIDR_GET_IMPLEMENTER(IccIidr)  ((IccIidr) & 0xFFF)
 | 
					#define ARM_GIC_ICCIIDR_GET_IMPLEMENTER(IccIidr)   ((IccIidr) & 0xFFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bit Mask for
 | 
					// Bit Mask for
 | 
				
			||||||
#define ARM_GIC_ICCIAR_ACKINTID                 0x3FF
 | 
					#define ARM_GIC_ICCIAR_ACKINTID  0x3FF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicGetInterfaceIdentification (
 | 
					ArmGicGetInterfaceIdentification (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC Secure interfaces
 | 
					// GIC Secure interfaces
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSetupNonSecure (
 | 
					ArmGicSetupNonSecure (
 | 
				
			||||||
  IN  UINTN         MpId,
 | 
					  IN  UINTN  MpId,
 | 
				
			||||||
  IN  INTN          GicDistributorBase,
 | 
					  IN  INTN   GicDistributorBase,
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN   GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSetSecureInterrupts (
 | 
					ArmGicSetSecureInterrupts (
 | 
				
			||||||
  IN  UINTN         GicDistributorBase,
 | 
					  IN  UINTN  GicDistributorBase,
 | 
				
			||||||
  IN  UINTN*        GicSecureInterruptMask,
 | 
					  IN  UINTN  *GicSecureInterruptMask,
 | 
				
			||||||
  IN  UINTN         GicSecureInterruptMaskSize
 | 
					  IN  UINTN  GicSecureInterruptMaskSize
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEnableInterruptInterface (
 | 
					ArmGicEnableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicDisableInterruptInterface (
 | 
					ArmGicDisableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEnableDistributor (
 | 
					ArmGicEnableDistributor (
 | 
				
			||||||
  IN  INTN          GicDistributorBase
 | 
					  IN  INTN  GicDistributorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicDisableDistributor (
 | 
					ArmGicDisableDistributor (
 | 
				
			||||||
  IN  INTN          GicDistributorBase
 | 
					  IN  INTN  GicDistributorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicGetMaxNumInterrupts (
 | 
					ArmGicGetMaxNumInterrupts (
 | 
				
			||||||
  IN  INTN          GicDistributorBase
 | 
					  IN  INTN  GicDistributorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSendSgiTo (
 | 
					ArmGicSendSgiTo (
 | 
				
			||||||
  IN  INTN          GicDistributorBase,
 | 
					  IN  INTN  GicDistributorBase,
 | 
				
			||||||
  IN  INTN          TargetListFilter,
 | 
					  IN  INTN  TargetListFilter,
 | 
				
			||||||
  IN  INTN          CPUTargetList,
 | 
					  IN  INTN  CPUTargetList,
 | 
				
			||||||
  IN  INTN          SgiId
 | 
					  IN  INTN  SgiId
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -190,55 +189,55 @@ ArmGicSendSgiTo (
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicAcknowledgeInterrupt (
 | 
					ArmGicAcknowledgeInterrupt (
 | 
				
			||||||
  IN  UINTN          GicInterruptInterfaceBase,
 | 
					  IN  UINTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  OUT UINTN          *InterruptId
 | 
					  OUT UINTN  *InterruptId
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEndOfInterrupt (
 | 
					ArmGicEndOfInterrupt (
 | 
				
			||||||
  IN  UINTN                 GicInterruptInterfaceBase,
 | 
					  IN  UINTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN   Source
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSetPriorityMask (
 | 
					ArmGicSetPriorityMask (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase,
 | 
					  IN  INTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  IN  INTN          PriorityMask
 | 
					  IN  INTN  PriorityMask
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicSetInterruptPriority (
 | 
					ArmGicSetInterruptPriority (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source,
 | 
					  IN UINTN  Source,
 | 
				
			||||||
  IN UINTN                  Priority
 | 
					  IN UINTN  Priority
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicEnableInterrupt (
 | 
					ArmGicEnableInterrupt (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicDisableInterrupt (
 | 
					ArmGicDisableInterrupt (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicIsInterruptEnabled (
 | 
					ArmGicIsInterruptEnabled (
 | 
				
			||||||
  IN UINTN                  GicDistributorBase,
 | 
					  IN UINTN  GicDistributorBase,
 | 
				
			||||||
  IN UINTN                  GicRedistributorBase,
 | 
					  IN UINTN  GicRedistributorBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC revision 2 specific declarations
 | 
					// GIC revision 2 specific declarations
 | 
				
			||||||
@@ -251,41 +250,41 @@ ArmGicIsInterruptEnabled (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2SetupNonSecure (
 | 
					ArmGicV2SetupNonSecure (
 | 
				
			||||||
  IN  UINTN         MpId,
 | 
					  IN  UINTN  MpId,
 | 
				
			||||||
  IN  INTN          GicDistributorBase,
 | 
					  IN  INTN   GicDistributorBase,
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN   GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2EnableInterruptInterface (
 | 
					ArmGicV2EnableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2DisableInterruptInterface (
 | 
					ArmGicV2DisableInterruptInterface (
 | 
				
			||||||
  IN  INTN          GicInterruptInterfaceBase
 | 
					  IN  INTN  GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2AcknowledgeInterrupt (
 | 
					ArmGicV2AcknowledgeInterrupt (
 | 
				
			||||||
  IN  UINTN          GicInterruptInterfaceBase
 | 
					  IN  UINTN  GicInterruptInterfaceBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV2EndOfInterrupt (
 | 
					ArmGicV2EndOfInterrupt (
 | 
				
			||||||
  IN UINTN                  GicInterruptInterfaceBase,
 | 
					  IN UINTN  GicInterruptInterfaceBase,
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GIC revision 3 specific declarations
 | 
					// GIC revision 3 specific declarations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ICC_SRE_EL2_SRE         (1 << 0)
 | 
					#define ICC_SRE_EL2_SRE  (1 << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_GICD_IROUTER_IRM BIT31
 | 
					#define ARM_GICD_IROUTER_IRM  BIT31
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
@@ -296,7 +295,7 @@ ArmGicV3GetControlSystemRegisterEnable (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV3SetControlSystemRegisterEnable (
 | 
					ArmGicV3SetControlSystemRegisterEnable (
 | 
				
			||||||
  IN UINT32         ControlSystemRegisterEnable
 | 
					  IN UINT32  ControlSystemRegisterEnable
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -320,17 +319,17 @@ ArmGicV3AcknowledgeInterrupt (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGicV3EndOfInterrupt (
 | 
					ArmGicV3EndOfInterrupt (
 | 
				
			||||||
  IN UINTN                  Source
 | 
					  IN UINTN  Source
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmGicV3SetBinaryPointer (
 | 
					ArmGicV3SetBinaryPointer (
 | 
				
			||||||
  IN UINTN                  BinaryPoint
 | 
					  IN UINTN  BinaryPoint
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmGicV3SetPriorityMask (
 | 
					ArmGicV3SetPriorityMask (
 | 
				
			||||||
  IN UINTN                  Priority
 | 
					  IN UINTN  Priority
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARMGIC_H_
 | 
					#endif // ARMGIC_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,14 +14,14 @@
 | 
				
			|||||||
 * The native size is used for the arguments.
 | 
					 * The native size is used for the arguments.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINTN  Arg0;
 | 
					  UINTN    Arg0;
 | 
				
			||||||
  UINTN  Arg1;
 | 
					  UINTN    Arg1;
 | 
				
			||||||
  UINTN  Arg2;
 | 
					  UINTN    Arg2;
 | 
				
			||||||
  UINTN  Arg3;
 | 
					  UINTN    Arg3;
 | 
				
			||||||
  UINTN  Arg4;
 | 
					  UINTN    Arg4;
 | 
				
			||||||
  UINTN  Arg5;
 | 
					  UINTN    Arg5;
 | 
				
			||||||
  UINTN  Arg6;
 | 
					  UINTN    Arg6;
 | 
				
			||||||
  UINTN  Arg7;
 | 
					  UINTN    Arg7;
 | 
				
			||||||
} ARM_HVC_ARGS;
 | 
					} ARM_HVC_ARGS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -34,7 +34,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmCallHvc (
 | 
					ArmCallHvc (
 | 
				
			||||||
  IN OUT ARM_HVC_ARGS *Args
 | 
					  IN OUT ARM_HVC_ARGS  *Args
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_HVC_LIB_H_
 | 
					#endif // ARM_HVC_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,13 +15,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
  #include <Chipset/ArmV7.h>
 | 
					  #include <Chipset/ArmV7.h>
 | 
				
			||||||
#elif defined(MDE_CPU_AARCH64)
 | 
					#elif defined (MDE_CPU_AARCH64)
 | 
				
			||||||
  #include <Chipset/AArch64.h>
 | 
					  #include <Chipset/AArch64.h>
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 #error "Unknown chipset."
 | 
					  #error "Unknown chipset."
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EFI_MEMORY_CACHETYPE_MASK   (EFI_MEMORY_UC | EFI_MEMORY_WC | \
 | 
					#define EFI_MEMORY_CACHETYPE_MASK  (EFI_MEMORY_UC | EFI_MEMORY_WC |  \
 | 
				
			||||||
                                     EFI_MEMORY_WT | EFI_MEMORY_WB | \
 | 
					                                     EFI_MEMORY_WT | EFI_MEMORY_WB | \
 | 
				
			||||||
                                     EFI_MEMORY_UCE)
 | 
					                                     EFI_MEMORY_UCE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,17 +50,21 @@ typedef enum {
 | 
				
			|||||||
  ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE
 | 
					  ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_DEVICE
 | 
				
			||||||
} ARM_MEMORY_REGION_ATTRIBUTES;
 | 
					} ARM_MEMORY_REGION_ATTRIBUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr) ((UINT32)(attr) & 1)
 | 
					#define IS_ARM_MEMORY_REGION_ATTRIBUTES_SECURE(attr)  ((UINT32)(attr) & 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  EFI_PHYSICAL_ADDRESS          PhysicalBase;
 | 
					  EFI_PHYSICAL_ADDRESS            PhysicalBase;
 | 
				
			||||||
  EFI_VIRTUAL_ADDRESS           VirtualBase;
 | 
					  EFI_VIRTUAL_ADDRESS             VirtualBase;
 | 
				
			||||||
  UINT64                        Length;
 | 
					  UINT64                          Length;
 | 
				
			||||||
  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
 | 
				
			||||||
@@ -80,34 +84,38 @@ typedef enum {
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// ARM Cpu IDs
 | 
					// ARM Cpu IDs
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define ARM_CPU_IMPLEMENTER_MASK          (0xFFU << 24)
 | 
					#define ARM_CPU_IMPLEMENTER_MASK      (0xFFU << 24)
 | 
				
			||||||
#define ARM_CPU_IMPLEMENTER_ARMLTD        (0x41U << 24)
 | 
					#define ARM_CPU_IMPLEMENTER_ARMLTD    (0x41U << 24)
 | 
				
			||||||
#define ARM_CPU_IMPLEMENTER_DEC           (0x44U << 24)
 | 
					#define ARM_CPU_IMPLEMENTER_DEC       (0x44U << 24)
 | 
				
			||||||
#define ARM_CPU_IMPLEMENTER_MOT           (0x4DU << 24)
 | 
					#define ARM_CPU_IMPLEMENTER_MOT       (0x4DU << 24)
 | 
				
			||||||
#define ARM_CPU_IMPLEMENTER_QUALCOMM      (0x51U << 24)
 | 
					#define ARM_CPU_IMPLEMENTER_QUALCOMM  (0x51U << 24)
 | 
				
			||||||
#define ARM_CPU_IMPLEMENTER_MARVELL       (0x56U << 24)
 | 
					#define ARM_CPU_IMPLEMENTER_MARVELL   (0x56U << 24)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_CPU_PRIMARY_PART_MASK         (0xFFF << 4)
 | 
					#define ARM_CPU_PRIMARY_PART_MASK       (0xFFF << 4)
 | 
				
			||||||
#define ARM_CPU_PRIMARY_PART_CORTEXA5     (0xC05 << 4)
 | 
					#define ARM_CPU_PRIMARY_PART_CORTEXA5   (0xC05 << 4)
 | 
				
			||||||
#define ARM_CPU_PRIMARY_PART_CORTEXA7     (0xC07 << 4)
 | 
					#define ARM_CPU_PRIMARY_PART_CORTEXA7   (0xC07 << 4)
 | 
				
			||||||
#define ARM_CPU_PRIMARY_PART_CORTEXA8     (0xC08 << 4)
 | 
					#define ARM_CPU_PRIMARY_PART_CORTEXA8   (0xC08 << 4)
 | 
				
			||||||
#define ARM_CPU_PRIMARY_PART_CORTEXA9     (0xC09 << 4)
 | 
					#define ARM_CPU_PRIMARY_PART_CORTEXA9   (0xC09 << 4)
 | 
				
			||||||
#define ARM_CPU_PRIMARY_PART_CORTEXA15    (0xC0F << 4)
 | 
					#define ARM_CPU_PRIMARY_PART_CORTEXA15  (0xC0F << 4)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// ARM MP Core IDs
 | 
					// ARM MP Core IDs
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
#define ARM_CORE_AFF0         0xFF
 | 
					#define ARM_CORE_AFF0  0xFF
 | 
				
			||||||
#define ARM_CORE_AFF1         (0xFF << 8)
 | 
					#define ARM_CORE_AFF1  (0xFF << 8)
 | 
				
			||||||
#define ARM_CORE_AFF2         (0xFF << 16)
 | 
					#define ARM_CORE_AFF2  (0xFF << 16)
 | 
				
			||||||
#define ARM_CORE_AFF3         (0xFFULL << 32)
 | 
					#define ARM_CORE_AFF3  (0xFFULL << 32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_CORE_MASK         ARM_CORE_AFF0
 | 
					#define ARM_CORE_MASK     ARM_CORE_AFF0
 | 
				
			||||||
#define ARM_CLUSTER_MASK      ARM_CORE_AFF1
 | 
					#define ARM_CLUSTER_MASK  ARM_CORE_AFF1
 | 
				
			||||||
#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 PRIMARY_CORE_ID       (PcdGet32(PcdArmPrimaryCore) & ARM_CORE_MASK)
 | 
					#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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Reads the CCSIDR register for the specified cache.
 | 
					/** Reads the CCSIDR register for the specified cache.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,7 +126,7 @@ typedef enum {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
ReadCCSIDR (
 | 
					ReadCCSIDR (
 | 
				
			||||||
  IN UINT32 CSSELR
 | 
					  IN UINT32  CSSELR
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Reads the CCSIDR2 for the specified cache.
 | 
					/** Reads the CCSIDR2 for the specified cache.
 | 
				
			||||||
@@ -129,7 +137,7 @@ ReadCCSIDR (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
ReadCCSIDR2 (
 | 
					ReadCCSIDR2 (
 | 
				
			||||||
  IN UINT32 CSSELR
 | 
					  IN UINT32  CSSELR
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Reads the Cache Level ID (CLIDR) register.
 | 
					/** Reads the Cache Level ID (CLIDR) register.
 | 
				
			||||||
@@ -183,7 +191,6 @@ ArmInvalidateDataCache (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanInvalidateDataCache (
 | 
					ArmCleanInvalidateDataCache (
 | 
				
			||||||
@@ -205,31 +212,31 @@ ArmInvalidateInstructionCache (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmInvalidateDataCacheEntryByMVA (
 | 
					ArmInvalidateDataCacheEntryByMVA (
 | 
				
			||||||
  IN  UINTN   Address
 | 
					  IN  UINTN  Address
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanDataCacheEntryToPoUByMVA (
 | 
					ArmCleanDataCacheEntryToPoUByMVA (
 | 
				
			||||||
  IN  UINTN   Address
 | 
					  IN  UINTN  Address
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmInvalidateInstructionCacheEntryToPoUByMVA (
 | 
					ArmInvalidateInstructionCacheEntryToPoUByMVA (
 | 
				
			||||||
  IN  UINTN   Address
 | 
					  IN  UINTN  Address
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanDataCacheEntryByMVA (
 | 
					ArmCleanDataCacheEntryByMVA (
 | 
				
			||||||
IN  UINTN   Address
 | 
					  IN  UINTN  Address
 | 
				
			||||||
);
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanInvalidateDataCacheEntryByMVA (
 | 
					ArmCleanInvalidateDataCacheEntryByMVA (
 | 
				
			||||||
  IN  UINTN   Address
 | 
					  IN  UINTN  Address
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -352,8 +359,8 @@ ArmInvalidateTlb (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmUpdateTranslationTableEntry (
 | 
					ArmUpdateTranslationTableEntry (
 | 
				
			||||||
  IN  VOID     *TranslationTableEntry,
 | 
					  IN  VOID  *TranslationTableEntry,
 | 
				
			||||||
  IN  VOID     *Mva
 | 
					  IN  VOID  *Mva
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -371,7 +378,7 @@ ArmSetTTBR0 (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetTTBCR (
 | 
					ArmSetTTBCR (
 | 
				
			||||||
  IN  UINT32 Bits
 | 
					  IN  UINT32  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID *
 | 
					VOID *
 | 
				
			||||||
@@ -431,7 +438,7 @@ ArmInstructionSynchronizationBarrier (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteVBar (
 | 
					ArmWriteVBar (
 | 
				
			||||||
  IN  UINTN   VectorBase
 | 
					  IN  UINTN  VectorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -443,7 +450,7 @@ ArmReadVBar (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteAuxCr (
 | 
					ArmWriteAuxCr (
 | 
				
			||||||
  IN  UINT32    Bit
 | 
					  IN  UINT32  Bit
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
@@ -455,13 +462,13 @@ ArmReadAuxCr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetAuxCrBit (
 | 
					ArmSetAuxCrBit (
 | 
				
			||||||
  IN  UINT32    Bits
 | 
					  IN  UINT32  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmUnsetAuxCrBit (
 | 
					ArmUnsetAuxCrBit (
 | 
				
			||||||
  IN  UINT32    Bits
 | 
					  IN  UINT32  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -504,7 +511,7 @@ ArmReadCpacr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCpacr (
 | 
					ArmWriteCpacr (
 | 
				
			||||||
  IN  UINT32   Access
 | 
					  IN  UINT32  Access
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -534,7 +541,7 @@ ArmReadScr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteScr (
 | 
					ArmWriteScr (
 | 
				
			||||||
  IN  UINT32   Value
 | 
					  IN  UINT32  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
@@ -546,7 +553,7 @@ ArmReadMVBar (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteMVBar (
 | 
					ArmWriteMVBar (
 | 
				
			||||||
  IN  UINT32   VectorMonitorBase
 | 
					  IN  UINT32  VectorMonitorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
@@ -558,7 +565,7 @@ ArmReadSctlr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteSctlr (
 | 
					ArmWriteSctlr (
 | 
				
			||||||
  IN  UINT32   Value
 | 
					  IN  UINT32  Value
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -570,10 +577,9 @@ ArmReadHVBar (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteHVBar (
 | 
					ArmWriteHVBar (
 | 
				
			||||||
  IN  UINTN   HypModeVectorBase
 | 
					  IN  UINTN  HypModeVectorBase
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Helper functions for accessing CPU ACTLR
 | 
					// Helper functions for accessing CPU ACTLR
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@@ -587,28 +593,28 @@ ArmReadCpuActlr (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCpuActlr (
 | 
					ArmWriteCpuActlr (
 | 
				
			||||||
  IN  UINTN Val
 | 
					  IN  UINTN  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetCpuActlrBit (
 | 
					ArmSetCpuActlrBit (
 | 
				
			||||||
  IN  UINTN    Bits
 | 
					  IN  UINTN  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmUnsetCpuActlrBit (
 | 
					ArmUnsetCpuActlrBit (
 | 
				
			||||||
  IN  UINTN    Bits
 | 
					  IN  UINTN  Bits
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Accessors for the architected generic timer registers
 | 
					// Accessors for the architected generic timer registers
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_ARCH_TIMER_ENABLE           (1 << 0)
 | 
					#define ARM_ARCH_TIMER_ENABLE   (1 << 0)
 | 
				
			||||||
#define ARM_ARCH_TIMER_IMASK            (1 << 1)
 | 
					#define ARM_ARCH_TIMER_IMASK    (1 << 1)
 | 
				
			||||||
#define ARM_ARCH_TIMER_ISTATUS          (1 << 2)
 | 
					#define ARM_ARCH_TIMER_ISTATUS  (1 << 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
@@ -619,7 +625,7 @@ ArmReadCntFrq (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntFrq (
 | 
					ArmWriteCntFrq (
 | 
				
			||||||
  UINTN   FreqInHz
 | 
					  UINTN  FreqInHz
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
@@ -637,7 +643,7 @@ ArmReadCntkCtl (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntkCtl (
 | 
					ArmWriteCntkCtl (
 | 
				
			||||||
  UINTN   Val
 | 
					  UINTN  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -649,7 +655,7 @@ ArmReadCntpTval (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntpTval (
 | 
					ArmWriteCntpTval (
 | 
				
			||||||
  UINTN   Val
 | 
					  UINTN  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -661,7 +667,7 @@ ArmReadCntpCtl (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntpCtl (
 | 
					ArmWriteCntpCtl (
 | 
				
			||||||
  UINTN   Val
 | 
					  UINTN  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -673,7 +679,7 @@ ArmReadCntvTval (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntvTval (
 | 
					ArmWriteCntvTval (
 | 
				
			||||||
  UINTN   Val
 | 
					  UINTN  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -685,7 +691,7 @@ ArmReadCntvCtl (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntvCtl (
 | 
					ArmWriteCntvCtl (
 | 
				
			||||||
  UINTN   Val
 | 
					  UINTN  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
@@ -703,7 +709,7 @@ ArmReadCntpCval (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntpCval (
 | 
					ArmWriteCntpCval (
 | 
				
			||||||
  UINT64   Val
 | 
					  UINT64  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
@@ -715,7 +721,7 @@ ArmReadCntvCval (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntvCval (
 | 
					ArmWriteCntvCval (
 | 
				
			||||||
  UINT64   Val
 | 
					  UINT64  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
@@ -727,7 +733,7 @@ ArmReadCntvOff (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmWriteCntvOff (
 | 
					ArmWriteCntvOff (
 | 
				
			||||||
  UINT64   Val
 | 
					  UINT64  Val
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -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_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,29 +24,29 @@ ArmConfigureMmu (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetMemoryRegionNoExec (
 | 
					ArmSetMemoryRegionNoExec (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmClearMemoryRegionNoExec (
 | 
					ArmClearMemoryRegionNoExec (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmSetMemoryRegionReadOnly (
 | 
					ArmSetMemoryRegionReadOnly (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmClearMemoryRegionReadOnly (
 | 
					ArmClearMemoryRegionReadOnly (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
@@ -59,9 +59,9 @@ ArmReplaceLiveTranslationEntry (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ArmSetMemoryAttributes (
 | 
					ArmSetMemoryAttributes (
 | 
				
			||||||
  IN EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN UINT64                    Length,
 | 
					  IN UINT64                Length,
 | 
				
			||||||
  IN UINT64                    Attributes
 | 
					  IN UINT64                Attributes
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_MMU_LIB_H_
 | 
					#endif // ARM_MMU_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,37 +18,37 @@
 | 
				
			|||||||
#pragma pack(1)
 | 
					#pragma pack(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 Reserved1;
 | 
					  UINT32    Reserved1;
 | 
				
			||||||
  UINT32 ChannelStatus;
 | 
					  UINT32    ChannelStatus;
 | 
				
			||||||
  UINT64 Reserved2;
 | 
					  UINT64    Reserved2;
 | 
				
			||||||
  UINT32 Flags;
 | 
					  UINT32    Flags;
 | 
				
			||||||
  UINT32 Length;
 | 
					  UINT32    Length;
 | 
				
			||||||
  UINT32 MessageHeader;
 | 
					  UINT32    MessageHeader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
					  // NOTE: Since EDK2 does not allow flexible array member [] we declare
 | 
				
			||||||
  // here array of 1 element length. However below is used as a variable
 | 
					  // here array of 1 element length. However below is used as a variable
 | 
				
			||||||
  // length array.
 | 
					  // length array.
 | 
				
			||||||
  UINT32 Payload[1];    // size less object gives offset to payload.
 | 
					  UINT32    Payload[1]; // size less object gives offset to payload.
 | 
				
			||||||
} MTL_MAILBOX;
 | 
					} MTL_MAILBOX;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack()
 | 
					#pragma pack()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Channel Type, Low-priority, and High-priority
 | 
					// Channel Type, Low-priority, and High-priority
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  MTL_CHANNEL_TYPE_LOW = 0,
 | 
					  MTL_CHANNEL_TYPE_LOW  = 0,
 | 
				
			||||||
  MTL_CHANNEL_TYPE_HIGH = 1
 | 
					  MTL_CHANNEL_TYPE_HIGH = 1
 | 
				
			||||||
} MTL_CHANNEL_TYPE;
 | 
					} MTL_CHANNEL_TYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT64 PhysicalAddress;
 | 
					  UINT64    PhysicalAddress;
 | 
				
			||||||
  UINT32 ModifyMask;
 | 
					  UINT32    ModifyMask;
 | 
				
			||||||
  UINT32 PreserveMask;
 | 
					  UINT32    PreserveMask;
 | 
				
			||||||
} MTL_DOORBELL;
 | 
					} MTL_DOORBELL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  MTL_CHANNEL_TYPE ChannelType;
 | 
					  MTL_CHANNEL_TYPE           ChannelType;
 | 
				
			||||||
  MTL_MAILBOX      * CONST MailBox;
 | 
					  MTL_MAILBOX      *CONST    MailBox;
 | 
				
			||||||
  MTL_DOORBELL     DoorBell;
 | 
					  MTL_DOORBELL               DoorBell;
 | 
				
			||||||
} MTL_CHANNEL;
 | 
					} MTL_CHANNEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Wait until channel is free.
 | 
					/** Wait until channel is free.
 | 
				
			||||||
@@ -71,7 +71,7 @@ MtlWaitUntilChannelFree (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  @retval UINT32*      Pointer to the payload.
 | 
					  @retval UINT32*      Pointer to the payload.
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
UINT32*
 | 
					UINT32 *
 | 
				
			||||||
MtlGetChannelPayload (
 | 
					MtlGetChannelPayload (
 | 
				
			||||||
  IN MTL_CHANNEL  *Channel
 | 
					  IN MTL_CHANNEL  *Channel
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -127,5 +127,4 @@ MtlReceiveMessage (
 | 
				
			|||||||
  OUT UINT32       *PayloadLength
 | 
					  OUT UINT32       *PayloadLength
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#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
 | 
				
			||||||
@@ -14,14 +15,14 @@
 | 
				
			|||||||
 * The native size is used for the arguments.
 | 
					 * The native size is used for the arguments.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINTN  Arg0;
 | 
					  UINTN    Arg0;
 | 
				
			||||||
  UINTN  Arg1;
 | 
					  UINTN    Arg1;
 | 
				
			||||||
  UINTN  Arg2;
 | 
					  UINTN    Arg2;
 | 
				
			||||||
  UINTN  Arg3;
 | 
					  UINTN    Arg3;
 | 
				
			||||||
  UINTN  Arg4;
 | 
					  UINTN    Arg4;
 | 
				
			||||||
  UINTN  Arg5;
 | 
					  UINTN    Arg5;
 | 
				
			||||||
  UINTN  Arg6;
 | 
					  UINTN    Arg6;
 | 
				
			||||||
  UINTN  Arg7;
 | 
					  UINTN    Arg7;
 | 
				
			||||||
} ARM_SMC_ARGS;
 | 
					} ARM_SMC_ARGS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -34,7 +35,79 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmCallSmc (
 | 
					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_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,14 +14,14 @@
 | 
				
			|||||||
 * The native size is used for the arguments.
 | 
					 * The native size is used for the arguments.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINTN  Arg0;
 | 
					  UINTN    Arg0;
 | 
				
			||||||
  UINTN  Arg1;
 | 
					  UINTN    Arg1;
 | 
				
			||||||
  UINTN  Arg2;
 | 
					  UINTN    Arg2;
 | 
				
			||||||
  UINTN  Arg3;
 | 
					  UINTN    Arg3;
 | 
				
			||||||
  UINTN  Arg4;
 | 
					  UINTN    Arg4;
 | 
				
			||||||
  UINTN  Arg5;
 | 
					  UINTN    Arg5;
 | 
				
			||||||
  UINTN  Arg6;
 | 
					  UINTN    Arg6;
 | 
				
			||||||
  UINTN  Arg7;
 | 
					  UINTN    Arg7;
 | 
				
			||||||
} ARM_SVC_ARGS;
 | 
					} ARM_SVC_ARGS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -40,7 +40,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ArmCallSvc (
 | 
					ArmCallSvc (
 | 
				
			||||||
  IN OUT ARM_SVC_ARGS *Args
 | 
					  IN OUT ARM_SVC_ARGS  *Args
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_SVC_LIB_H_
 | 
					#endif // ARM_SVC_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,8 +18,8 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
DefaultExceptionHandler (
 | 
					DefaultExceptionHandler (
 | 
				
			||||||
  IN     EFI_EXCEPTION_TYPE           ExceptionType,
 | 
					  IN     EFI_EXCEPTION_TYPE  ExceptionType,
 | 
				
			||||||
  IN OUT EFI_SYSTEM_CONTEXT           SystemContext
 | 
					  IN OUT EFI_SYSTEM_CONTEXT  SystemContext
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // DEFAULT_EXCEPTION_HANDLER_LIB_H_
 | 
					#endif // DEFAULT_EXCEPTION_HANDLER_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,15 +8,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,37 +25,40 @@ 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
 | 
					  UINT16    ExternalClock; ///< External clock speed in MHz
 | 
				
			||||||
  UINT16 ExternalClock; ///< External clock speed in MHz
 | 
					  UINT16    CoreCount;     ///< Number of cores available
 | 
				
			||||||
  UINT16 CoreCount;     ///< Number of cores available
 | 
					  UINT16    CoresEnabled;  ///< Number of cores enabled
 | 
				
			||||||
  UINT16 CoresEnabled;  ///< Number of cores enabled
 | 
					  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 {
 | 
				
			||||||
{
 | 
					  ProductNameType01,
 | 
				
			||||||
    ProductNameType01,
 | 
					  SerialNumType01,
 | 
				
			||||||
    SerialNumType01,
 | 
					  UuidType01,
 | 
				
			||||||
    UuidType01,
 | 
					  SystemManufacturerType01,
 | 
				
			||||||
    SystemManufacturerType01,
 | 
					  VersionType01,
 | 
				
			||||||
    SkuNumberType01,
 | 
					  SkuNumberType01,
 | 
				
			||||||
    FamilyType01,
 | 
					  FamilyType01,
 | 
				
			||||||
    AssertTagType02,
 | 
					  AssertTagType02,
 | 
				
			||||||
    SerialNumberType02,
 | 
					  SerialNumberType02,
 | 
				
			||||||
    BoardManufacturerType02,
 | 
					  BoardManufacturerType02,
 | 
				
			||||||
    SkuNumberType02,
 | 
					  ProductNameType02,
 | 
				
			||||||
    ChassisLocationType02,
 | 
					  VersionType02,
 | 
				
			||||||
    AssetTagType03,
 | 
					  SkuNumberType02,
 | 
				
			||||||
    SerialNumberType03,
 | 
					  ChassisLocationType02,
 | 
				
			||||||
    VersionType03,
 | 
					  AssetTagType03,
 | 
				
			||||||
    ChassisTypeType03,
 | 
					  SerialNumberType03,
 | 
				
			||||||
    ManufacturerType03,
 | 
					  VersionType03,
 | 
				
			||||||
    SkuNumberType03,
 | 
					  ChassisTypeType03,
 | 
				
			||||||
    SmbiosHiiStringFieldMax
 | 
					  ManufacturerType03,
 | 
				
			||||||
 | 
					  SkuNumberType03,
 | 
				
			||||||
 | 
					  ProcessorPartNumType04,
 | 
				
			||||||
 | 
					  ProcessorSerialNumType04,
 | 
				
			||||||
 | 
					  SmbiosHiiStringFieldMax
 | 
				
			||||||
} OEM_MISC_SMBIOS_HII_STRING_FIELD;
 | 
					} OEM_MISC_SMBIOS_HII_STRING_FIELD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -74,7 +75,7 @@ typedef enum
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OemGetCpuFreq (
 | 
					OemGetCpuFreq (
 | 
				
			||||||
  IN UINT8 ProcessorIndex
 | 
					  IN UINT8  ProcessorIndex
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Gets information about the specified processor and stores it in
 | 
					/** Gets information about the specified processor and stores it in
 | 
				
			||||||
@@ -90,10 +91,10 @@ OemGetCpuFreq (
 | 
				
			|||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OemGetProcessorInformation (
 | 
					OemGetProcessorInformation (
 | 
				
			||||||
  IN UINTN ProcessorIndex,
 | 
					  IN UINTN                               ProcessorIndex,
 | 
				
			||||||
  IN OUT PROCESSOR_STATUS_DATA *ProcessorStatus,
 | 
					  IN OUT PROCESSOR_STATUS_DATA           *ProcessorStatus,
 | 
				
			||||||
  IN OUT PROCESSOR_CHARACTERISTIC_FLAGS *ProcessorCharacteristics,
 | 
					  IN OUT PROCESSOR_CHARACTERISTIC_FLAGS  *ProcessorCharacteristics,
 | 
				
			||||||
  IN OUT OEM_MISC_PROCESSOR_DATA *MiscProcessorData
 | 
					  IN OUT OEM_MISC_PROCESSOR_DATA         *MiscProcessorData
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Gets information about the cache at the specified cache level.
 | 
					/** Gets information about the cache at the specified cache level.
 | 
				
			||||||
@@ -109,11 +110,11 @@ OemGetProcessorInformation (
 | 
				
			|||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OemGetCacheInformation (
 | 
					OemGetCacheInformation (
 | 
				
			||||||
  IN UINT8   ProcessorIndex,
 | 
					  IN UINT8                   ProcessorIndex,
 | 
				
			||||||
  IN UINT8   CacheLevel,
 | 
					  IN UINT8                   CacheLevel,
 | 
				
			||||||
  IN BOOLEAN DataCache,
 | 
					  IN BOOLEAN                 DataCache,
 | 
				
			||||||
  IN BOOLEAN UnifiedCache,
 | 
					  IN BOOLEAN                 UnifiedCache,
 | 
				
			||||||
  IN OUT SMBIOS_TABLE_TYPE7 *SmbiosCacheTable
 | 
					  IN OUT SMBIOS_TABLE_TYPE7  *SmbiosCacheTable
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Gets the maximum number of processors supported by the platform.
 | 
					/** Gets the maximum number of processors supported by the platform.
 | 
				
			||||||
@@ -145,7 +146,7 @@ OemGetChassisType (
 | 
				
			|||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OemIsProcessorPresent (
 | 
					OemIsProcessorPresent (
 | 
				
			||||||
  IN UINTN ProcessorIndex
 | 
					  IN UINTN  ProcessorIndex
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Updates the HII string for the specified field.
 | 
					/** Updates the HII string for the specified field.
 | 
				
			||||||
@@ -157,9 +158,9 @@ OemIsProcessorPresent (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OemUpdateSmbiosInfo (
 | 
					OemUpdateSmbiosInfo (
 | 
				
			||||||
  IN EFI_HII_HANDLE    HiiHandle,
 | 
					  IN EFI_HII_HANDLE                    HiiHandle,
 | 
				
			||||||
  IN EFI_STRING_ID     TokenToUpdate,
 | 
					  IN EFI_STRING_ID                     TokenToUpdate,
 | 
				
			||||||
  IN OEM_MISC_SMBIOS_HII_STRING_FIELD Field
 | 
					  IN OEM_MISC_SMBIOS_HII_STRING_FIELD  Field
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Fetches the Type 32 boot information status.
 | 
					/** Fetches the Type 32 boot information status.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,24 +15,24 @@
 | 
				
			|||||||
 * The 'Trusted OS Call UID' is supposed to return the following UUID for
 | 
					 * The 'Trusted OS Call UID' is supposed to return the following UUID for
 | 
				
			||||||
 * OP-TEE OS. This is a 128-bit value.
 | 
					 * OP-TEE OS. This is a 128-bit value.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define OPTEE_OS_UID0          0x384fb3e0
 | 
					#define OPTEE_OS_UID0  0x384fb3e0
 | 
				
			||||||
#define OPTEE_OS_UID1          0xe7f811e3
 | 
					#define OPTEE_OS_UID1  0xe7f811e3
 | 
				
			||||||
#define OPTEE_OS_UID2          0xaf630002
 | 
					#define OPTEE_OS_UID2  0xaf630002
 | 
				
			||||||
#define OPTEE_OS_UID3          0xa5d5c51b
 | 
					#define OPTEE_OS_UID3  0xa5d5c51b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE                0x0
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE           0x0
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT         0x1
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT    0x1
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT        0x2
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT   0x2
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT         0x3
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT    0x3
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT        0x9
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT   0x9
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT       0xa
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT  0xa
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT        0xb
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT   0xb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK                0xff
 | 
					#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK  0xff
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPTEE_SUCCESS                           0x00000000
 | 
					#define OPTEE_SUCCESS               0x00000000
 | 
				
			||||||
#define OPTEE_ORIGIN_COMMUNICATION              0x00000002
 | 
					#define OPTEE_ORIGIN_COMMUNICATION  0x00000002
 | 
				
			||||||
#define OPTEE_ERROR_COMMUNICATION               0xFFFF000E
 | 
					#define OPTEE_ERROR_COMMUNICATION   0xFFFF000E
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT64    BufferAddress;
 | 
					  UINT64    BufferAddress;
 | 
				
			||||||
@@ -47,44 +47,44 @@ typedef struct {
 | 
				
			|||||||
} OPTEE_MESSAGE_PARAM_VALUE;
 | 
					} OPTEE_MESSAGE_PARAM_VALUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  OPTEE_MESSAGE_PARAM_MEMORY   Memory;
 | 
					  OPTEE_MESSAGE_PARAM_MEMORY    Memory;
 | 
				
			||||||
  OPTEE_MESSAGE_PARAM_VALUE    Value;
 | 
					  OPTEE_MESSAGE_PARAM_VALUE     Value;
 | 
				
			||||||
} OPTEE_MESSAGE_PARAM_UNION;
 | 
					} OPTEE_MESSAGE_PARAM_UNION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT64 Attribute;
 | 
					  UINT64                       Attribute;
 | 
				
			||||||
  OPTEE_MESSAGE_PARAM_UNION Union;
 | 
					  OPTEE_MESSAGE_PARAM_UNION    Union;
 | 
				
			||||||
} OPTEE_MESSAGE_PARAM;
 | 
					} OPTEE_MESSAGE_PARAM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPTEE_MAX_CALL_PARAMS       4
 | 
					#define OPTEE_MAX_CALL_PARAMS  4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32    Command;
 | 
					  UINT32                 Command;
 | 
				
			||||||
  UINT32    Function;
 | 
					  UINT32                 Function;
 | 
				
			||||||
  UINT32    Session;
 | 
					  UINT32                 Session;
 | 
				
			||||||
  UINT32    CancelId;
 | 
					  UINT32                 CancelId;
 | 
				
			||||||
  UINT32    Pad;
 | 
					  UINT32                 Pad;
 | 
				
			||||||
  UINT32    Return;
 | 
					  UINT32                 Return;
 | 
				
			||||||
  UINT32    ReturnOrigin;
 | 
					  UINT32                 ReturnOrigin;
 | 
				
			||||||
  UINT32    NumParams;
 | 
					  UINT32                 NumParams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // NumParams tells the actual number of element in Params
 | 
					  // NumParams tells the actual number of element in Params
 | 
				
			||||||
  OPTEE_MESSAGE_PARAM  Params[OPTEE_MAX_CALL_PARAMS];
 | 
					  OPTEE_MESSAGE_PARAM    Params[OPTEE_MAX_CALL_PARAMS];
 | 
				
			||||||
} OPTEE_MESSAGE_ARG;
 | 
					} OPTEE_MESSAGE_ARG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  EFI_GUID  Uuid;           // [in] GUID/UUID of the Trusted Application
 | 
					  EFI_GUID    Uuid;         // [in] GUID/UUID of the Trusted Application
 | 
				
			||||||
  UINT32    Session;        // [out] Session id
 | 
					  UINT32      Session;      // [out] Session id
 | 
				
			||||||
  UINT32    Return;         // [out] Return value
 | 
					  UINT32      Return;       // [out] Return value
 | 
				
			||||||
  UINT32    ReturnOrigin;   // [out] Origin of the return value
 | 
					  UINT32      ReturnOrigin; // [out] Origin of the return value
 | 
				
			||||||
} OPTEE_OPEN_SESSION_ARG;
 | 
					} OPTEE_OPEN_SESSION_ARG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32    Function;       // [in] Trusted Application function, specific to the TA
 | 
					  UINT32                 Function;                      // [in] Trusted Application function, specific to the TA
 | 
				
			||||||
  UINT32    Session;        // [in] Session id
 | 
					  UINT32                 Session;                       // [in] Session id
 | 
				
			||||||
  UINT32    Return;         // [out] Return value
 | 
					  UINT32                 Return;                        // [out] Return value
 | 
				
			||||||
  UINT32    ReturnOrigin;   // [out] Origin of the return value
 | 
					  UINT32                 ReturnOrigin;                  // [out] Origin of the return value
 | 
				
			||||||
  OPTEE_MESSAGE_PARAM  Params[OPTEE_MAX_CALL_PARAMS]; // Params for function to be invoked
 | 
					  OPTEE_MESSAGE_PARAM    Params[OPTEE_MAX_CALL_PARAMS]; // Params for function to be invoked
 | 
				
			||||||
} OPTEE_INVOKE_FUNCTION_ARG;
 | 
					} OPTEE_INVOKE_FUNCTION_ARG;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
@@ -102,19 +102,19 @@ OpteeInit (
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OpteeOpenSession (
 | 
					OpteeOpenSession (
 | 
				
			||||||
  IN OUT OPTEE_OPEN_SESSION_ARG      *OpenSessionArg
 | 
					  IN OUT OPTEE_OPEN_SESSION_ARG  *OpenSessionArg
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OpteeCloseSession (
 | 
					OpteeCloseSession (
 | 
				
			||||||
  IN UINT32                      Session
 | 
					  IN UINT32  Session
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
OpteeInvokeFunction (
 | 
					OpteeInvokeFunction (
 | 
				
			||||||
  IN OUT OPTEE_INVOKE_FUNCTION_ARG       *InvokeFunctionArg
 | 
					  IN OUT OPTEE_INVOKE_FUNCTION_ARG  *InvokeFunctionArg
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // OPTEE_LIB_H_
 | 
					#endif // OPTEE_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,12 +17,12 @@
 | 
				
			|||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SEMIHOST_FILE_MODE_READ     (0 << 2)
 | 
					#define SEMIHOST_FILE_MODE_READ    (0 << 2)
 | 
				
			||||||
#define SEMIHOST_FILE_MODE_WRITE    (1 << 2)
 | 
					#define SEMIHOST_FILE_MODE_WRITE   (1 << 2)
 | 
				
			||||||
#define SEMIHOST_FILE_MODE_APPEND   (2 << 2)
 | 
					#define SEMIHOST_FILE_MODE_APPEND  (2 << 2)
 | 
				
			||||||
#define SEMIHOST_FILE_MODE_UPDATE   (1 << 1)
 | 
					#define SEMIHOST_FILE_MODE_UPDATE  (1 << 1)
 | 
				
			||||||
#define SEMIHOST_FILE_MODE_BINARY   (1 << 0)
 | 
					#define SEMIHOST_FILE_MODE_BINARY  (1 << 0)
 | 
				
			||||||
#define SEMIHOST_FILE_MODE_ASCII    (0 << 0)
 | 
					#define SEMIHOST_FILE_MODE_ASCII   (0 << 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BOOLEAN
 | 
					BOOLEAN
 | 
				
			||||||
SemihostConnectionSupported (
 | 
					SemihostConnectionSupported (
 | 
				
			||||||
@@ -31,9 +31,9 @@ SemihostConnectionSupported (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
SemihostFileOpen (
 | 
					SemihostFileOpen (
 | 
				
			||||||
  IN  CHAR8  *FileName,
 | 
					  IN  CHAR8   *FileName,
 | 
				
			||||||
  IN  UINT32 Mode,
 | 
					  IN  UINT32  Mode,
 | 
				
			||||||
  OUT UINTN  *FileHandle
 | 
					  OUT UINTN   *FileHandle
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
@@ -81,7 +81,7 @@ SemihostFileLength (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
SemihostFileTmpName(
 | 
					SemihostFileTmpName (
 | 
				
			||||||
  OUT  VOID   *Buffer,
 | 
					  OUT  VOID   *Buffer,
 | 
				
			||||||
  IN   UINT8  Identifier,
 | 
					  IN   UINT8  Identifier,
 | 
				
			||||||
  IN   UINTN  Length
 | 
					  IN   UINTN  Length
 | 
				
			||||||
@@ -89,7 +89,7 @@ SemihostFileTmpName(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
SemihostFileRemove (
 | 
					SemihostFileRemove (
 | 
				
			||||||
  IN CHAR8 *FileName
 | 
					  IN CHAR8  *FileName
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -104,7 +104,7 @@ SemihostFileRemove (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
SemihostFileRename(
 | 
					SemihostFileRename (
 | 
				
			||||||
  IN  CHAR8  *FileName,
 | 
					  IN  CHAR8  *FileName,
 | 
				
			||||||
  IN  CHAR8  *NewFileName
 | 
					  IN  CHAR8  *NewFileName
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -116,17 +116,17 @@ SemihostReadCharacter (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
SemihostWriteCharacter (
 | 
					SemihostWriteCharacter (
 | 
				
			||||||
  IN CHAR8 Character
 | 
					  IN CHAR8  Character
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
SemihostWriteString (
 | 
					SemihostWriteString (
 | 
				
			||||||
  IN CHAR8 *String
 | 
					  IN CHAR8  *String
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
SemihostSystem (
 | 
					SemihostSystem (
 | 
				
			||||||
  IN CHAR8 *CommandLine
 | 
					  IN CHAR8  *CommandLine
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // SEMIHOSTING_LIB_H_
 | 
					#endif // SEMIHOSTING_LIB_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,26 +11,26 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ArmSetMemoryRegionNoExec (
 | 
					ArmSetMemoryRegionNoExec (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ArmClearMemoryRegionNoExec (
 | 
					ArmClearMemoryRegionNoExec (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ArmSetMemoryRegionReadOnly (
 | 
					ArmSetMemoryRegionReadOnly (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
ArmClearMemoryRegionReadOnly (
 | 
					ArmClearMemoryRegionReadOnly (
 | 
				
			||||||
  IN  EFI_PHYSICAL_ADDRESS      BaseAddress,
 | 
					  IN  EFI_PHYSICAL_ADDRESS  BaseAddress,
 | 
				
			||||||
  IN  UINT64                    Length
 | 
					  IN  UINT64                Length
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* STANDALONE_MM_MMU_LIB_ */
 | 
					#endif /* STANDALONE_MM_MMU_LIB_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,10 +32,10 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI * ARM_MP_CORE_INFO_GET) (
 | 
					(EFIAPI *ARM_MP_CORE_INFO_GET)(
 | 
				
			||||||
  OUT UINTN                   *ArmCoreCount,
 | 
					  OUT UINTN                   *ArmCoreCount,
 | 
				
			||||||
  OUT ARM_CORE_INFO           **ArmCoreTable
 | 
					  OUT ARM_CORE_INFO           **ArmCoreTable
 | 
				
			||||||
);
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
/// This service abstracts the ability to migrate contents of the platform early memory store.
 | 
					/// This service abstracts the ability to migrate contents of the platform early memory store.
 | 
				
			||||||
@@ -43,10 +43,10 @@ EFI_STATUS
 | 
				
			|||||||
///       This PPI was optional.
 | 
					///       This PPI was optional.
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  ARM_MP_CORE_INFO_GET   GetMpCoreInfo;
 | 
					  ARM_MP_CORE_INFO_GET    GetMpCoreInfo;
 | 
				
			||||||
} ARM_MP_CORE_INFO_PPI;
 | 
					} ARM_MP_CORE_INFO_PPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_GUID gArmMpCoreInfoPpiGuid;
 | 
					extern EFI_GUID  gArmMpCoreInfoPpiGuid;
 | 
				
			||||||
extern EFI_GUID gArmMpCoreInfoGuid;
 | 
					extern EFI_GUID  gArmMpCoreInfoGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // ARM_MP_CORE_INFO_PPI_H_
 | 
					#endif // ARM_MP_CORE_INFO_PPI_H_
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,6 @@
 | 
				
			|||||||
/* As per SCMI specification, maximum allowed ASCII string length
 | 
					/* As per SCMI specification, maximum allowed ASCII string length
 | 
				
			||||||
   for various return values/parameters of a SCMI message.
 | 
					   for various return values/parameters of a SCMI message.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define SCMI_MAX_STR_LEN          16
 | 
					#define SCMI_MAX_STR_LEN  16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_H_ */
 | 
					#endif /* ARM_SCMI_H_ */
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,24 +17,24 @@
 | 
				
			|||||||
#define BASE_PROTOCOL_VERSION_V1  0x10000
 | 
					#define BASE_PROTOCOL_VERSION_V1  0x10000
 | 
				
			||||||
#define BASE_PROTOCOL_VERSION_V2  0x20000
 | 
					#define BASE_PROTOCOL_VERSION_V2  0x20000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NUM_PROTOCOL_MASK      0xFFU
 | 
					#define NUM_PROTOCOL_MASK  0xFFU
 | 
				
			||||||
#define NUM_AGENT_MASK         0xFFU
 | 
					#define NUM_AGENT_MASK     0xFFU
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NUM_AGENT_SHIFT        0x8
 | 
					#define NUM_AGENT_SHIFT  0x8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Returns total number of protocols that are
 | 
					/** Returns total number of protocols that are
 | 
				
			||||||
  implemented (excluding the Base protocol)
 | 
					  implemented (excluding the Base protocol)
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define SCMI_TOTAL_PROTOCOLS(Attr) (Attr & NUM_PROTOCOL_MASK)
 | 
					#define SCMI_TOTAL_PROTOCOLS(Attr)  (Attr & NUM_PROTOCOL_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns total number of agents in the system.
 | 
					// Returns total number of agents in the system.
 | 
				
			||||||
#define SCMI_TOTAL_AGENTS(Attr)    ((Attr >> NUM_AGENT_SHIFT) & NUM_AGENT_MASK)
 | 
					#define SCMI_TOTAL_AGENTS(Attr)  ((Attr >> NUM_AGENT_SHIFT) & NUM_AGENT_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SCMI_BASE_PROTOCOL_GUID  { \
 | 
					#define ARM_SCMI_BASE_PROTOCOL_GUID  { \
 | 
				
			||||||
  0xd7e5abe9, 0x33ab, 0x418e, {0x9f, 0x91, 0x72, 0xda, 0xe2, 0xba, 0x8e, 0x2f} \
 | 
					  0xd7e5abe9, 0x33ab, 0x418e, {0x9f, 0x91, 0x72, 0xda, 0xe2, 0xba, 0x8e, 0x2f} \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_GUID gArmScmiBaseProtocolGuid;
 | 
					extern EFI_GUID  gArmScmiBaseProtocolGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _SCMI_BASE_PROTOCOL SCMI_BASE_PROTOCOL;
 | 
					typedef struct _SCMI_BASE_PROTOCOL SCMI_BASE_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,7 +50,7 @@ typedef struct _SCMI_BASE_PROTOCOL SCMI_BASE_PROTOCOL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_GET_VERSION) (
 | 
					(EFIAPI *SCMI_BASE_GET_VERSION)(
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32              *Version
 | 
					  OUT UINT32              *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -67,7 +67,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_GET_TOTAL_PROTOCOLS) (
 | 
					(EFIAPI *SCMI_BASE_GET_TOTAL_PROTOCOLS)(
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32              *TotalProtocols
 | 
					  OUT UINT32              *TotalProtocols
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -85,7 +85,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_VENDOR) (
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_VENDOR)(
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
					  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -103,7 +103,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_SUB_VENDOR) (
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_SUB_VENDOR)(
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
					  OUT UINT8               VendorIdentifier[SCMI_MAX_STR_LEN]
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -120,7 +120,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION) (
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION)(
 | 
				
			||||||
  IN  SCMI_BASE_PROTOCOL  *This,
 | 
					  IN  SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32              *ImplementationVersion
 | 
					  OUT UINT32              *ImplementationVersion
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -141,7 +141,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_BASE_DISCOVER_LIST_PROTOCOLS) (
 | 
					(EFIAPI *SCMI_BASE_DISCOVER_LIST_PROTOCOLS)(
 | 
				
			||||||
  IN     SCMI_BASE_PROTOCOL  *This,
 | 
					  IN     SCMI_BASE_PROTOCOL  *This,
 | 
				
			||||||
  IN OUT UINT32              *ProtocolListSize,
 | 
					  IN OUT UINT32              *ProtocolListSize,
 | 
				
			||||||
  OUT    UINT8               *ProtocolList
 | 
					  OUT    UINT8               *ProtocolList
 | 
				
			||||||
@@ -149,20 +149,20 @@ EFI_STATUS
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Base protocol.
 | 
					// Base protocol.
 | 
				
			||||||
typedef struct _SCMI_BASE_PROTOCOL {
 | 
					typedef struct _SCMI_BASE_PROTOCOL {
 | 
				
			||||||
  SCMI_BASE_GET_VERSION                      GetVersion;
 | 
					  SCMI_BASE_GET_VERSION                        GetVersion;
 | 
				
			||||||
  SCMI_BASE_GET_TOTAL_PROTOCOLS              GetTotalProtocols;
 | 
					  SCMI_BASE_GET_TOTAL_PROTOCOLS                GetTotalProtocols;
 | 
				
			||||||
  SCMI_BASE_DISCOVER_VENDOR                  DiscoverVendor;
 | 
					  SCMI_BASE_DISCOVER_VENDOR                    DiscoverVendor;
 | 
				
			||||||
  SCMI_BASE_DISCOVER_SUB_VENDOR              DiscoverSubVendor;
 | 
					  SCMI_BASE_DISCOVER_SUB_VENDOR                DiscoverSubVendor;
 | 
				
			||||||
  SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION  DiscoverImplementationVersion;
 | 
					  SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION    DiscoverImplementationVersion;
 | 
				
			||||||
  SCMI_BASE_DISCOVER_LIST_PROTOCOLS          DiscoverListProtocols;
 | 
					  SCMI_BASE_DISCOVER_LIST_PROTOCOLS            DiscoverListProtocols;
 | 
				
			||||||
} SCMI_BASE_PROTOCOL;
 | 
					} SCMI_BASE_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SCMI Message IDs for Base protocol.
 | 
					// SCMI Message IDs for Base protocol.
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  ScmiMessageIdBaseDiscoverVendor                 = 0x3,
 | 
					  ScmiMessageIdBaseDiscoverVendor                = 0x3,
 | 
				
			||||||
  ScmiMessageIdBaseDiscoverSubVendor              = 0x4,
 | 
					  ScmiMessageIdBaseDiscoverSubVendor             = 0x4,
 | 
				
			||||||
  ScmiMessageIdBaseDiscoverImplementationVersion  = 0x5,
 | 
					  ScmiMessageIdBaseDiscoverImplementationVersion = 0x5,
 | 
				
			||||||
  ScmiMessageIdBaseDiscoverListProtocols          = 0x6
 | 
					  ScmiMessageIdBaseDiscoverListProtocols         = 0x6
 | 
				
			||||||
} SCMI_MESSAGE_ID_BASE;
 | 
					} SCMI_MESSAGE_ID_BASE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_BASE_PROTOCOL_H_ */
 | 
					#endif /* ARM_SCMI_BASE_PROTOCOL_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,13 +15,13 @@
 | 
				
			|||||||
#include <Protocol/ArmScmi.h>
 | 
					#include <Protocol/ArmScmi.h>
 | 
				
			||||||
#include <Protocol/ArmScmiClockProtocol.h>
 | 
					#include <Protocol/ArmScmiClockProtocol.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SCMI_CLOCK2_PROTOCOL_GUID { \
 | 
					#define ARM_SCMI_CLOCK2_PROTOCOL_GUID  {\
 | 
				
			||||||
  0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } \
 | 
					  0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_GUID gArmScmiClock2ProtocolGuid;
 | 
					extern EFI_GUID  gArmScmiClock2ProtocolGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SCMI_CLOCK2_PROTOCOL_VERSION 1
 | 
					#define SCMI_CLOCK2_PROTOCOL_VERSION  1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _SCMI_CLOCK2_PROTOCOL SCMI_CLOCK2_PROTOCOL;
 | 
					typedef struct _SCMI_CLOCK2_PROTOCOL SCMI_CLOCK2_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -39,7 +39,7 @@ typedef struct _SCMI_CLOCK2_PROTOCOL SCMI_CLOCK2_PROTOCOL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_GET_VERSION) (
 | 
					(EFIAPI *SCMI_CLOCK2_GET_VERSION)(
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32                *Version
 | 
					  OUT UINT32                *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -57,7 +57,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_GET_TOTAL_CLOCKS) (
 | 
					(EFIAPI *SCMI_CLOCK2_GET_TOTAL_CLOCKS)(
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32                *TotalClocks
 | 
					  OUT UINT32                *TotalClocks
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -77,7 +77,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES) (
 | 
					(EFIAPI *SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES)(
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32                ClockId,
 | 
					  IN  UINT32                ClockId,
 | 
				
			||||||
  OUT BOOLEAN               *Enabled,
 | 
					  OUT BOOLEAN               *Enabled,
 | 
				
			||||||
@@ -109,7 +109,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_DESCRIBE_RATES) (
 | 
					(EFIAPI *SCMI_CLOCK2_DESCRIBE_RATES)(
 | 
				
			||||||
  IN     SCMI_CLOCK2_PROTOCOL     *This,
 | 
					  IN     SCMI_CLOCK2_PROTOCOL     *This,
 | 
				
			||||||
  IN     UINT32                   ClockId,
 | 
					  IN     UINT32                   ClockId,
 | 
				
			||||||
  OUT    SCMI_CLOCK_RATE_FORMAT   *Format,
 | 
					  OUT    SCMI_CLOCK_RATE_FORMAT   *Format,
 | 
				
			||||||
@@ -131,7 +131,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_RATE_GET) (
 | 
					(EFIAPI *SCMI_CLOCK2_RATE_GET)(
 | 
				
			||||||
  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK2_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32                ClockId,
 | 
					  IN  UINT32                ClockId,
 | 
				
			||||||
  OUT UINT64                *Rate
 | 
					  OUT UINT64                *Rate
 | 
				
			||||||
@@ -149,7 +149,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_RATE_SET) (
 | 
					(EFIAPI *SCMI_CLOCK2_RATE_SET)(
 | 
				
			||||||
  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
					  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
				
			||||||
  IN UINT32                 ClockId,
 | 
					  IN UINT32                 ClockId,
 | 
				
			||||||
  IN UINT64                 Rate
 | 
					  IN UINT64                 Rate
 | 
				
			||||||
@@ -168,24 +168,24 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK2_ENABLE) (
 | 
					(EFIAPI *SCMI_CLOCK2_ENABLE)(
 | 
				
			||||||
  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
					  IN SCMI_CLOCK2_PROTOCOL   *This,
 | 
				
			||||||
  IN UINT32                 ClockId,
 | 
					  IN UINT32                 ClockId,
 | 
				
			||||||
  IN BOOLEAN                Enable
 | 
					  IN BOOLEAN                Enable
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _SCMI_CLOCK2_PROTOCOL {
 | 
					typedef struct _SCMI_CLOCK2_PROTOCOL {
 | 
				
			||||||
  SCMI_CLOCK2_GET_VERSION           GetVersion;
 | 
					  SCMI_CLOCK2_GET_VERSION             GetVersion;
 | 
				
			||||||
  SCMI_CLOCK2_GET_TOTAL_CLOCKS      GetTotalClocks;
 | 
					  SCMI_CLOCK2_GET_TOTAL_CLOCKS        GetTotalClocks;
 | 
				
			||||||
  SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES  GetClockAttributes;
 | 
					  SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES    GetClockAttributes;
 | 
				
			||||||
  SCMI_CLOCK2_DESCRIBE_RATES        DescribeRates;
 | 
					  SCMI_CLOCK2_DESCRIBE_RATES          DescribeRates;
 | 
				
			||||||
  SCMI_CLOCK2_RATE_GET              RateGet;
 | 
					  SCMI_CLOCK2_RATE_GET                RateGet;
 | 
				
			||||||
  SCMI_CLOCK2_RATE_SET              RateSet;
 | 
					  SCMI_CLOCK2_RATE_SET                RateSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Extension to original ClockProtocol, added here so SCMI_CLOCK2_PROTOCOL
 | 
					  // Extension to original ClockProtocol, added here so SCMI_CLOCK2_PROTOCOL
 | 
				
			||||||
  // can be cast to SCMI_CLOCK_PROTOCOL
 | 
					  // can be cast to SCMI_CLOCK_PROTOCOL
 | 
				
			||||||
  UINTN                             Version; // For future expandability
 | 
					  UINTN                               Version; // For future expandability
 | 
				
			||||||
  SCMI_CLOCK2_ENABLE                Enable;
 | 
					  SCMI_CLOCK2_ENABLE                  Enable;
 | 
				
			||||||
} SCMI_CLOCK2_PROTOCOL;
 | 
					} SCMI_CLOCK2_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_CLOCK2_PROTOCOL_H_ */
 | 
					#endif /* ARM_SCMI_CLOCK2_PROTOCOL_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,11 +14,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <Protocol/ArmScmi.h>
 | 
					#include <Protocol/ArmScmi.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARM_SCMI_CLOCK_PROTOCOL_GUID { \
 | 
					#define ARM_SCMI_CLOCK_PROTOCOL_GUID  {\
 | 
				
			||||||
  0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
 | 
					  0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_GUID gArmScmiClockProtocolGuid;
 | 
					extern EFI_GUID  gArmScmiClockProtocolGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Message Type for clock management protocol.
 | 
					// Message Type for clock management protocol.
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
@@ -35,21 +35,21 @@ typedef enum {
 | 
				
			|||||||
} SCMI_CLOCK_RATE_FORMAT;
 | 
					} SCMI_CLOCK_RATE_FORMAT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Clock management protocol version.
 | 
					// Clock management protocol version.
 | 
				
			||||||
#define SCMI_CLOCK_PROTOCOL_VERSION 0x10000
 | 
					#define SCMI_CLOCK_PROTOCOL_VERSION  0x10000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK      0xFFU
 | 
					#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK   0xFFU
 | 
				
			||||||
#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT     16
 | 
					#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT  16
 | 
				
			||||||
#define SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK               0xFFFFU
 | 
					#define SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK            0xFFFFU
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Total number of pending asynchronous clock rates changes
 | 
					/** Total number of pending asynchronous clock rates changes
 | 
				
			||||||
  supported by the SCP, Attr Bits[23:16]
 | 
					  supported by the SCP, Attr Bits[23:16]
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define SCMI_CLOCK_PROTOCOL_MAX_ASYNC_CLK_RATES(Attr) (                       \
 | 
					#define SCMI_CLOCK_PROTOCOL_MAX_ASYNC_CLK_RATES(Attr)  (                      \
 | 
				
			||||||
                  (Attr >> SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT) &&  \
 | 
					                  (Attr >> SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT) &&  \
 | 
				
			||||||
                   SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK)
 | 
					                   SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Total of clock devices supported by the SCP, Attr Bits[15:0]
 | 
					// Total of clock devices supported by the SCP, Attr Bits[15:0]
 | 
				
			||||||
#define SCMI_CLOCK_PROTOCOL_TOTAL_CLKS(Attr) (Attr & SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK)
 | 
					#define SCMI_CLOCK_PROTOCOL_TOTAL_CLKS(Attr)  (Attr & SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(1)
 | 
					#pragma pack(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -57,18 +57,18 @@ typedef enum {
 | 
				
			|||||||
   either Rate or Min/Max/Step triplet is valid.
 | 
					   either Rate or Min/Max/Step triplet is valid.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT64 Min;
 | 
					  UINT64    Min;
 | 
				
			||||||
  UINT64 Max;
 | 
					  UINT64    Max;
 | 
				
			||||||
  UINT64 Step;
 | 
					  UINT64    Step;
 | 
				
			||||||
} SCMI_CLOCK_RATE_CONTINUOUS;
 | 
					} SCMI_CLOCK_RATE_CONTINUOUS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT64 Rate;
 | 
					  UINT64    Rate;
 | 
				
			||||||
} SCMI_CLOCK_RATE_DISCRETE;
 | 
					} SCMI_CLOCK_RATE_DISCRETE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef union {
 | 
					typedef union {
 | 
				
			||||||
  SCMI_CLOCK_RATE_CONTINUOUS ContinuousRate;
 | 
					  SCMI_CLOCK_RATE_CONTINUOUS    ContinuousRate;
 | 
				
			||||||
  SCMI_CLOCK_RATE_DISCRETE DiscreteRate;
 | 
					  SCMI_CLOCK_RATE_DISCRETE      DiscreteRate;
 | 
				
			||||||
} SCMI_CLOCK_RATE;
 | 
					} SCMI_CLOCK_RATE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack()
 | 
					#pragma pack()
 | 
				
			||||||
@@ -89,7 +89,7 @@ typedef struct _SCMI_CLOCK_PROTOCOL SCMI_CLOCK_PROTOCOL;
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_GET_VERSION) (
 | 
					(EFIAPI *SCMI_CLOCK_GET_VERSION)(
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32               *Version
 | 
					  OUT UINT32               *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -107,7 +107,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_GET_TOTAL_CLOCKS) (
 | 
					(EFIAPI *SCMI_CLOCK_GET_TOTAL_CLOCKS)(
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32               *TotalClocks
 | 
					  OUT UINT32               *TotalClocks
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -127,7 +127,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_GET_CLOCK_ATTRIBUTES) (
 | 
					(EFIAPI *SCMI_CLOCK_GET_CLOCK_ATTRIBUTES)(
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32               ClockId,
 | 
					  IN  UINT32               ClockId,
 | 
				
			||||||
  OUT BOOLEAN              *Enabled,
 | 
					  OUT BOOLEAN              *Enabled,
 | 
				
			||||||
@@ -159,7 +159,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_DESCRIBE_RATES) (
 | 
					(EFIAPI *SCMI_CLOCK_DESCRIBE_RATES)(
 | 
				
			||||||
  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
					  IN     SCMI_CLOCK_PROTOCOL     *This,
 | 
				
			||||||
  IN     UINT32                   ClockId,
 | 
					  IN     UINT32                   ClockId,
 | 
				
			||||||
  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
					  OUT    SCMI_CLOCK_RATE_FORMAT  *Format,
 | 
				
			||||||
@@ -181,7 +181,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_RATE_GET) (
 | 
					(EFIAPI *SCMI_CLOCK_RATE_GET)(
 | 
				
			||||||
  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN  SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  IN  UINT32               ClockId,
 | 
					  IN  UINT32               ClockId,
 | 
				
			||||||
  OUT UINT64               *Rate
 | 
					  OUT UINT64               *Rate
 | 
				
			||||||
@@ -199,20 +199,19 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_CLOCK_RATE_SET) (
 | 
					(EFIAPI *SCMI_CLOCK_RATE_SET)(
 | 
				
			||||||
  IN SCMI_CLOCK_PROTOCOL  *This,
 | 
					  IN SCMI_CLOCK_PROTOCOL  *This,
 | 
				
			||||||
  IN UINT32               ClockId,
 | 
					  IN UINT32               ClockId,
 | 
				
			||||||
  IN UINT64               Rate
 | 
					  IN UINT64               Rate
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _SCMI_CLOCK_PROTOCOL {
 | 
					typedef struct _SCMI_CLOCK_PROTOCOL {
 | 
				
			||||||
  SCMI_CLOCK_GET_VERSION GetVersion;
 | 
					  SCMI_CLOCK_GET_VERSION             GetVersion;
 | 
				
			||||||
  SCMI_CLOCK_GET_TOTAL_CLOCKS GetTotalClocks;
 | 
					  SCMI_CLOCK_GET_TOTAL_CLOCKS        GetTotalClocks;
 | 
				
			||||||
  SCMI_CLOCK_GET_CLOCK_ATTRIBUTES GetClockAttributes;
 | 
					  SCMI_CLOCK_GET_CLOCK_ATTRIBUTES    GetClockAttributes;
 | 
				
			||||||
  SCMI_CLOCK_DESCRIBE_RATES DescribeRates;
 | 
					  SCMI_CLOCK_DESCRIBE_RATES          DescribeRates;
 | 
				
			||||||
  SCMI_CLOCK_RATE_GET RateGet;
 | 
					  SCMI_CLOCK_RATE_GET                RateGet;
 | 
				
			||||||
  SCMI_CLOCK_RATE_SET RateSet;
 | 
					  SCMI_CLOCK_RATE_SET                RateSet;
 | 
				
			||||||
} SCMI_CLOCK_PROTOCOL;
 | 
					} SCMI_CLOCK_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
 | 
					#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,15 +20,15 @@
 | 
				
			|||||||
  0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \
 | 
					  0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern EFI_GUID gArmScmiPerformanceProtocolGuid;
 | 
					extern EFI_GUID  gArmScmiPerformanceProtocolGuid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;
 | 
					typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack(1)
 | 
					#pragma pack(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define POWER_IN_MW_SHIFT       16
 | 
					#define POWER_IN_MW_SHIFT      16
 | 
				
			||||||
#define POWER_IN_MW_MASK        0x1
 | 
					#define POWER_IN_MW_MASK       0x1
 | 
				
			||||||
#define NUM_PERF_DOMAINS_MASK   0xFFFF
 | 
					#define NUM_PERF_DOMAINS_MASK  0xFFFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Total number of performance domains, Attr Bits [15:0]
 | 
					// Total number of performance domains, Attr Bits [15:0]
 | 
				
			||||||
#define SCMI_PERF_TOTAL_DOMAINS(Attr)  (Attr & NUM_PERF_DOMAINS_MASK)
 | 
					#define SCMI_PERF_TOTAL_DOMAINS(Attr)  (Attr & NUM_PERF_DOMAINS_MASK)
 | 
				
			||||||
@@ -39,41 +39,41 @@ typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Performance protocol attributes return values.
 | 
					// Performance protocol attributes return values.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 Attributes;
 | 
					  UINT32    Attributes;
 | 
				
			||||||
  UINT64 StatisticsAddress;
 | 
					  UINT64    StatisticsAddress;
 | 
				
			||||||
  UINT32 StatisticsLen;
 | 
					  UINT32    StatisticsLen;
 | 
				
			||||||
} SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES;
 | 
					} SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr) ((Attr >> 28) & 0x1)
 | 
					#define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr)  ((Attr >> 28) & 0x1)
 | 
				
			||||||
#define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr) ((Attr >> 29) & 0x1)
 | 
					#define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr)  ((Attr >> 29) & 0x1)
 | 
				
			||||||
#define SCMI_PERF_SUPPORT_SET_LVL(Attr) ((Attr >> 30) & 0x1)
 | 
					#define SCMI_PERF_SUPPORT_SET_LVL(Attr)            ((Attr >> 30) & 0x1)
 | 
				
			||||||
#define SCMI_PERF_SUPPORT_SET_LIM(Attr) ((Attr >> 31) & 0x1)
 | 
					#define SCMI_PERF_SUPPORT_SET_LIM(Attr)            ((Attr >> 31) & 0x1)
 | 
				
			||||||
#define SCMI_PERF_RATE_LIMIT(RateLimit) (RateLimit & 0xFFF)
 | 
					#define SCMI_PERF_RATE_LIMIT(RateLimit)            (RateLimit & 0xFFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Performance protocol domain attributes.
 | 
					// Performance protocol domain attributes.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 Attributes;
 | 
					  UINT32    Attributes;
 | 
				
			||||||
  UINT32 RateLimit;
 | 
					  UINT32    RateLimit;
 | 
				
			||||||
  UINT32 SustainedFreq;
 | 
					  UINT32    SustainedFreq;
 | 
				
			||||||
  UINT32 SustainedPerfLevel;
 | 
					  UINT32    SustainedPerfLevel;
 | 
				
			||||||
  UINT8  Name[SCMI_MAX_STR_LEN];
 | 
					  UINT8     Name[SCMI_MAX_STR_LEN];
 | 
				
			||||||
} SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES;
 | 
					} SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Worst case latency in microseconds, Bits[15:0]
 | 
					// Worst case latency in microseconds, Bits[15:0]
 | 
				
			||||||
#define PERF_LATENCY_MASK                          0xFFFF
 | 
					#define PERF_LATENCY_MASK  0xFFFF
 | 
				
			||||||
#define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency) (Latency & PERF_LATENCY_MASK)
 | 
					#define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency)  (Latency & PERF_LATENCY_MASK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Performance protocol performance level.
 | 
					// Performance protocol performance level.
 | 
				
			||||||
typedef  struct {
 | 
					typedef  struct {
 | 
				
			||||||
  UINT32 Level;
 | 
					  UINT32    Level;
 | 
				
			||||||
  UINT32 PowerCost;
 | 
					  UINT32    PowerCost;
 | 
				
			||||||
  UINT32 Latency;
 | 
					  UINT32    Latency;
 | 
				
			||||||
} SCMI_PERFORMANCE_LEVEL;
 | 
					} SCMI_PERFORMANCE_LEVEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Performance protocol performance limit.
 | 
					// Performance protocol performance limit.
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  UINT32 RangeMax;
 | 
					  UINT32    RangeMax;
 | 
				
			||||||
  UINT32 RangeMin;
 | 
					  UINT32    RangeMin;
 | 
				
			||||||
} SCMI_PERFORMANCE_LIMITS;
 | 
					} SCMI_PERFORMANCE_LIMITS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma pack()
 | 
					#pragma pack()
 | 
				
			||||||
@@ -92,7 +92,7 @@ typedef struct {
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_GET_VERSION) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_GET_VERSION)(
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  OUT UINT32                     *Version
 | 
					  OUT UINT32                     *Version
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
@@ -109,7 +109,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES)(
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL              *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL              *This,
 | 
				
			||||||
  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes
 | 
					  OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES   *Attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -128,7 +128,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES)(
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL           *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL           *This,
 | 
				
			||||||
  IN  UINT32                               DomainId,
 | 
					  IN  UINT32                               DomainId,
 | 
				
			||||||
  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
 | 
					  OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES  *DomainAttributes
 | 
				
			||||||
@@ -153,7 +153,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS)(
 | 
				
			||||||
  IN     SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
					  IN     SCMI_PERFORMANCE_PROTOCOL  *This,
 | 
				
			||||||
  IN     UINT32                     DomainId,
 | 
					  IN     UINT32                     DomainId,
 | 
				
			||||||
  OUT    UINT32                     *NumLevels,
 | 
					  OUT    UINT32                     *NumLevels,
 | 
				
			||||||
@@ -173,7 +173,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET)(
 | 
				
			||||||
  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  IN UINT32                    DomainId,
 | 
					  IN UINT32                    DomainId,
 | 
				
			||||||
  IN SCMI_PERFORMANCE_LIMITS   *Limits
 | 
					  IN SCMI_PERFORMANCE_LIMITS   *Limits
 | 
				
			||||||
@@ -192,7 +192,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET)(
 | 
				
			||||||
  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  UINT32                    DomainId,
 | 
					  UINT32                    DomainId,
 | 
				
			||||||
  SCMI_PERFORMANCE_LIMITS   *Limits
 | 
					  SCMI_PERFORMANCE_LIMITS   *Limits
 | 
				
			||||||
@@ -210,7 +210,7 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET)(
 | 
				
			||||||
  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  IN UINT32                    DomainId,
 | 
					  IN UINT32                    DomainId,
 | 
				
			||||||
  IN UINT32                    Level
 | 
					  IN UINT32                    Level
 | 
				
			||||||
@@ -229,21 +229,21 @@ EFI_STATUS
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
typedef
 | 
					typedef
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET) (
 | 
					(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET)(
 | 
				
			||||||
  IN  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
					  IN  SCMI_PERFORMANCE_PROTOCOL *This,
 | 
				
			||||||
  IN  UINT32                    DomainId,
 | 
					  IN  UINT32                    DomainId,
 | 
				
			||||||
  OUT UINT32                    *Level
 | 
					  OUT UINT32                    *Level
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _SCMI_PERFORMANCE_PROTOCOL {
 | 
					typedef struct _SCMI_PERFORMANCE_PROTOCOL {
 | 
				
			||||||
  SCMI_PERFORMANCE_GET_VERSION GetVersion;
 | 
					  SCMI_PERFORMANCE_GET_VERSION              GetVersion;
 | 
				
			||||||
  SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes;
 | 
					  SCMI_PERFORMANCE_GET_ATTRIBUTES           GetProtocolAttributes;
 | 
				
			||||||
  SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES GetDomainAttributes;
 | 
					  SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES    GetDomainAttributes;
 | 
				
			||||||
  SCMI_PERFORMANCE_DESCRIBE_LEVELS DescribeLevels;
 | 
					  SCMI_PERFORMANCE_DESCRIBE_LEVELS          DescribeLevels;
 | 
				
			||||||
  SCMI_PERFORMANCE_LIMITS_SET LimitsSet;
 | 
					  SCMI_PERFORMANCE_LIMITS_SET               LimitsSet;
 | 
				
			||||||
  SCMI_PERFORMANCE_LIMITS_GET LimitsGet;
 | 
					  SCMI_PERFORMANCE_LIMITS_GET               LimitsGet;
 | 
				
			||||||
  SCMI_PERFORMANCE_LEVEL_SET LevelSet;
 | 
					  SCMI_PERFORMANCE_LEVEL_SET                LevelSet;
 | 
				
			||||||
  SCMI_PERFORMANCE_LEVEL_GET LevelGet;
 | 
					  SCMI_PERFORMANCE_LEVEL_GET                LevelGet;
 | 
				
			||||||
} SCMI_PERFORMANCE_PROTOCOL;
 | 
					} SCMI_PERFORMANCE_PROTOCOL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
@@ -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>
 | 
				
			||||||
@@ -16,16 +15,15 @@
 | 
				
			|||||||
#include <Library/PcdLib.h>
 | 
					#include <Library/PcdLib.h>
 | 
				
			||||||
#include <Library/ArmGenericTimerCounterLib.h>
 | 
					#include <Library/ArmGenericTimerCounterLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TICKS_PER_MICRO_SEC     (PcdGet32 (PcdArmArchTimerFreqInHz)/1000000U)
 | 
					#define TICKS_PER_MICRO_SEC  (PcdGet32 (PcdArmArchTimerFreqInHz)/1000000U)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Select appropriate multiply function for platform architecture.
 | 
					// Select appropriate multiply function for platform architecture.
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					#ifdef MDE_CPU_ARM
 | 
				
			||||||
#define MULT_U64_X_N MultU64x32
 | 
					#define MULT_U64_X_N  MultU64x32
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#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).
 | 
				
			||||||
@@ -49,7 +46,7 @@ TimerConstructor (
 | 
				
			|||||||
      //
 | 
					      //
 | 
				
			||||||
      ASSERT (TICKS_PER_MICRO_SEC);
 | 
					      ASSERT (TICKS_PER_MICRO_SEC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef MDE_CPU_ARM
 | 
					 #ifdef MDE_CPU_ARM
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Only set the frequency for ARMv7. We expect the secure firmware to
 | 
					      // Only set the frequency for ARMv7. We expect the secure firmware to
 | 
				
			||||||
      // have already done it.
 | 
					      // have already done it.
 | 
				
			||||||
@@ -59,7 +56,8 @@ 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);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,16 +87,16 @@ EFIAPI
 | 
				
			|||||||
GetPlatformTimerFreq (
 | 
					GetPlatformTimerFreq (
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN TimerFreq;
 | 
					  UINTN  TimerFreq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TimerFreq = PcdGet32 (PcdArmArchTimerFreqInHz);
 | 
					  TimerFreq = PcdGet32 (PcdArmArchTimerFreqInHz);
 | 
				
			||||||
  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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -111,11 +108,11 @@ GetPlatformTimerFreq (
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
MicroSecondDelay (
 | 
					MicroSecondDelay (
 | 
				
			||||||
  IN      UINTN                     MicroSeconds
 | 
					  IN      UINTN  MicroSeconds
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64 TimerTicks64;
 | 
					  UINT64  TimerTicks64;
 | 
				
			||||||
  UINT64 SystemCounterVal;
 | 
					  UINT64  SystemCounterVal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Calculate counter ticks that represent requested delay:
 | 
					  // Calculate counter ticks that represent requested delay:
 | 
				
			||||||
  //  = MicroSeconds x TICKS_PER_MICRO_SEC
 | 
					  //  = MicroSeconds x TICKS_PER_MICRO_SEC
 | 
				
			||||||
@@ -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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -158,13 +154,13 @@ MicroSecondDelay (
 | 
				
			|||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
NanoSecondDelay (
 | 
					NanoSecondDelay (
 | 
				
			||||||
  IN  UINTN NanoSeconds
 | 
					  IN  UINTN  NanoSeconds
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN  MicroSeconds;
 | 
					  UINTN  MicroSeconds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Round up to 1us Tick Number
 | 
					  // Round up to 1us Tick Number
 | 
				
			||||||
  MicroSeconds = NanoSeconds / 1000;
 | 
					  MicroSeconds  = NanoSeconds / 1000;
 | 
				
			||||||
  MicroSeconds += ((NanoSeconds % 1000) == 0) ? 0 : 1;
 | 
					  MicroSeconds += ((NanoSeconds % 1000) == 0) ? 0 : 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  MicroSecondDelay (MicroSeconds);
 | 
					  MicroSecondDelay (MicroSeconds);
 | 
				
			||||||
@@ -219,13 +215,13 @@ GetPerformanceCounter (
 | 
				
			|||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GetPerformanceCounterProperties (
 | 
					GetPerformanceCounterProperties (
 | 
				
			||||||
  OUT      UINT64                    *StartValue,  OPTIONAL
 | 
					  OUT      UINT64  *StartValue   OPTIONAL,
 | 
				
			||||||
  OUT      UINT64                    *EndValue     OPTIONAL
 | 
					  OUT      UINT64  *EndValue     OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (StartValue != NULL) {
 | 
					  if (StartValue != NULL) {
 | 
				
			||||||
    // Timer starts at 0
 | 
					    // Timer starts at 0
 | 
				
			||||||
    *StartValue = (UINT64)0ULL ;
 | 
					    *StartValue = (UINT64)0ULL;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (EndValue != NULL) {
 | 
					  if (EndValue != NULL) {
 | 
				
			||||||
@@ -250,7 +246,7 @@ GetPerformanceCounterProperties (
 | 
				
			|||||||
UINT64
 | 
					UINT64
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
GetTimeInNanoSecond (
 | 
					GetTimeInNanoSecond (
 | 
				
			||||||
  IN      UINT64                     Ticks
 | 
					  IN      UINT64  Ticks
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT64  NanoSeconds;
 | 
					  UINT64  NanoSeconds;
 | 
				
			||||||
@@ -267,7 +263,8 @@ GetTimeInNanoSecond (
 | 
				
			|||||||
                  DivU64x32Remainder (
 | 
					                  DivU64x32Remainder (
 | 
				
			||||||
                    Ticks,
 | 
					                    Ticks,
 | 
				
			||||||
                    TimerFreq,
 | 
					                    TimerFreq,
 | 
				
			||||||
                    &Remainder),
 | 
					                    &Remainder
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
                  1000000000U
 | 
					                  1000000000U
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -277,8 +274,9 @@ GetTimeInNanoSecond (
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  NanoSeconds += DivU64x32 (
 | 
					  NanoSeconds += DivU64x32 (
 | 
				
			||||||
                   MULT_U64_X_N (
 | 
					                   MULT_U64_X_N (
 | 
				
			||||||
                     (UINT64) Remainder,
 | 
					                     (UINT64)Remainder,
 | 
				
			||||||
                     1000000000U),
 | 
					                     1000000000U
 | 
				
			||||||
 | 
					                     ),
 | 
				
			||||||
                   TimerFreq
 | 
					                   TimerFreq
 | 
				
			||||||
                   );
 | 
					                   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,20 +20,21 @@ CacheRangeOperation (
 | 
				
			|||||||
  IN  UINTN           LineLength
 | 
					  IN  UINTN           LineLength
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN ArmCacheLineAlignmentMask;
 | 
					  UINTN  ArmCacheLineAlignmentMask;
 | 
				
			||||||
  // Align address (rounding down)
 | 
					  // Align address (rounding down)
 | 
				
			||||||
  UINTN AlignedAddress;
 | 
					  UINTN  AlignedAddress;
 | 
				
			||||||
  UINTN EndAddress;
 | 
					  UINTN  EndAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ArmCacheLineAlignmentMask = LineLength - 1;
 | 
					  ArmCacheLineAlignmentMask = LineLength - 1;
 | 
				
			||||||
  AlignedAddress = (UINTN)Start - ((UINTN)Start & ArmCacheLineAlignmentMask);
 | 
					  AlignedAddress            = (UINTN)Start - ((UINTN)Start & ArmCacheLineAlignmentMask);
 | 
				
			||||||
  EndAddress     = (UINTN)Start + Length;
 | 
					  EndAddress                = (UINTN)Start + Length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Perform the line operation on an address in each cache line
 | 
					  // Perform the line operation on an address in each cache line
 | 
				
			||||||
  while (AlignedAddress < EndAddress) {
 | 
					  while (AlignedAddress < EndAddress) {
 | 
				
			||||||
    LineOperation(AlignedAddress);
 | 
					    LineOperation (AlignedAddress);
 | 
				
			||||||
    AlignedAddress += LineLength;
 | 
					    AlignedAddress += LineLength;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ArmDataSynchronizationBarrier ();
 | 
					  ArmDataSynchronizationBarrier ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -58,15 +59,22 @@ InvalidateDataCache (
 | 
				
			|||||||
VOID *
 | 
					VOID *
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InvalidateInstructionCacheRange (
 | 
					InvalidateInstructionCacheRange (
 | 
				
			||||||
  IN      VOID                      *Address,
 | 
					  IN      VOID   *Address,
 | 
				
			||||||
  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 ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,12 +93,16 @@ WriteBackInvalidateDataCache (
 | 
				
			|||||||
VOID *
 | 
					VOID *
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
WriteBackInvalidateDataCacheRange (
 | 
					WriteBackInvalidateDataCacheRange (
 | 
				
			||||||
  IN      VOID                      *Address,
 | 
					  IN      VOID   *Address,
 | 
				
			||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN  Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation(Address, Length, ArmCleanInvalidateDataCacheEntryByMVA,
 | 
					  CacheRangeOperation (
 | 
				
			||||||
    ArmDataCacheLineLength ());
 | 
					    Address,
 | 
				
			||||||
 | 
					    Length,
 | 
				
			||||||
 | 
					    ArmCleanInvalidateDataCacheEntryByMVA,
 | 
				
			||||||
 | 
					    ArmDataCacheLineLength ()
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
  return Address;
 | 
					  return Address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -106,23 +118,31 @@ WriteBackDataCache (
 | 
				
			|||||||
VOID *
 | 
					VOID *
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
WriteBackDataCacheRange (
 | 
					WriteBackDataCacheRange (
 | 
				
			||||||
  IN      VOID                      *Address,
 | 
					  IN      VOID   *Address,
 | 
				
			||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN  Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation(Address, Length, ArmCleanDataCacheEntryByMVA,
 | 
					  CacheRangeOperation (
 | 
				
			||||||
    ArmDataCacheLineLength ());
 | 
					    Address,
 | 
				
			||||||
 | 
					    Length,
 | 
				
			||||||
 | 
					    ArmCleanDataCacheEntryByMVA,
 | 
				
			||||||
 | 
					    ArmDataCacheLineLength ()
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
  return Address;
 | 
					  return Address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID *
 | 
					VOID *
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InvalidateDataCacheRange (
 | 
					InvalidateDataCacheRange (
 | 
				
			||||||
  IN      VOID                      *Address,
 | 
					  IN      VOID   *Address,
 | 
				
			||||||
  IN      UINTN                     Length
 | 
					  IN      UINTN  Length
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  CacheRangeOperation(Address, Length, ArmInvalidateDataCacheEntryByMVA,
 | 
					  CacheRangeOperation (
 | 
				
			||||||
    ArmDataCacheLineLength ());
 | 
					    Address,
 | 
				
			||||||
 | 
					    Length,
 | 
				
			||||||
 | 
					    ArmInvalidateDataCacheEntryByMVA,
 | 
				
			||||||
 | 
					    ArmDataCacheLineLength ()
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
  return Address;
 | 
					  return Address;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,12 +26,12 @@
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
DisassembleInstruction (
 | 
					DisassembleInstruction (
 | 
				
			||||||
  IN  UINT8     **OpCodePtr,
 | 
					  IN  UINT8      **OpCodePtr,
 | 
				
			||||||
  IN  BOOLEAN   Thumb,
 | 
					  IN  BOOLEAN    Thumb,
 | 
				
			||||||
  IN  BOOLEAN   Extended,
 | 
					  IN  BOOLEAN    Extended,
 | 
				
			||||||
  IN OUT UINT32 *ItBlock,
 | 
					  IN OUT UINT32  *ItBlock,
 | 
				
			||||||
  OUT CHAR8     *Buf,
 | 
					  OUT CHAR8      *Buf,
 | 
				
			||||||
  OUT UINTN     Size
 | 
					  OUT UINTN      Size
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // Not yet supported for AArch64.
 | 
					  // Not yet supported for AArch64.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@
 | 
				
			|||||||
#include <Library/PrintLib.h>
 | 
					#include <Library/PrintLib.h>
 | 
				
			||||||
#include <Library/ArmDisassemblerLib.h>
 | 
					#include <Library/ArmDisassemblerLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHAR8 *gCondition[] = {
 | 
					CHAR8  *gCondition[] = {
 | 
				
			||||||
  "EQ",
 | 
					  "EQ",
 | 
				
			||||||
  "NE",
 | 
					  "NE",
 | 
				
			||||||
  "CS",
 | 
					  "CS",
 | 
				
			||||||
@@ -34,7 +34,7 @@ CHAR8 *gCondition[] = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define COND(_a)  gCondition[((_a) >> 28)]
 | 
					#define COND(_a)  gCondition[((_a) >> 28)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHAR8 *gReg[] = {
 | 
					CHAR8  *gReg[] = {
 | 
				
			||||||
  "r0",
 | 
					  "r0",
 | 
				
			||||||
  "r1",
 | 
					  "r1",
 | 
				
			||||||
  "r2",
 | 
					  "r2",
 | 
				
			||||||
@@ -53,37 +53,36 @@ CHAR8 *gReg[] = {
 | 
				
			|||||||
  "pc"
 | 
					  "pc"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHAR8 *gLdmAdr[] = {
 | 
					CHAR8  *gLdmAdr[] = {
 | 
				
			||||||
  "DA",
 | 
					  "DA",
 | 
				
			||||||
  "IA",
 | 
					  "IA",
 | 
				
			||||||
  "DB",
 | 
					  "DB",
 | 
				
			||||||
  "IB"
 | 
					  "IB"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHAR8 *gLdmStack[] = {
 | 
					CHAR8  *gLdmStack[] = {
 | 
				
			||||||
  "FA",
 | 
					  "FA",
 | 
				
			||||||
  "FD",
 | 
					  "FD",
 | 
				
			||||||
  "EA",
 | 
					  "EA",
 | 
				
			||||||
  "ED"
 | 
					  "ED"
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#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 WRITE(_Write)  ((_Write) ? "!" : "")
 | 
				
			||||||
 | 
					#define BYTE(_B)       ((_B) ? "B":"")
 | 
				
			||||||
 | 
					#define USER(_B)       ((_B) ? "^" : "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SIGN(_U)  ((_U) ? "" : "-")
 | 
					CHAR8  mMregListStr[4*15 + 1];
 | 
				
			||||||
#define WRITE(_Write) ((_Write) ? "!" : "")
 | 
					 | 
				
			||||||
#define BYTE(_B)  ((_B) ? "B":"")
 | 
					 | 
				
			||||||
#define USER(_B)  ((_B) ? "^" : "")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CHAR8 mMregListStr[4*15 + 1];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
CHAR8 *
 | 
					CHAR8 *
 | 
				
			||||||
MRegList (
 | 
					MRegList (
 | 
				
			||||||
  UINT32  OpCode
 | 
					  UINT32  OpCode
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN     Index, Start, End;
 | 
					  UINTN    Index, Start, End;
 | 
				
			||||||
  BOOLEAN   First;
 | 
					  BOOLEAN  First;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  mMregListStr[0] = '\0';
 | 
					  mMregListStr[0] = '\0';
 | 
				
			||||||
  AsciiStrCatS (mMregListStr, sizeof mMregListStr, "{");
 | 
					  AsciiStrCatS (mMregListStr, sizeof mMregListStr, "{");
 | 
				
			||||||
@@ -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
 | 
				
			||||||
@@ -129,14 +130,13 @@ FieldMask (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
UINT32
 | 
					UINT32
 | 
				
			||||||
RotateRight (
 | 
					RotateRight (
 | 
				
			||||||
  IN UINT32 Op,
 | 
					  IN UINT32  Op,
 | 
				
			||||||
  IN UINT32 Shift
 | 
					  IN UINT32  Shift
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  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.
 | 
				
			||||||
@@ -152,39 +152,38 @@ RotateRight (
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
DisassembleArmInstruction (
 | 
					DisassembleArmInstruction (
 | 
				
			||||||
  IN  UINT32    **OpCodePtr,
 | 
					  IN  UINT32   **OpCodePtr,
 | 
				
			||||||
  OUT CHAR8     *Buf,
 | 
					  OUT CHAR8    *Buf,
 | 
				
			||||||
  OUT UINTN     Size,
 | 
					  OUT UINTN    Size,
 | 
				
			||||||
  IN  BOOLEAN   Extended
 | 
					  IN  BOOLEAN  Extended
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32    OpCode;
 | 
					  UINT32   OpCode;
 | 
				
			||||||
  CHAR8     *Type;
 | 
					  CHAR8    *Type;
 | 
				
			||||||
  CHAR8     *Root;
 | 
					  CHAR8    *Root;
 | 
				
			||||||
  BOOLEAN   Imm, Pre, Up, WriteBack, Write, Load, Sign, Half;
 | 
					  BOOLEAN  Imm, Pre, Up, WriteBack, Write, Load, Sign, Half;
 | 
				
			||||||
  UINT32    Rn, Rd, Rm;
 | 
					  UINT32   Rn, Rd, Rm;
 | 
				
			||||||
  UINT32    IMod, Offset8, Offset12;
 | 
					  UINT32   IMod, Offset8, Offset12;
 | 
				
			||||||
  UINT32    Index;
 | 
					  UINT32   Index;
 | 
				
			||||||
  UINT32    ShiftImm, Shift;
 | 
					  UINT32   ShiftImm, Shift;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  OpCode = **OpCodePtr;
 | 
					  OpCode = **OpCodePtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Imm = (OpCode & BIT25) == BIT25; // I
 | 
					  Imm       = (OpCode & BIT25) == BIT25; // I
 | 
				
			||||||
  Pre = (OpCode & BIT24) == BIT24; // P
 | 
					  Pre       = (OpCode & BIT24) == BIT24; // P
 | 
				
			||||||
  Up = (OpCode & BIT23) == BIT23; // U
 | 
					  Up        = (OpCode & BIT23) == BIT23; // U
 | 
				
			||||||
  WriteBack = (OpCode & BIT22) == BIT22; // B, also called S
 | 
					  WriteBack = (OpCode & BIT22) == BIT22; // B, also called S
 | 
				
			||||||
  Write = (OpCode & BIT21) == BIT21; // W
 | 
					  Write     = (OpCode & BIT21) == BIT21; // W
 | 
				
			||||||
  Load = (OpCode & BIT20) == BIT20; // L
 | 
					  Load      = (OpCode & BIT20) == BIT20; // L
 | 
				
			||||||
  Sign = (OpCode & BIT6) == BIT6; // S
 | 
					  Sign      = (OpCode & BIT6) == BIT6;   // S
 | 
				
			||||||
  Half = (OpCode & BIT5) == BIT5; // H
 | 
					  Half      = (OpCode & BIT5) == BIT5;   // H
 | 
				
			||||||
  Rn = (OpCode >> 16) & 0xf;
 | 
					  Rn        = (OpCode >> 16) & 0xf;
 | 
				
			||||||
  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;
 | 
				
			||||||
    Size -= Index;
 | 
					    Size -= Index;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -194,9 +193,10 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      // A4.1.27  LDREX{<cond>} <Rd>, [<Rn>]
 | 
					      // A4.1.27  LDREX{<cond>} <Rd>, [<Rn>]
 | 
				
			||||||
      AsciiSPrint (Buf, Size, "LDREX%a %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn]);
 | 
					      AsciiSPrint (Buf, Size, "LDREX%a %a, [%a]", COND (OpCode), gReg[Rd], gReg[Rn]);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
     // 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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -206,23 +206,25 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      // A4.1.20 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
					      // A4.1.20 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
				
			||||||
      // A4.1.21 LDM{<cond>}<addressing_mode> <Rn>, <registers_without_pc>^
 | 
					      // A4.1.21 LDM{<cond>}<addressing_mode> <Rn>, <registers_without_pc>^
 | 
				
			||||||
      // A4.1.22 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc>^
 | 
					      // A4.1.22 LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc>^
 | 
				
			||||||
      AsciiSPrint (Buf, Size, "LDM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn ,(OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
 | 
					      AsciiSPrint (Buf, Size, "LDM%a%a, %a%a, %a", COND (OpCode), LDM_EXT (Rn, (OpCode >> 23) & 3), gReg[Rn], WRITE (Write), MRegList (OpCode), USER (WriteBack));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // A4.1.97 STM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
					      // A4.1.97 STM{<cond>}<addressing_mode> <Rn>{!}, <registers>
 | 
				
			||||||
      // 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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // LDR/STR Address Mode 2
 | 
					  // LDR/STR Address Mode 2
 | 
				
			||||||
  if ( ((OpCode  & 0x0c000000) == 0x04000000) || ((OpCode & 0xfd70f000 ) == 0xf550f000) ) {
 | 
					  if (((OpCode  & 0x0c000000) == 0x04000000) || ((OpCode & 0xfd70f000) == 0xf550f000)) {
 | 
				
			||||||
    Offset12 = OpCode & 0xfff;
 | 
					    Offset12 = OpCode & 0xfff;
 | 
				
			||||||
    if ((OpCode & 0xfd70f000 ) == 0xf550f000) {
 | 
					    if ((OpCode & 0xfd70f000) == 0xf550f000) {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "PLD");
 | 
					      Index = AsciiSPrint (Buf, Size, "PLD");
 | 
				
			||||||
    } 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>]
 | 
				
			||||||
@@ -236,7 +238,7 @@ DisassembleArmInstruction (
 | 
				
			|||||||
        // A5.2.4 [<Rn>, +/-<Rm>, LSL #<shift_imm>]
 | 
					        // A5.2.4 [<Rn>, +/-<Rm>, LSL #<shift_imm>]
 | 
				
			||||||
        // A5.2.7 [<Rn>, +/-<Rm>, LSL #<shift_imm>]!
 | 
					        // A5.2.7 [<Rn>, +/-<Rm>, LSL #<shift_imm>]!
 | 
				
			||||||
        ShiftImm = (OpCode >> 7) & 0x1f;
 | 
					        ShiftImm = (OpCode >> 7) & 0x1f;
 | 
				
			||||||
        Shift = (OpCode >> 5) & 0x3;
 | 
					        Shift    = (OpCode >> 5) & 0x3;
 | 
				
			||||||
        if (Shift == 0x0) {
 | 
					        if (Shift == 0x0) {
 | 
				
			||||||
          Type = "LSL";
 | 
					          Type = "LSL";
 | 
				
			||||||
        } else if (Shift == 0x1) {
 | 
					        } else if (Shift == 0x1) {
 | 
				
			||||||
@@ -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);
 | 
				
			||||||
@@ -265,7 +268,7 @@ DisassembleArmInstruction (
 | 
				
			|||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // A5.2.10 [<Rn>], +/-<Rm>, LSL #<shift_imm>
 | 
					        // A5.2.10 [<Rn>], +/-<Rm>, LSL #<shift_imm>
 | 
				
			||||||
        ShiftImm = (OpCode >> 7) & 0x1f;
 | 
					        ShiftImm = (OpCode >> 7) & 0x1f;
 | 
				
			||||||
        Shift = (OpCode >> 5) & 0x3;
 | 
					        Shift    = (OpCode >> 5) & 0x3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (Shift == 0x0) {
 | 
					        if (Shift == 0x0) {
 | 
				
			||||||
          Type = "LSL";
 | 
					          Type = "LSL";
 | 
				
			||||||
@@ -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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -313,30 +317,31 @@ DisassembleArmInstruction (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Index = AsciiSPrint (Buf, Size, Root, COND (OpCode), gReg[Rd]);
 | 
					    Index = AsciiSPrint (Buf, Size, Root, COND (OpCode), gReg[Rd]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Sign = (OpCode & BIT6) == BIT6;
 | 
					    Sign    = (OpCode & BIT6) == BIT6;
 | 
				
			||||||
    Half = (OpCode & BIT5) == BIT5;
 | 
					    Half    = (OpCode & BIT5) == BIT5;
 | 
				
			||||||
    Offset8 = ((OpCode >> 4) | (OpCode * 0xf)) & 0xff;
 | 
					    Offset8 = ((OpCode >> 4) | (OpCode * 0xf)) & 0xff;
 | 
				
			||||||
    if (Pre & !Write) {
 | 
					    if (Pre & !Write) {
 | 
				
			||||||
      // Immediate offset/index
 | 
					      // Immediate offset/index
 | 
				
			||||||
      if (WriteBack) {
 | 
					      if (WriteBack) {
 | 
				
			||||||
        // A5.3.2  [<Rn>, #+/-<offset_8>]
 | 
					        // A5.3.2  [<Rn>, #+/-<offset_8>]
 | 
				
			||||||
        // A5.3.4  [<Rn>, #+/-<offset_8>]!
 | 
					        // A5.3.4  [<Rn>, #+/-<offset_8>]!
 | 
				
			||||||
        AsciiSPrint  (&Buf[Index], Size - Index, "[%a, #%a%d]%a", gReg[Rn], SIGN (Up), Offset8, WRITE (Write));
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%d]%a", gReg[Rn], SIGN (Up), Offset8, WRITE (Write));
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // A5.3.3  [<Rn>, +/-<Rm>]
 | 
					        // A5.3.3  [<Rn>, +/-<Rm>]
 | 
				
			||||||
        // A5.3.5  [<Rn>, +/-<Rm>]!
 | 
					        // A5.3.5  [<Rn>, +/-<Rm>]!
 | 
				
			||||||
        AsciiSPrint  (&Buf[Index], Size - Index, "[%a, #%a%]a", gReg[Rn], SIGN (Up), gReg[Rm], WRITE (Write));
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a, #%a%]a", gReg[Rn], SIGN (Up), gReg[Rm], WRITE (Write));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // Register offset/index
 | 
					      // Register offset/index
 | 
				
			||||||
      if (WriteBack) {
 | 
					      if (WriteBack) {
 | 
				
			||||||
        // A5.3.6 [<Rn>], #+/-<offset_8>
 | 
					        // A5.3.6 [<Rn>], #+/-<offset_8>
 | 
				
			||||||
        AsciiSPrint  (&Buf[Index], Size - Index, "[%a], #%a%d", gReg[Rn], SIGN (Up), Offset8);
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a%d", gReg[Rn], SIGN (Up), Offset8);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // A5.3.7 [<Rn>], +/-<Rm>
 | 
					        // A5.3.7 [<Rn>], +/-<Rm>
 | 
				
			||||||
        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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -370,16 +375,21 @@ DisassembleArmInstruction (
 | 
				
			|||||||
    if (((OpCode >> 6) & 0x7) == 0) {
 | 
					    if (((OpCode >> 6) & 0x7) == 0) {
 | 
				
			||||||
      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 (
 | 
				
			||||||
                      (IMod == 3) ? "ID":"IE",
 | 
					                Buf,
 | 
				
			||||||
                      ((OpCode & BIT8) != 0) ? "A":"",
 | 
					                Size,
 | 
				
			||||||
                      ((OpCode & BIT7) != 0) ? "I":"",
 | 
					                "CPS%a %a%a%a",
 | 
				
			||||||
                      ((OpCode & BIT6) != 0) ? "F":"");
 | 
					                (IMod == 3) ? "ID" : "IE",
 | 
				
			||||||
 | 
					                ((OpCode & BIT8) != 0) ? "A" : "",
 | 
				
			||||||
 | 
					                ((OpCode & BIT7) != 0) ? "I" : "",
 | 
				
			||||||
 | 
					                ((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,16 +405,16 @@ 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) {
 | 
				
			||||||
      // MSR{<cond>} CPSR_<fields>, #<immediate>
 | 
					      // MSR{<cond>} CPSR_<fields>, #<immediate>
 | 
				
			||||||
      AsciiSPrint (Buf, Size, "MRS%a %a_%a, #0x%x", COND (OpCode),  WriteBack ? "SPSR" : "CPSR", FieldMask ((OpCode >> 16) & 0xf), RotateRight (OpCode & 0xf, ((OpCode >> 8) & 0xf) *2));
 | 
					      AsciiSPrint (Buf, Size, "MRS%a %a_%a, #0x%x", COND (OpCode), WriteBack ? "SPSR" : "CPSR", FieldMask ((OpCode >> 16) & 0xf), RotateRight (OpCode & 0xf, ((OpCode >> 8) & 0xf) *2));
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // 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;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -417,35 +427,34 @@ DisassembleArmInstruction (
 | 
				
			|||||||
  if ((OpCode  & 0x0e000000) == 0x0c000000) {
 | 
					  if ((OpCode  & 0x0e000000) == 0x0c000000) {
 | 
				
			||||||
    // A4.1.19 LDC and A4.1.96 SDC
 | 
					    // A4.1.19 LDC and A4.1.96 SDC
 | 
				
			||||||
    if ((OpCode & 0xf0000000) == 0xf0000000) {
 | 
					    if ((OpCode & 0xf0000000) == 0xf0000000) {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "%a2 0x%x, CR%d, ", Load ? "LDC":"SDC", (OpCode >> 8) & 0xf, Rd);
 | 
					      Index = AsciiSPrint (Buf, Size, "%a2 0x%x, CR%d, ", Load ? "LDC" : "SDC", (OpCode >> 8) & 0xf, Rd);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      Index = AsciiSPrint (Buf, Size, "%a%a 0x%x, CR%d, ",  Load ? "LDC":"SDC", COND (OpCode), (OpCode >> 8) & 0xf, Rd);
 | 
					      Index = AsciiSPrint (Buf, Size, "%a%a 0x%x, CR%d, ", Load ? "LDC" : "SDC", COND (OpCode), (OpCode >> 8) & 0xf, Rd);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!Pre) {
 | 
					    if (!Pre) {
 | 
				
			||||||
      if (!Write) {
 | 
					      if (!Write) {
 | 
				
			||||||
        // A5.5.5.5 [<Rn>], <option>
 | 
					        // A5.5.5.5 [<Rn>], <option>
 | 
				
			||||||
      AsciiSPrint (&Buf[Index], Size - Index, "[%a], {0x%x}", gReg[Rn], OpCode & 0xff);
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a], {0x%x}", gReg[Rn], OpCode & 0xff);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        // A.5.5.4  [<Rn>], #+/-<offset_8>*4
 | 
					        // A.5.5.4  [<Rn>], #+/-<offset_8>*4
 | 
				
			||||||
      AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x*4", gReg[Rn], SIGN (Up), OpCode & 0xff);
 | 
					        AsciiSPrint (&Buf[Index], Size - Index, "[%a], #%a0x%x*4", gReg[Rn], SIGN (Up), OpCode & 0xff);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      // 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) {
 | 
				
			||||||
    // A4.1.32 MRC2, MCR2
 | 
					    // A4.1.32 MRC2, MCR2
 | 
				
			||||||
    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, CR%d, CR%d, 0x%x", Load ? "MRC":"MCR", COND (OpCode), (OpCode >> 8) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], Rn, Rm, (OpCode >> 5) &0x7);
 | 
					    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, CR%d, CR%d, 0x%x", Load ? "MRC" : "MCR", COND (OpCode), (OpCode >> 8) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], Rn, Rm, (OpCode >> 5) &0x7);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((OpCode  & 0x0ff00000) == 0x0c400000) {
 | 
					  if ((OpCode  & 0x0ff00000) == 0x0c400000) {
 | 
				
			||||||
    // A4.1.33 MRRC2, MCRR2
 | 
					    // A4.1.33 MRRC2, MCRR2
 | 
				
			||||||
    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, %a, CR%d", Load ? "MRRC":"MCRR", COND (OpCode), (OpCode >> 4) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], gReg[Rn], Rm);
 | 
					    AsciiSPrint (Buf, Size, "%a%a 0x%x, 0x%x, %a, %a, CR%d", Load ? "MRRC" : "MCRR", COND (OpCode), (OpCode >> 4) & 0xf, (OpCode >> 20) & 0xf, gReg[Rd], gReg[Rn], Rm);
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -454,4 +463,3 @@ DisassembleArmInstruction (
 | 
				
			|||||||
  *OpCodePtr += 1;
 | 
					  *OpCodePtr += 1;
 | 
				
			||||||
  return;
 | 
					  return;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -14,39 +14,39 @@
 | 
				
			|||||||
#include <Library/MemoryAllocationLib.h>
 | 
					#include <Library/MemoryAllocationLib.h>
 | 
				
			||||||
#include <Protocol/DebugSupport.h> // for MAX_AARCH64_EXCEPTION
 | 
					#include <Protocol/DebugSupport.h> // for MAX_AARCH64_EXCEPTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN                   gMaxExceptionNumber = MAX_AARCH64_EXCEPTION;
 | 
					UINTN                   gMaxExceptionNumber                                   = MAX_AARCH64_EXCEPTION;
 | 
				
			||||||
EFI_EXCEPTION_CALLBACK  gExceptionHandlers[MAX_AARCH64_EXCEPTION + 1] = { 0 };
 | 
					EFI_EXCEPTION_CALLBACK  gExceptionHandlers[MAX_AARCH64_EXCEPTION + 1]         = { 0 };
 | 
				
			||||||
EFI_EXCEPTION_CALLBACK  gDebuggerExceptionHandlers[MAX_AARCH64_EXCEPTION + 1] = { 0 };
 | 
					EFI_EXCEPTION_CALLBACK  gDebuggerExceptionHandlers[MAX_AARCH64_EXCEPTION + 1] = { 0 };
 | 
				
			||||||
PHYSICAL_ADDRESS        gExceptionVectorAlignmentMask = ARM_VECTOR_TABLE_ALIGNMENT;
 | 
					PHYSICAL_ADDRESS        gExceptionVectorAlignmentMask                         = ARM_VECTOR_TABLE_ALIGNMENT;
 | 
				
			||||||
UINTN                   gDebuggerNoHandlerValue = 0; // todo: define for AArch64
 | 
					UINTN                   gDebuggerNoHandlerValue                               = 0; // todo: define for AArch64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EL0_STACK_SIZE  EFI_PAGES_TO_SIZE(2)
 | 
					#define EL0_STACK_SIZE  EFI_PAGES_TO_SIZE(2)
 | 
				
			||||||
STATIC UINTN mNewStackBase[EL0_STACK_SIZE / sizeof (UINTN)];
 | 
					STATIC UINTN  mNewStackBase[EL0_STACK_SIZE / sizeof (UINTN)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
RegisterEl0Stack (
 | 
					RegisterEl0Stack (
 | 
				
			||||||
  IN  VOID    *Stack
 | 
					  IN  VOID  *Stack
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
ArchVectorConfig (
 | 
					ArchVectorConfig (
 | 
				
			||||||
  IN  UINTN       VectorBaseAddress
 | 
					  IN  UINTN  VectorBaseAddress
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN             HcrReg;
 | 
					  UINTN  HcrReg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Round down sp by 16 bytes alignment
 | 
					  // Round down sp by 16 bytes alignment
 | 
				
			||||||
  RegisterEl0Stack (
 | 
					  RegisterEl0Stack (
 | 
				
			||||||
    (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL)
 | 
					    (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL)
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (ArmReadCurrentEL() == AARCH64_EL2) {
 | 
					  if (ArmReadCurrentEL () == AARCH64_EL2) {
 | 
				
			||||||
    HcrReg = ArmReadHcr();
 | 
					    HcrReg = ArmReadHcr ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Trap General Exceptions. All exceptions that would be routed to EL1 are routed to EL2
 | 
					    // Trap General Exceptions. All exceptions that would be routed to EL1 are routed to EL2
 | 
				
			||||||
    HcrReg |= ARM_HCR_TGE;
 | 
					    HcrReg |= ARM_HCR_TGE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ArmWriteHcr(HcrReg);
 | 
					    ArmWriteHcr (HcrReg);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,28 +17,27 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <Protocol/DebugSupport.h> // for MAX_ARM_EXCEPTION
 | 
					#include <Protocol/DebugSupport.h> // for MAX_ARM_EXCEPTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN                   gMaxExceptionNumber = MAX_ARM_EXCEPTION;
 | 
					UINTN                   gMaxExceptionNumber                               = MAX_ARM_EXCEPTION;
 | 
				
			||||||
EFI_EXCEPTION_CALLBACK  gExceptionHandlers[MAX_ARM_EXCEPTION + 1] = { 0 };
 | 
					EFI_EXCEPTION_CALLBACK  gExceptionHandlers[MAX_ARM_EXCEPTION + 1]         = { 0 };
 | 
				
			||||||
EFI_EXCEPTION_CALLBACK  gDebuggerExceptionHandlers[MAX_ARM_EXCEPTION + 1] = { 0 };
 | 
					EFI_EXCEPTION_CALLBACK  gDebuggerExceptionHandlers[MAX_ARM_EXCEPTION + 1] = { 0 };
 | 
				
			||||||
PHYSICAL_ADDRESS        gExceptionVectorAlignmentMask = ARM_VECTOR_TABLE_ALIGNMENT;
 | 
					PHYSICAL_ADDRESS        gExceptionVectorAlignmentMask                     = ARM_VECTOR_TABLE_ALIGNMENT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Exception handler contains branch to vector location (jmp $) so no handler
 | 
					// Exception handler contains branch to vector location (jmp $) so no handler
 | 
				
			||||||
// NOTE: This code assumes vectors are ARM and not Thumb code
 | 
					// NOTE: This code assumes vectors are ARM and not Thumb code
 | 
				
			||||||
UINTN                   gDebuggerNoHandlerValue = 0xEAFFFFFE;
 | 
					UINTN  gDebuggerNoHandlerValue = 0xEAFFFFFE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
ArchVectorConfig (
 | 
					ArchVectorConfig (
 | 
				
			||||||
  IN  UINTN       VectorBaseAddress
 | 
					  IN  UINTN  VectorBaseAddress
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // if the vector address corresponds to high vectors
 | 
					  // if the vector address corresponds to high vectors
 | 
				
			||||||
  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 ();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,37 +22,38 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
CopyExceptionHandlers(
 | 
					CopyExceptionHandlers (
 | 
				
			||||||
  IN  PHYSICAL_ADDRESS        BaseAddress
 | 
					  IN  PHYSICAL_ADDRESS  BaseAddress
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
RegisterExceptionHandler(
 | 
					RegisterExceptionHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE            ExceptionType,
 | 
					  IN EFI_EXCEPTION_TYPE         ExceptionType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER  InterruptHandler
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ExceptionHandlersStart(
 | 
					ExceptionHandlersStart (
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
ExceptionHandlersEnd(
 | 
					ExceptionHandlersEnd (
 | 
				
			||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS ArchVectorConfig(
 | 
					RETURN_STATUS
 | 
				
			||||||
  IN  UINTN       VectorBaseAddress
 | 
					ArchVectorConfig (
 | 
				
			||||||
 | 
					  IN  UINTN  VectorBaseAddress
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// these globals are provided by the architecture specific source (Arm or AArch64)
 | 
					// these globals are provided by the architecture specific source (Arm or AArch64)
 | 
				
			||||||
extern UINTN                    gMaxExceptionNumber;
 | 
					extern UINTN                   gMaxExceptionNumber;
 | 
				
			||||||
extern EFI_EXCEPTION_CALLBACK   gExceptionHandlers[];
 | 
					extern EFI_EXCEPTION_CALLBACK  gExceptionHandlers[];
 | 
				
			||||||
extern EFI_EXCEPTION_CALLBACK   gDebuggerExceptionHandlers[];
 | 
					extern EFI_EXCEPTION_CALLBACK  gDebuggerExceptionHandlers[];
 | 
				
			||||||
extern PHYSICAL_ADDRESS         gExceptionVectorAlignmentMask;
 | 
					extern PHYSICAL_ADDRESS        gExceptionVectorAlignmentMask;
 | 
				
			||||||
extern UINTN                    gDebuggerNoHandlerValue;
 | 
					extern UINTN                   gDebuggerNoHandlerValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// A compiler flag adjusts the compilation of this library to a variant where
 | 
					// A compiler flag adjusts the compilation of this library to a variant where
 | 
				
			||||||
// the vectors are relocated (copied) to another location versus using the
 | 
					// the vectors are relocated (copied) to another location versus using the
 | 
				
			||||||
@@ -60,13 +61,12 @@ extern UINTN                    gDebuggerNoHandlerValue;
 | 
				
			|||||||
// address this at library build time.  Since this affects the build of the
 | 
					// address this at library build time.  Since this affects the build of the
 | 
				
			||||||
// library we cannot represent this in a PCD since PCDs are evaluated on
 | 
					// library we cannot represent this in a PCD since PCDs are evaluated on
 | 
				
			||||||
// a per-module basis.
 | 
					// a per-module basis.
 | 
				
			||||||
#if defined(ARM_RELOCATE_VECTORS)
 | 
					#if defined (ARM_RELOCATE_VECTORS)
 | 
				
			||||||
STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;
 | 
					STATIC CONST BOOLEAN  gArmRelocateVectorTable = TRUE;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,23 +85,21 @@ with default exception handlers.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InitializeCpuExceptionHandlers(
 | 
					InitializeCpuExceptionHandlers (
 | 
				
			||||||
  IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL
 | 
					  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  RETURN_STATUS     Status;
 | 
					  RETURN_STATUS  Status;
 | 
				
			||||||
  UINTN             VectorBase;
 | 
					  UINTN          VectorBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Status = EFI_SUCCESS;
 | 
					  Status = EFI_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 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,
 | 
				
			||||||
@@ -110,7 +108,7 @@ InitializeCpuExceptionHandlers(
 | 
				
			|||||||
    // for AArch64 Align=4K is required.  Align=Auto can be used but this
 | 
					    // for AArch64 Align=4K is required.  Align=Auto can be used but this
 | 
				
			||||||
    // is known to cause an issue with populating the reset vector area
 | 
					    // is known to cause an issue with populating the reset vector area
 | 
				
			||||||
    // for encapsulated FVs.
 | 
					    // for encapsulated FVs.
 | 
				
			||||||
    ASSERT(((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0);
 | 
					    ASSERT (((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // We do not copy the Exception Table at PcdGet64(PcdCpuVectorBaseAddress). We just set Vector
 | 
					    // We do not copy the Exception Table at PcdGet64(PcdCpuVectorBaseAddress). We just set Vector
 | 
				
			||||||
    // Base Address to point into CpuDxe code.
 | 
					    // Base Address to point into CpuDxe code.
 | 
				
			||||||
@@ -119,12 +117,12 @@ InitializeCpuExceptionHandlers(
 | 
				
			|||||||
    Status = RETURN_SUCCESS;
 | 
					    Status = RETURN_SUCCESS;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!RETURN_ERROR(Status)) {
 | 
					  if (!RETURN_ERROR (Status)) {
 | 
				
			||||||
    // call the architecture-specific routine to prepare for the new vector
 | 
					    // call the architecture-specific routine to prepare for the new vector
 | 
				
			||||||
    // configuration to take effect
 | 
					    // configuration to take effect
 | 
				
			||||||
    ArchVectorConfig(VectorBase);
 | 
					    ArchVectorConfig (VectorBase);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ArmWriteVBar(VectorBase);
 | 
					    ArmWriteVBar (VectorBase);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
@@ -148,14 +146,14 @@ with default exception handlers.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
STATIC
 | 
					STATIC
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
CopyExceptionHandlers(
 | 
					CopyExceptionHandlers (
 | 
				
			||||||
  IN  PHYSICAL_ADDRESS        BaseAddress
 | 
					  IN  PHYSICAL_ADDRESS  BaseAddress
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  RETURN_STATUS        Status;
 | 
					  RETURN_STATUS  Status;
 | 
				
			||||||
  UINTN                Length;
 | 
					  UINTN          Length;
 | 
				
			||||||
  UINTN                Index;
 | 
					  UINTN          Index;
 | 
				
			||||||
  UINT32               *VectorBase;
 | 
					  UINT32         *VectorBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // ensure that the destination value specifies an address meeting the vector alignment requirements
 | 
					  // ensure that the destination value specifies an address meeting the vector alignment requirements
 | 
				
			||||||
  ASSERT ((BaseAddress & gExceptionVectorAlignmentMask) == 0);
 | 
					  ASSERT ((BaseAddress & gExceptionVectorAlignmentMask) == 0);
 | 
				
			||||||
@@ -167,37 +165,35 @@ CopyExceptionHandlers(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  VectorBase = (UINT32 *)(UINTN)BaseAddress;
 | 
					  VectorBase = (UINT32 *)(UINTN)BaseAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (FeaturePcdGet(PcdDebuggerExceptionSupport) == TRUE) {
 | 
					  if (FeaturePcdGet (PcdDebuggerExceptionSupport) == TRUE) {
 | 
				
			||||||
    // Save existing vector table, in case debugger is already hooked in
 | 
					    // Save existing vector table, in case debugger is already hooked in
 | 
				
			||||||
    CopyMem((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (EFI_EXCEPTION_CALLBACK)* (gMaxExceptionNumber+1));
 | 
					    CopyMem ((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (EFI_EXCEPTION_CALLBACK)* (gMaxExceptionNumber+1));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Copy our assembly code into the page that contains the exception vectors.
 | 
					  // Copy our assembly code into the page that contains the exception vectors.
 | 
				
			||||||
  CopyMem((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length);
 | 
					  CopyMem ((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  // Initialize the C entry points for interrupts
 | 
					  // Initialize the C entry points for interrupts
 | 
				
			||||||
  //
 | 
					  //
 | 
				
			||||||
  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];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Flush Caches since we updated executable stuff
 | 
					  // Flush Caches since we updated executable stuff
 | 
				
			||||||
  InvalidateInstructionCacheRange((VOID *)(UINTN)BaseAddress, Length);
 | 
					  InvalidateInstructionCacheRange ((VOID *)(UINTN)BaseAddress, Length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return RETURN_SUCCESS;
 | 
					  return RETURN_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
 | 
					Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -216,9 +212,9 @@ with default interrupt/exception handlers.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InitializeCpuInterruptHandlers(
 | 
					InitializeCpuInterruptHandlers (
 | 
				
			||||||
IN EFI_VECTOR_HANDOFF_INFO       *VectorInfo OPTIONAL
 | 
					  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL
 | 
				
			||||||
)
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // not needed, this is what the CPU driver is for
 | 
					  // not needed, this is what the CPU driver is for
 | 
				
			||||||
  return EFI_UNSUPPORTED;
 | 
					  return EFI_UNSUPPORTED;
 | 
				
			||||||
@@ -250,9 +246,9 @@ previously installed.
 | 
				
			|||||||
or this function is not supported.
 | 
					or this function is not supported.
 | 
				
			||||||
**/
 | 
					**/
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
RegisterCpuInterruptHandler(
 | 
					RegisterCpuInterruptHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE             ExceptionType,
 | 
					  IN EFI_EXCEPTION_TYPE         ExceptionType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER      ExceptionHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER  ExceptionHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (ExceptionType > gMaxExceptionNumber) {
 | 
					  if (ExceptionType > gMaxExceptionNumber) {
 | 
				
			||||||
@@ -287,19 +283,19 @@ If this parameter is NULL, then the handler will be uninstalled.
 | 
				
			|||||||
**/
 | 
					**/
 | 
				
			||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
RegisterExceptionHandler(
 | 
					RegisterExceptionHandler (
 | 
				
			||||||
  IN EFI_EXCEPTION_TYPE            ExceptionType,
 | 
					  IN EFI_EXCEPTION_TYPE         ExceptionType,
 | 
				
			||||||
  IN EFI_CPU_INTERRUPT_HANDLER     InterruptHandler
 | 
					  IN EFI_CPU_INTERRUPT_HANDLER  InterruptHandler
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return RegisterCpuInterruptHandler(ExceptionType, InterruptHandler);
 | 
					  return RegisterCpuInterruptHandler (ExceptionType, InterruptHandler);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
CommonCExceptionHandler(
 | 
					CommonCExceptionHandler (
 | 
				
			||||||
  IN     EFI_EXCEPTION_TYPE           ExceptionType,
 | 
					  IN     EFI_EXCEPTION_TYPE  ExceptionType,
 | 
				
			||||||
  IN OUT EFI_SYSTEM_CONTEXT           SystemContext
 | 
					  IN OUT EFI_SYSTEM_CONTEXT  SystemContext
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  if (ExceptionType <= gMaxExceptionNumber) {
 | 
					  if (ExceptionType <= gMaxExceptionNumber) {
 | 
				
			||||||
@@ -307,13 +303,12 @@ 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);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  DefaultExceptionHandler(ExceptionType, SystemContext);
 | 
					  DefaultExceptionHandler (ExceptionType, SystemContext);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -341,10 +336,9 @@ CommonCExceptionHandler(
 | 
				
			|||||||
EFI_STATUS
 | 
					EFI_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
InitializeCpuExceptionHandlersEx (
 | 
					InitializeCpuExceptionHandlersEx (
 | 
				
			||||||
  IN EFI_VECTOR_HANDOFF_INFO            *VectorInfo OPTIONAL,
 | 
					  IN EFI_VECTOR_HANDOFF_INFO  *VectorInfo OPTIONAL,
 | 
				
			||||||
  IN CPU_EXCEPTION_INIT_DATA            *InitData OPTIONAL
 | 
					  IN CPU_EXCEPTION_INIT_DATA  *InitData OPTIONAL
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return InitializeCpuExceptionHandlers (VectorInfo);
 | 
					  return InitializeCpuExceptionHandlers (VectorInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,9 +16,9 @@ ArmGenericTimerEnableTimer (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN TimerCtrlReg;
 | 
					  UINTN  TimerCtrlReg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TimerCtrlReg = ArmReadCntpCtl ();
 | 
					  TimerCtrlReg  = ArmReadCntpCtl ();
 | 
				
			||||||
  TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
  ArmWriteCntpCtl (TimerCtrlReg);
 | 
					  ArmWriteCntpCtl (TimerCtrlReg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -37,9 +37,9 @@ ArmGenericTimerDisableTimer (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN TimerCtrlReg;
 | 
					  UINTN  TimerCtrlReg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TimerCtrlReg = ArmReadCntpCtl ();
 | 
					  TimerCtrlReg  = ArmReadCntpCtl ();
 | 
				
			||||||
  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
  ArmWriteCntpCtl (TimerCtrlReg);
 | 
					  ArmWriteCntpCtl (TimerCtrlReg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -71,11 +71,10 @@ ArmGenericTimerGetTimerVal (
 | 
				
			|||||||
  return ArmReadCntpTval ();
 | 
					  return ArmReadCntpTval ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerVal (
 | 
					ArmGenericTimerSetTimerVal (
 | 
				
			||||||
  IN   UINTN   Value
 | 
					  IN   UINTN  Value
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteCntpTval (Value);
 | 
					  ArmWriteCntpTval (Value);
 | 
				
			||||||
@@ -102,7 +101,7 @@ ArmGenericTimerGetTimerCtrlReg (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerCtrlReg (
 | 
					ArmGenericTimerSetTimerCtrlReg (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteCntpCtl (Value);
 | 
					  ArmWriteCntpCtl (Value);
 | 
				
			||||||
@@ -120,7 +119,7 @@ ArmGenericTimerGetCompareVal (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetCompareVal (
 | 
					ArmGenericTimerSetCompareVal (
 | 
				
			||||||
  IN   UINT64   Value
 | 
					  IN   UINT64  Value
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteCntpCval (Value);
 | 
					  ArmWriteCntpCval (Value);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,9 +16,9 @@ ArmGenericTimerEnableTimer (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN TimerCtrlReg;
 | 
					  UINTN  TimerCtrlReg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TimerCtrlReg = ArmReadCntvCtl ();
 | 
					  TimerCtrlReg  = ArmReadCntvCtl ();
 | 
				
			||||||
  TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
  ArmWriteCntvCtl (TimerCtrlReg);
 | 
					  ArmWriteCntvCtl (TimerCtrlReg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -37,9 +37,9 @@ ArmGenericTimerDisableTimer (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN TimerCtrlReg;
 | 
					  UINTN  TimerCtrlReg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  TimerCtrlReg = ArmReadCntvCtl ();
 | 
					  TimerCtrlReg  = ArmReadCntvCtl ();
 | 
				
			||||||
  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
 | 
					  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
 | 
				
			||||||
  ArmWriteCntvCtl (TimerCtrlReg);
 | 
					  ArmWriteCntvCtl (TimerCtrlReg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -71,11 +71,10 @@ ArmGenericTimerGetTimerVal (
 | 
				
			|||||||
  return ArmReadCntvTval ();
 | 
					  return ArmReadCntvTval ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerVal (
 | 
					ArmGenericTimerSetTimerVal (
 | 
				
			||||||
  IN   UINTN   Value
 | 
					  IN   UINTN  Value
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteCntvTval (Value);
 | 
					  ArmWriteCntvTval (Value);
 | 
				
			||||||
@@ -102,7 +101,7 @@ ArmGenericTimerGetTimerCtrlReg (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetTimerCtrlReg (
 | 
					ArmGenericTimerSetTimerCtrlReg (
 | 
				
			||||||
  UINTN Value
 | 
					  UINTN  Value
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteCntvCtl (Value);
 | 
					  ArmWriteCntvCtl (Value);
 | 
				
			||||||
@@ -120,7 +119,7 @@ ArmGenericTimerGetCompareVal (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmGenericTimerSetCompareVal (
 | 
					ArmGenericTimerSetCompareVal (
 | 
				
			||||||
  IN   UINT64   Value
 | 
					  IN   UINT64  Value
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  ArmWriteCntvCval (Value);
 | 
					  ArmWriteCntvCval (Value);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
#include <Library/ArmLib.h>
 | 
					#include <Library/ArmLib.h>
 | 
				
			||||||
#include <Library/ArmGicLib.h>
 | 
					#include <Library/ArmGicLib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC ARM_GIC_ARCH_REVISION        mGicArchRevision;
 | 
					STATIC ARM_GIC_ARCH_REVISION  mGicArchRevision;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RETURN_STATUS
 | 
					RETURN_STATUS
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
@@ -17,7 +17,7 @@ ArmGicArchLibInitialize (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32    IccSre;
 | 
					  UINT32  IccSre;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Ideally we would like to use the GICC IIDR Architecture version here, but
 | 
					  // Ideally we would like to use the GICC IIDR Architecture version here, but
 | 
				
			||||||
  // this does not seem to be very reliable as the implementation could easily
 | 
					  // this does not seem to be very reliable as the implementation could easily
 | 
				
			||||||
@@ -38,6 +38,7 @@ ArmGicArchLibInitialize (
 | 
				
			|||||||
      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
					      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
				
			||||||
      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
					      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
					    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
				
			||||||
      mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
 | 
					      mGicArchRevision = ARM_GIC_ARCH_REVISION_3;
 | 
				
			||||||
      goto Done;
 | 
					      goto Done;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ ArmGicGetSupportedArchRevision (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINT32    IccSre;
 | 
					  UINT32  IccSre;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Ideally we would like to use the GICC IIDR Architecture version here, but
 | 
					  // Ideally we would like to use the GICC IIDR Architecture version here, but
 | 
				
			||||||
  // this does not seem to be very reliable as the implementation could easily
 | 
					  // this does not seem to be very reliable as the implementation could easily
 | 
				
			||||||
@@ -36,6 +36,7 @@ ArmGicGetSupportedArchRevision (
 | 
				
			|||||||
      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
					      ArmGicV3SetControlSystemRegisterEnable (IccSre | ICC_SRE_EL2_SRE);
 | 
				
			||||||
      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
					      IccSre = ArmGicV3GetControlSystemRegisterEnable ();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
					    if (IccSre & ICC_SRE_EL2_SRE) {
 | 
				
			||||||
      return ARM_GIC_ARCH_REVISION_3;
 | 
					      return ARM_GIC_ARCH_REVISION_3;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,10 +23,10 @@ AArch64DataCacheOperation (
 | 
				
			|||||||
  IN  AARCH64_CACHE_OPERATION  DataCacheOperation
 | 
					  IN  AARCH64_CACHE_OPERATION  DataCacheOperation
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN     SavedInterruptState;
 | 
					  UINTN  SavedInterruptState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SavedInterruptState = ArmGetInterruptState ();
 | 
					  SavedInterruptState = ArmGetInterruptState ();
 | 
				
			||||||
  ArmDisableInterrupts();
 | 
					  ArmDisableInterrupts ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AArch64AllDataCachesOperation (DataCacheOperation);
 | 
					  AArch64AllDataCachesOperation (DataCacheOperation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -99,7 +99,7 @@ ArmHasCcidx (
 | 
				
			|||||||
  VOID
 | 
					  VOID
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  UINTN Mmfr2;
 | 
					  UINTN  Mmfr2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Mmfr2 = ArmReadIdAA64Mmfr2 ();
 | 
					  Mmfr2 = ArmReadIdAA64Mmfr2 ();
 | 
				
			||||||
  return (((Mmfr2 >> 20) & 0xF) == 1) ? TRUE : FALSE;
 | 
					  return (((Mmfr2 >> 20) & 0xF) == 1) ? TRUE : FALSE;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,9 @@
 | 
				
			|||||||
#ifndef AARCH64_LIB_H_
 | 
					#ifndef AARCH64_LIB_H_
 | 
				
			||||||
#define AARCH64_LIB_H_
 | 
					#define AARCH64_LIB_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef VOID (*AARCH64_CACHE_OPERATION)(UINTN);
 | 
					typedef VOID (*AARCH64_CACHE_OPERATION)(
 | 
				
			||||||
 | 
					  UINTN
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VOID
 | 
					VOID
 | 
				
			||||||
AArch64AllDataCachesOperation (
 | 
					AArch64AllDataCachesOperation (
 | 
				
			||||||
@@ -33,7 +35,7 @@ ArmCleanDataCacheEntryBySetWay (
 | 
				
			|||||||
VOID
 | 
					VOID
 | 
				
			||||||
EFIAPI
 | 
					EFIAPI
 | 
				
			||||||
ArmCleanInvalidateDataCacheEntryBySetWay (
 | 
					ArmCleanInvalidateDataCacheEntryBySetWay (
 | 
				
			||||||
  IN  UINTN   SetWayFormat
 | 
					  IN  UINTN  SetWayFormat
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
UINTN
 | 
					UINTN
 | 
				
			||||||
@@ -53,4 +55,3 @@ ArmReadIdAA64Mmfr2 (
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // AARCH64_LIB_H_
 | 
					#endif // AARCH64_LIB_H_
 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user