Chameleon

Chameleon Svn Source Tree

Root/branches/Bungo/i386/libsaio/pci_root.c

1/*
2 * Copyright 2009 netkas
3 */
4
5#include "libsaio.h"
6#include "boot.h"
7#include "bootstruct.h"
8
9#ifndef DEBUG_PCIROOT
10#define DEBUG_PCIROOT 0
11#endif
12
13#if DEBUG_PCIROOT
14#define DBG(x...) printf(x)
15#else
16#define DBG(x...) msglog(x)
17#endif
18
19static int rootuid = 10; //value means function wasn't ran yet
20
21static unsigned int findrootuid(unsigned char * dsdt, int len)
22{
23int i;
24for (i=0; i<64 && i<len-5; i++) //not far than 64 symbols from pci root
25{
26if(dsdt[i] == '_' && dsdt[i+1] == 'U' && dsdt[i+2] == 'I' && dsdt[i+3] == 'D' && dsdt[i+5] == 0x08)
27{
28return dsdt[i+4];
29}
30}
31return 11;
32}
33
34static unsigned int findpciroot(unsigned char * dsdt,int len)
35{
36int i;
37
38for (i=0; i<len-4; i++) {
39if(dsdt[i] == 'P' && dsdt[i+1] == 'C' && dsdt[i+2] == 'I' && (dsdt[i+3] == 0x08 || dsdt [i+4] == 0x08)) {
40return findrootuid(dsdt+i, len-i);
41}
42}
43return 10;
44}
45
46int getPciRootUID(void)
47{
48char dsdt_dirSpec[256];
49const char *val = NULL;
50int len = 0;
51const char *dsdt_filename = NULL;
52//extern int search_and_get_acpi_fd(const char *, const char **);
53//extern void *loadACPITable (const char *filename);
54
55if (rootuid < 10)
56{
57return rootuid;
58}
59
60rootuid = 0;/* default _UID = 0 */
61
62if (getValueForKey(kPCIRootUID, &val, &len, &bootInfo->chameleonConfig) && len)
63{
64if (isdigit(val[0]))
65{
66rootuid = val[0] - '0';
67}
68
69goto out;
70}
71/* Chameleon compatibility */
72else if (getValueForKey("PciRoot", &val, &len, &bootInfo->chameleonConfig) && len)
73{
74if (isdigit(val[0]))
75{
76rootuid = val[0] - '0';
77}
78
79goto out;
80}
81/* PCEFI compatibility */
82else if (getValueForKey("-pci0", &val, &len, &bootInfo->chameleonConfig) && len)
83{
84rootuid = 0;
85goto out;
86}
87else if (getValueForKey("-pci1", &val, &len, &bootInfo->chameleonConfig) && len)
88{
89rootuid = 1;
90goto out;
91}
92
93if (new_dsdt != NULL)
94{
95len = *(int *)(new_dsdt + 4);
96verbose("PCIrootUID: custom DSDT already loaded @%08X, length=%d.\n", new_dsdt, len);
97}
98else
99{
100// Try using the file specified with the DSDT option
101if (getValueForKey(kDSDT, &dsdt_filename, &len, &bootInfo->chameleonConfig) && len)
102{
103snprintf(dsdt_dirSpec, sizeof(dsdt_dirSpec), dsdt_filename);
104}
105else
106{
107sprintf(dsdt_dirSpec, "DSDT.aml");
108}
109
110verbose("PCIrootUID: attempting to load custom DSDT...\n");
111if ((new_dsdt = loadACPITable(dsdt_dirSpec)))
112{
113len = *(int *)(new_dsdt + 4);
114verbose("PCIrootUID: custom DSDT loaded @%08X, length=%d\n", new_dsdt, len);
115}
116else
117{
118//verbose("PCIrootUID: custom DSDT not found!.\n");
119}
120}
121/*
122// Try using the file specified with the DSDT option
123if (getValueForKey(kDSDT, &dsdt_filename, &len, &bootInfo->chameleonConfig) && len)
124{
125snprintf(dsdt_dirSpec, sizeof(dsdt_dirSpec), dsdt_filename);
126}
127else
128{
129sprintf(dsdt_dirSpec, "DSDT.aml");
130}
131
132DBG("PCIrootUID: trying file DSDT.aml... ");
133
134int fd = search_and_get_acpi_fd(dsdt_dirSpec, &dsdt_filename);
135
136// Check booting partition
137if (fd<0)
138{
139DBG("PCIrootUID: file '%s' not found, using default value.\n", dsdt_filename);
140rootuid = 0;
141goto out;
142}
143
144fsize = file_size(fd);
145
146if (!(new_dsdt = malloc(fsize)))
147{
148DBG("PCIrootUID: ERROR: allocating DSDT memory failed.\n");
149close (fd);
150goto out;
151}
152
153if (read (fd, new_dsdt, fsize) != fsize)
154{
155DBG("PCIrootUID: ERROR: failed reading DSDT from '%s'.\n", dsdt_filename);
156free(new_dsdt);
157close (fd);
158goto out;
159}
160
161close (fd);
162*/
163if (len)
164{
165rootuid = findpciroot(new_dsdt, len);
166}
167/*
168free(new_dsdt);
169*/
170// make sure it really works:
171if (rootuid == 11)
172{
173rootuid = 0; //usually when _UID isn't present, it means uid is zero
174}
175else if (rootuid < 0 || rootuid > 9)
176{
177verbose("PCIrootUID: proper value wasn't found. Using default value (0).\n");
178rootuid = 0;
179return rootuid;
180}
181
182out:
183verbose("PCIrootUID=0x%02X: using.\n", rootuid);
184return rootuid;
185}
186

Archive Download this file

Revision: 2839