]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c
Append the terminating null character at the end of the string to avoid buffer overflow.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Pci.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for Pci shell Debug1 function.\r
3\r
f056e4c1 4 (C) Copyright 2013-2014 Hewlett-Packard Development Company, L.P.\r
705bffb5 5 Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>\r
5d73d92f 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellDebug1CommandsLib.h"\r
17#include <Protocol/PciRootBridgeIo.h>\r
18#include <Library/ShellLib.h>\r
19#include <IndustryStandard/Pci.h>\r
20#include <IndustryStandard/Acpi.h>\r
21#include "Pci.h"\r
22\r
5d73d92f 23//\r
24// Printable strings for Pci class code\r
25//\r
26typedef struct {\r
27 CHAR16 *BaseClass; // Pointer to the PCI base class string\r
28 CHAR16 *SubClass; // Pointer to the PCI sub class string\r
29 CHAR16 *PIFClass; // Pointer to the PCI programming interface string\r
30} PCI_CLASS_STRINGS;\r
31\r
32//\r
33// a structure holding a single entry, which also points to its lower level\r
34// class\r
35//\r
36typedef struct PCI_CLASS_ENTRY_TAG {\r
37 UINT8 Code; // Class, subclass or I/F code\r
38 CHAR16 *DescText; // Description string\r
39 struct PCI_CLASS_ENTRY_TAG *LowerLevelClass; // Subclass or I/F if any\r
40} PCI_CLASS_ENTRY;\r
41\r
42//\r
43// Declarations of entries which contain printable strings for class codes\r
44// in PCI configuration space\r
45//\r
46PCI_CLASS_ENTRY PCIBlankEntry[];\r
47PCI_CLASS_ENTRY PCISubClass_00[];\r
48PCI_CLASS_ENTRY PCISubClass_01[];\r
49PCI_CLASS_ENTRY PCISubClass_02[];\r
50PCI_CLASS_ENTRY PCISubClass_03[];\r
51PCI_CLASS_ENTRY PCISubClass_04[];\r
52PCI_CLASS_ENTRY PCISubClass_05[];\r
53PCI_CLASS_ENTRY PCISubClass_06[];\r
54PCI_CLASS_ENTRY PCISubClass_07[];\r
55PCI_CLASS_ENTRY PCISubClass_08[];\r
56PCI_CLASS_ENTRY PCISubClass_09[];\r
57PCI_CLASS_ENTRY PCISubClass_0a[];\r
58PCI_CLASS_ENTRY PCISubClass_0b[];\r
59PCI_CLASS_ENTRY PCISubClass_0c[];\r
60PCI_CLASS_ENTRY PCISubClass_0d[];\r
61PCI_CLASS_ENTRY PCISubClass_0e[];\r
62PCI_CLASS_ENTRY PCISubClass_0f[];\r
63PCI_CLASS_ENTRY PCISubClass_10[];\r
64PCI_CLASS_ENTRY PCISubClass_11[];\r
f056e4c1
JC
65PCI_CLASS_ENTRY PCISubClass_12[];\r
66PCI_CLASS_ENTRY PCISubClass_13[];\r
67PCI_CLASS_ENTRY PCIPIFClass_0100[];\r
5d73d92f 68PCI_CLASS_ENTRY PCIPIFClass_0101[];\r
f056e4c1
JC
69PCI_CLASS_ENTRY PCIPIFClass_0105[];\r
70PCI_CLASS_ENTRY PCIPIFClass_0106[];\r
71PCI_CLASS_ENTRY PCIPIFClass_0107[];\r
72PCI_CLASS_ENTRY PCIPIFClass_0108[];\r
73PCI_CLASS_ENTRY PCIPIFClass_0109[];\r
5d73d92f 74PCI_CLASS_ENTRY PCIPIFClass_0300[];\r
75PCI_CLASS_ENTRY PCIPIFClass_0604[];\r
f056e4c1
JC
76PCI_CLASS_ENTRY PCIPIFClass_0609[];\r
77PCI_CLASS_ENTRY PCIPIFClass_060b[];\r
5d73d92f 78PCI_CLASS_ENTRY PCIPIFClass_0700[];\r
79PCI_CLASS_ENTRY PCIPIFClass_0701[];\r
80PCI_CLASS_ENTRY PCIPIFClass_0703[];\r
81PCI_CLASS_ENTRY PCIPIFClass_0800[];\r
82PCI_CLASS_ENTRY PCIPIFClass_0801[];\r
83PCI_CLASS_ENTRY PCIPIFClass_0802[];\r
84PCI_CLASS_ENTRY PCIPIFClass_0803[];\r
85PCI_CLASS_ENTRY PCIPIFClass_0904[];\r
86PCI_CLASS_ENTRY PCIPIFClass_0c00[];\r
87PCI_CLASS_ENTRY PCIPIFClass_0c03[];\r
f056e4c1
JC
88PCI_CLASS_ENTRY PCIPIFClass_0c07[];\r
89PCI_CLASS_ENTRY PCIPIFClass_0d01[];\r
5d73d92f 90PCI_CLASS_ENTRY PCIPIFClass_0e00[];\r
91\r
92//\r
93// Base class strings entries\r
94//\r
95PCI_CLASS_ENTRY gClassStringList[] = {\r
96 {\r
97 0x00,\r
98 L"Pre 2.0 device",\r
99 PCISubClass_00\r
100 },\r
101 {\r
102 0x01,\r
103 L"Mass Storage Controller",\r
104 PCISubClass_01\r
105 },\r
106 {\r
107 0x02,\r
108 L"Network Controller",\r
109 PCISubClass_02\r
110 },\r
111 {\r
112 0x03,\r
113 L"Display Controller",\r
114 PCISubClass_03\r
115 },\r
116 {\r
117 0x04,\r
118 L"Multimedia Device",\r
119 PCISubClass_04\r
120 },\r
121 {\r
122 0x05,\r
123 L"Memory Controller",\r
124 PCISubClass_05\r
125 },\r
126 {\r
127 0x06,\r
128 L"Bridge Device",\r
129 PCISubClass_06\r
130 },\r
131 {\r
132 0x07,\r
133 L"Simple Communications Controllers",\r
134 PCISubClass_07\r
135 },\r
136 {\r
137 0x08,\r
138 L"Base System Peripherals",\r
139 PCISubClass_08\r
140 },\r
141 {\r
142 0x09,\r
143 L"Input Devices",\r
144 PCISubClass_09\r
145 },\r
146 {\r
147 0x0a,\r
148 L"Docking Stations",\r
149 PCISubClass_0a\r
150 },\r
151 {\r
152 0x0b,\r
153 L"Processors",\r
154 PCISubClass_0b\r
155 },\r
156 {\r
157 0x0c,\r
158 L"Serial Bus Controllers",\r
159 PCISubClass_0c\r
160 },\r
161 {\r
162 0x0d,\r
163 L"Wireless Controllers",\r
164 PCISubClass_0d\r
165 },\r
166 {\r
167 0x0e,\r
168 L"Intelligent IO Controllers",\r
169 PCISubClass_0e\r
170 },\r
171 {\r
172 0x0f,\r
173 L"Satellite Communications Controllers",\r
174 PCISubClass_0f\r
175 },\r
176 {\r
177 0x10,\r
178 L"Encryption/Decryption Controllers",\r
179 PCISubClass_10\r
180 },\r
181 {\r
182 0x11,\r
183 L"Data Acquisition & Signal Processing Controllers",\r
184 PCISubClass_11\r
185 },\r
f056e4c1
JC
186 {\r
187 0x12,\r
188 L"Processing Accelerators",\r
189 PCISubClass_12\r
190 },\r
191 {\r
192 0x13,\r
193 L"Non-Essential Instrumentation",\r
194 PCISubClass_13\r
195 },\r
5d73d92f 196 {\r
197 0xff,\r
198 L"Device does not fit in any defined classes",\r
199 PCIBlankEntry\r
200 },\r
201 {\r
202 0x00,\r
203 NULL,\r
204 /* null string ends the list */NULL\r
205 }\r
206};\r
207\r
208//\r
209// Subclass strings entries\r
210//\r
211PCI_CLASS_ENTRY PCIBlankEntry[] = {\r
212 {\r
213 0x00,\r
214 L"",\r
215 PCIBlankEntry\r
216 },\r
217 {\r
218 0x00,\r
219 NULL,\r
220 /* null string ends the list */NULL\r
221 }\r
222};\r
223\r
224PCI_CLASS_ENTRY PCISubClass_00[] = {\r
225 {\r
226 0x00,\r
227 L"All devices other than VGA",\r
228 PCIBlankEntry\r
229 },\r
230 {\r
231 0x01,\r
232 L"VGA-compatible devices",\r
233 PCIBlankEntry\r
234 },\r
235 {\r
236 0x00,\r
237 NULL,\r
238 /* null string ends the list */NULL\r
239 }\r
240};\r
241\r
242PCI_CLASS_ENTRY PCISubClass_01[] = {\r
243 {\r
244 0x00,\r
f056e4c1
JC
245 L"SCSI",\r
246 PCIPIFClass_0100\r
5d73d92f 247 },\r
248 {\r
249 0x01,\r
250 L"IDE controller",\r
251 PCIPIFClass_0101\r
252 },\r
253 {\r
254 0x02,\r
255 L"Floppy disk controller",\r
256 PCIBlankEntry\r
257 },\r
258 {\r
259 0x03,\r
260 L"IPI controller",\r
261 PCIBlankEntry\r
262 },\r
263 {\r
264 0x04,\r
265 L"RAID controller",\r
266 PCIBlankEntry\r
267 },\r
f056e4c1
JC
268 {\r
269 0x05,\r
270 L"ATA controller with ADMA interface",\r
271 PCIPIFClass_0105\r
272 },\r
273 {\r
274 0x06,\r
275 L"Serial ATA controller",\r
276 PCIPIFClass_0106\r
277 },\r
278 {\r
279 0x07,\r
280 L"Serial Attached SCSI (SAS) controller ",\r
281 PCIPIFClass_0107\r
282 },\r
283 {\r
284 0x08,\r
285 L"Non-volatile memory subsystem",\r
286 PCIPIFClass_0108\r
287 },\r
288 {\r
289 0x09,\r
290 L"Universal Flash Storage (UFS) controller ",\r
291 PCIPIFClass_0109\r
292 },\r
5d73d92f 293 {\r
294 0x80,\r
295 L"Other mass storage controller",\r
296 PCIBlankEntry\r
297 },\r
298 {\r
299 0x00,\r
300 NULL,\r
301 /* null string ends the list */NULL\r
302 }\r
303};\r
304\r
305PCI_CLASS_ENTRY PCISubClass_02[] = {\r
306 {\r
307 0x00,\r
308 L"Ethernet controller",\r
309 PCIBlankEntry\r
310 },\r
311 {\r
312 0x01,\r
313 L"Token ring controller",\r
314 PCIBlankEntry\r
315 },\r
316 {\r
317 0x02,\r
318 L"FDDI controller",\r
319 PCIBlankEntry\r
320 },\r
321 {\r
322 0x03,\r
323 L"ATM controller",\r
324 PCIBlankEntry\r
325 },\r
326 {\r
327 0x04,\r
328 L"ISDN controller",\r
329 PCIBlankEntry\r
330 },\r
f056e4c1
JC
331 {\r
332 0x05,\r
333 L"WorldFip controller",\r
334 PCIBlankEntry\r
335 },\r
336 {\r
337 0x06,\r
338 L"PICMG 2.14 Multi Computing",\r
339 PCIBlankEntry\r
340 },\r
341 {\r
342 0x07,\r
343 L"InfiniBand controller",\r
344 PCIBlankEntry\r
345 },\r
5d73d92f 346 {\r
347 0x80,\r
348 L"Other network controller",\r
349 PCIBlankEntry\r
350 },\r
351 {\r
352 0x00,\r
353 NULL,\r
354 /* null string ends the list */NULL\r
355 }\r
356};\r
357\r
358PCI_CLASS_ENTRY PCISubClass_03[] = {\r
359 {\r
360 0x00,\r
361 L"VGA/8514 controller",\r
362 PCIPIFClass_0300\r
363 },\r
364 {\r
365 0x01,\r
366 L"XGA controller",\r
367 PCIBlankEntry\r
368 },\r
369 {\r
370 0x02,\r
371 L"3D controller",\r
372 PCIBlankEntry\r
373 },\r
374 {\r
375 0x80,\r
376 L"Other display controller",\r
377 PCIBlankEntry\r
378 },\r
379 {\r
380 0x00,\r
381 NULL,\r
382 /* null string ends the list */PCIBlankEntry\r
383 }\r
384};\r
385\r
386PCI_CLASS_ENTRY PCISubClass_04[] = {\r
387 {\r
388 0x00,\r
389 L"Video device",\r
390 PCIBlankEntry\r
391 },\r
392 {\r
393 0x01,\r
394 L"Audio device",\r
395 PCIBlankEntry\r
396 },\r
397 {\r
398 0x02,\r
399 L"Computer Telephony device",\r
400 PCIBlankEntry\r
401 },\r
f056e4c1
JC
402 {\r
403 0x03,\r
404 L"Mixed mode device",\r
405 PCIBlankEntry\r
406 },\r
5d73d92f 407 {\r
408 0x80,\r
409 L"Other multimedia device",\r
410 PCIBlankEntry\r
411 },\r
412 {\r
413 0x00,\r
414 NULL,\r
415 /* null string ends the list */NULL\r
416 }\r
417};\r
418\r
419PCI_CLASS_ENTRY PCISubClass_05[] = {\r
420 {\r
421 0x00,\r
422 L"RAM memory controller",\r
423 PCIBlankEntry\r
424 },\r
425 {\r
426 0x01,\r
427 L"Flash memory controller",\r
428 PCIBlankEntry\r
429 },\r
430 {\r
431 0x80,\r
432 L"Other memory controller",\r
433 PCIBlankEntry\r
434 },\r
435 {\r
436 0x00,\r
437 NULL,\r
438 /* null string ends the list */NULL\r
439 }\r
440};\r
441\r
442PCI_CLASS_ENTRY PCISubClass_06[] = {\r
443 {\r
444 0x00,\r
445 L"Host/PCI bridge",\r
446 PCIBlankEntry\r
447 },\r
448 {\r
449 0x01,\r
450 L"PCI/ISA bridge",\r
451 PCIBlankEntry\r
452 },\r
453 {\r
454 0x02,\r
455 L"PCI/EISA bridge",\r
456 PCIBlankEntry\r
457 },\r
458 {\r
459 0x03,\r
460 L"PCI/Micro Channel bridge",\r
461 PCIBlankEntry\r
462 },\r
463 {\r
464 0x04,\r
465 L"PCI/PCI bridge",\r
466 PCIPIFClass_0604\r
467 },\r
468 {\r
469 0x05,\r
470 L"PCI/PCMCIA bridge",\r
471 PCIBlankEntry\r
472 },\r
473 {\r
474 0x06,\r
475 L"NuBus bridge",\r
476 PCIBlankEntry\r
477 },\r
478 {\r
479 0x07,\r
480 L"CardBus bridge",\r
481 PCIBlankEntry\r
482 },\r
483 {\r
484 0x08,\r
485 L"RACEway bridge",\r
486 PCIBlankEntry\r
487 },\r
f056e4c1
JC
488 {\r
489 0x09,\r
490 L"Semi-transparent PCI-to-PCI bridge",\r
491 PCIPIFClass_0609\r
492 },\r
493 {\r
494 0x0A,\r
495 L"InfiniBand-to-PCI host bridge",\r
496 PCIBlankEntry\r
497 },\r
498 {\r
499 0x0B,\r
500 L"Advanced Switching to PCI host bridge",\r
501 PCIPIFClass_060b\r
502 },\r
5d73d92f 503 {\r
504 0x80,\r
505 L"Other bridge type",\r
506 PCIBlankEntry\r
507 },\r
508 {\r
509 0x00,\r
510 NULL,\r
511 /* null string ends the list */NULL\r
512 }\r
513};\r
514\r
515PCI_CLASS_ENTRY PCISubClass_07[] = {\r
516 {\r
517 0x00,\r
518 L"Serial controller",\r
519 PCIPIFClass_0700\r
520 },\r
521 {\r
522 0x01,\r
523 L"Parallel port",\r
524 PCIPIFClass_0701\r
525 },\r
526 {\r
527 0x02,\r
528 L"Multiport serial controller",\r
529 PCIBlankEntry\r
530 },\r
531 {\r
532 0x03,\r
533 L"Modem",\r
534 PCIPIFClass_0703\r
535 },\r
f056e4c1
JC
536 {\r
537 0x04,\r
538 L"GPIB (IEEE 488.1/2) controller",\r
539 PCIBlankEntry\r
540 },\r
541 {\r
542 0x05,\r
543 L"Smart Card",\r
544 PCIBlankEntry\r
545 },\r
5d73d92f 546 {\r
547 0x80,\r
548 L"Other communication device",\r
549 PCIBlankEntry\r
550 },\r
551 {\r
552 0x00,\r
553 NULL,\r
554 /* null string ends the list */NULL\r
555 }\r
556};\r
557\r
558PCI_CLASS_ENTRY PCISubClass_08[] = {\r
559 {\r
560 0x00,\r
561 L"PIC",\r
562 PCIPIFClass_0800\r
563 },\r
564 {\r
565 0x01,\r
566 L"DMA controller",\r
567 PCIPIFClass_0801\r
568 },\r
569 {\r
570 0x02,\r
571 L"System timer",\r
572 PCIPIFClass_0802\r
573 },\r
574 {\r
575 0x03,\r
576 L"RTC controller",\r
577 PCIPIFClass_0803\r
578 },\r
579 {\r
580 0x04,\r
581 L"Generic PCI Hot-Plug controller",\r
582 PCIBlankEntry\r
583 },\r
f056e4c1
JC
584 {\r
585 0x05,\r
586 L"SD Host controller",\r
587 PCIBlankEntry\r
588 },\r
589 {\r
590 0x06,\r
591 L"IOMMU",\r
592 PCIBlankEntry\r
593 },\r
594 {\r
595 0x07,\r
596 L"Root Complex Event Collector",\r
597 PCIBlankEntry\r
598 },\r
5d73d92f 599 {\r
600 0x80,\r
601 L"Other system peripheral",\r
602 PCIBlankEntry\r
603 },\r
604 {\r
605 0x00,\r
606 NULL,\r
607 /* null string ends the list */NULL\r
608 }\r
609};\r
610\r
611PCI_CLASS_ENTRY PCISubClass_09[] = {\r
612 {\r
613 0x00,\r
614 L"Keyboard controller",\r
615 PCIBlankEntry\r
616 },\r
617 {\r
618 0x01,\r
619 L"Digitizer (pen)",\r
620 PCIBlankEntry\r
621 },\r
622 {\r
623 0x02,\r
624 L"Mouse controller",\r
625 PCIBlankEntry\r
626 },\r
627 {\r
628 0x03,\r
629 L"Scanner controller",\r
630 PCIBlankEntry\r
631 },\r
632 {\r
633 0x04,\r
634 L"Gameport controller",\r
635 PCIPIFClass_0904\r
636 },\r
637 {\r
638 0x80,\r
639 L"Other input controller",\r
640 PCIBlankEntry\r
641 },\r
642 {\r
643 0x00,\r
644 NULL,\r
645 /* null string ends the list */NULL\r
646 }\r
647};\r
648\r
649PCI_CLASS_ENTRY PCISubClass_0a[] = {\r
650 {\r
651 0x00,\r
652 L"Generic docking station",\r
653 PCIBlankEntry\r
654 },\r
655 {\r
656 0x80,\r
657 L"Other type of docking station",\r
658 PCIBlankEntry\r
659 },\r
660 {\r
661 0x00,\r
662 NULL,\r
663 /* null string ends the list */NULL\r
664 }\r
665};\r
666\r
667PCI_CLASS_ENTRY PCISubClass_0b[] = {\r
668 {\r
669 0x00,\r
670 L"386",\r
671 PCIBlankEntry\r
672 },\r
673 {\r
674 0x01,\r
675 L"486",\r
676 PCIBlankEntry\r
677 },\r
678 {\r
679 0x02,\r
680 L"Pentium",\r
681 PCIBlankEntry\r
682 },\r
683 {\r
684 0x10,\r
685 L"Alpha",\r
686 PCIBlankEntry\r
687 },\r
688 {\r
689 0x20,\r
690 L"PowerPC",\r
691 PCIBlankEntry\r
692 },\r
693 {\r
694 0x30,\r
695 L"MIPS",\r
696 PCIBlankEntry\r
697 },\r
698 {\r
699 0x40,\r
700 L"Co-processor",\r
701 PCIBlankEntry\r
702 },\r
703 {\r
704 0x80,\r
705 L"Other processor",\r
706 PCIBlankEntry\r
707 },\r
708 {\r
709 0x00,\r
710 NULL,\r
711 /* null string ends the list */NULL\r
712 }\r
713};\r
714\r
715PCI_CLASS_ENTRY PCISubClass_0c[] = {\r
716 {\r
717 0x00,\r
f056e4c1
JC
718 L"IEEE 1394",\r
719 PCIPIFClass_0c00\r
5d73d92f 720 },\r
721 {\r
722 0x01,\r
723 L"ACCESS.bus",\r
724 PCIBlankEntry\r
725 },\r
726 {\r
727 0x02,\r
728 L"SSA",\r
729 PCIBlankEntry\r
730 },\r
731 {\r
732 0x03,\r
733 L"USB",\r
f056e4c1 734 PCIPIFClass_0c03\r
5d73d92f 735 },\r
736 {\r
737 0x04,\r
738 L"Fibre Channel",\r
739 PCIBlankEntry\r
740 },\r
741 {\r
742 0x05,\r
743 L"System Management Bus",\r
744 PCIBlankEntry\r
745 },\r
f056e4c1
JC
746 {\r
747 0x06,\r
748 L"InfiniBand",\r
749 PCIBlankEntry\r
750 },\r
751 {\r
752 0x07,\r
753 L"IPMI",\r
754 PCIPIFClass_0c07\r
755 },\r
756 {\r
757 0x08,\r
758 L"SERCOS Interface Standard (IEC 61491)",\r
759 PCIBlankEntry\r
760 },\r
761 {\r
762 0x09,\r
763 L"CANbus",\r
764 PCIBlankEntry\r
765 },\r
5d73d92f 766 {\r
767 0x80,\r
768 L"Other bus type",\r
769 PCIBlankEntry\r
770 },\r
771 {\r
772 0x00,\r
773 NULL,\r
774 /* null string ends the list */NULL\r
775 }\r
776};\r
777\r
778PCI_CLASS_ENTRY PCISubClass_0d[] = {\r
779 {\r
780 0x00,\r
781 L"iRDA compatible controller",\r
782 PCIBlankEntry\r
783 },\r
784 {\r
785 0x01,\r
f056e4c1
JC
786 L"",\r
787 PCIPIFClass_0d01\r
5d73d92f 788 },\r
789 {\r
790 0x10,\r
791 L"RF controller",\r
792 PCIBlankEntry\r
793 },\r
f056e4c1
JC
794 {\r
795 0x11,\r
796 L"Bluetooth",\r
797 PCIBlankEntry\r
798 },\r
799 {\r
800 0x12,\r
801 L"Broadband",\r
802 PCIBlankEntry\r
803 },\r
804 {\r
805 0x20,\r
806