Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/i386/libsa/efi_tables.c

Source at commit 214 created 13 years 5 months ago.
By ifabio, update to chameleon trunk 630, and now the pakage folder is the same as blackosx branch, also add Icon "building" into buildpkg script, and add mint theme info into the English localizable.strings.
1/*! @file efi_tables.c
2 Copyright 2007 David F. Elliott. All rights reserved.
3 */
4#include "libsa.h"
5#include "efi_tables.h"
6
7
8/*==========================================================================
9 * CRC32 implementation copied from xnu in turn copied from Gary S. Brown.
10 */
11
12/*-
13 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
14 * code or tables extracted from it, as desired without restriction.
15 *
16 * First, the polynomial itself and its table of feedback terms. The
17 * polynomial is
18 * X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
19 *
20 * Note that we take it "backwards" and put the highest-order term in
21 * the lowest-order bit. The X^32 term is "implied"; the LSB is the
22 * X^31 term, etc. The X^0 term (usually shown as "+1") results in
23 * the MSB being 1
24 *
25 * Note that the usual hardware shift register implementation, which
26 * is what we're using (we're merely optimizing it by doing eight-bit
27 * chunks at a time) shifts bits into the lowest-order term. In our
28 * implementation, that means shifting towards the right. Why do we
29 * do it this way? Because the calculated CRC must be transmitted in
30 * order from highest-order term to lowest-order term. UARTs transmit
31 * characters in order from LSB to MSB. By storing the CRC this way
32 * we hand it to the UART in the order low-byte to high-byte; the UART
33 * sends each low-bit to hight-bit; and the result is transmission bit
34 * by bit from highest- to lowest-order term without requiring any bit
35 * shuffling on our part. Reception works similarly
36 *
37 * The feedback terms table consists of 256, 32-bit entries. Notes
38 *
39 * The table can be generated at runtime if desired; code to do so
40 * is shown later. It might not be obvious, but the feedback
41 * terms simply represent the results of eight shift/xor opera
42 * tions for all combinations of data and CRC register values
43 *
44 * The values must be right-shifted by eight bits by the "updcrc
45 * logic; the shift must be unsigned (bring in zeroes). On some
46 * hardware you could probably optimize the shift in assembler by
47 * using byte-swap instructions
48 * polynomial $edb88320
49 *
50 *
51 * CRC32 code derived from work by Gary S. Brown.
52 */
53
54static uint32_t crc32_tab[] = {
550x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
560xe963a535, 0x9e6495a3,0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
570x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
580xf3b97148, 0x84be41de,0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
590x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,0x14015c4f, 0x63066cd9,
600xfa0f3d63, 0x8d080df5,0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
610x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,0x35b5a8fa, 0x42b2986c,
620xdbbbc9d6, 0xacbcf940,0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
630x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
640xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
650x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,0x76dc4190, 0x01db7106,
660x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
670x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
680x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
690x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
700x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
710x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
720xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
730x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
740xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
750x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
760xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
770xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
780x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
790xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
800x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
810xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
820x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
830xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
840x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
850xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
860x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
870x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
880x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
890x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
900x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
910x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
920x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
930xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
940x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
950xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
960x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
970xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
98};
99
100uint32_t crc32(uint32_t crc, const void *buf, size_t size)
101{
102const uint8_t *p;
103
104p = buf;
105crc = crc ^ ~0U;
106
107while (size--)
108crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
109
110return crc ^ ~0U;
111}
112
113
114/*==========================================================================
115 * Utility function to make a device tree string from an EFI_GUID
116 */
117
118void efi_guid_unparse_upper(EFI_GUID const *pGuid, char *out)
119{
120 sprintf(out, "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
121 pGuid->Data1, /* - */
122 pGuid->Data2, /* - */
123 pGuid->Data3, /* - */
124 pGuid->Data4[0], pGuid->Data4[1], /* - */
125 pGuid->Data4[2], pGuid->Data4[3],
126 pGuid->Data4[4], pGuid->Data4[5],
127 pGuid->Data4[6], pGuid->Data4[7]);
128}
129
130bool efi_guid_is_null(EFI_GUID const *pGuid)
131{
132 if(pGuid->Data1 == 0 && pGuid->Data2 == 0 && pGuid->Data3 == 0)
133 {
134 int i;
135 for(i=0; i<8; ++i)
136 {
137 if(pGuid->Data4[i] != 0)
138 return false;
139 }
140 return true;
141 }
142 return false;
143}
144
145#define COMPARE_MEMBER_AND_RETURN_IF_NE(a,b,mem) \
146 if( ((a)->mem) < ((b)->mem) ) \
147 return -1; \
148 else if( ((a)->mem) > ((b)->mem) ) \
149 return 1;
150
151int efi_guid_compare(EFI_GUID const *pG1, EFI_GUID const *pG2)
152{
153 COMPARE_MEMBER_AND_RETURN_IF_NE(pG1, pG2, Data1);
154 COMPARE_MEMBER_AND_RETURN_IF_NE(pG1, pG2, Data2);
155 COMPARE_MEMBER_AND_RETURN_IF_NE(pG1, pG2, Data3);
156 int i;
157 for(i=0; i<8; ++i)
158 {
159 COMPARE_MEMBER_AND_RETURN_IF_NE(pG1, pG2, Data4[i]);
160 }
161 return 0;
162}
163

Archive Download this file

Revision: 214