Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/i386/libsaio/pci_root.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/*
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 1
11#endif
12
13#if DEBUG_PCIROOT
14#define DBG(x...) printf(x)
15#else
16#define DBG(x...)
17#endif
18
19static int rootuid = 10; //value means function wasnt 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{
48void *new_dsdt;
49const char *val;
50int len,fsize;
51const char * dsdt_filename=NULL;
52extern int search_and_get_acpi_fd(const char *, const char **);
53
54if (rootuid < 10) return rootuid;
55rootuid = 0;/* default uid = 0 */
56
57if (getValueForKey(kPCIRootUID, &val, &len, &bootInfo->bootConfig)) {
58if (isdigit(val[0])) rootuid = val[0] - '0';
59goto out;
60}
61/* Chameleon compatibility */
62else if (getValueForKey("PciRoot", &val, &len, &bootInfo->bootConfig)) {
63if (isdigit(val[0])) rootuid = val[0] - '0';
64goto out;
65}
66/* PCEFI compatibility */
67else if (getValueForKey("-pci0", &val, &len, &bootInfo->bootConfig)) {
68rootuid = 0;
69goto out;
70}
71else if (getValueForKey("-pci1", &val, &len, &bootInfo->bootConfig)) {
72rootuid = 1;
73goto out;
74}
75
76int fd = search_and_get_acpi_fd("DSDT.aml", &dsdt_filename);
77
78// Check booting partition
79if (fd<0)
80{
81 verbose("No DSDT found, using 0 as uid value.\n");
82 rootuid = 0;
83 goto out;
84}
85
86fsize = file_size(fd);
87
88if ((new_dsdt = malloc(fsize)) == NULL) {
89verbose("[ERROR] alloc DSDT memory failed\n");
90close (fd);
91goto out;
92}
93if (read (fd, new_dsdt, fsize) != fsize) {
94verbose("[ERROR] read %s failed\n", dsdt_filename);
95close (fd);
96goto out;
97}
98close (fd);
99
100rootuid = findpciroot(new_dsdt, fsize);
101free(new_dsdt);
102
103// make sure it really works:
104if (rootuid == 11) rootuid=0; //usually when _UID isnt present, it means uid is zero
105else if (rootuid < 0 || rootuid > 9)
106{
107printf("PciRoot uid value wasnt found, using 0, if you want it to be 1, use -PciRootUID flag");
108rootuid = 0;
109}
110out:
111verbose("Using PCI-Root-UID value: %d\n", rootuid);
112return rootuid;
113}
114

Archive Download this file

Revision: 214