Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/libsaio/pci_root.c

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
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{
48char dsdt_dirSpec[128];
49
50void *new_dsdt;
51const char *val;
52int len,fsize;
53const char * dsdt_filename=NULL;
54extern int search_and_get_acpi_fd(const char *, const char **);
55
56if (rootuid < 10) return rootuid;
57rootuid = 0;/* default uid = 0 */
58
59if (getValueForKey(kPCIRootUID, &val, &len, &bootInfo->chameleonConfig)) {
60if (isdigit(val[0])) rootuid = val[0] - '0';
61goto out;
62}
63/* Chameleon compatibility */
64else if (getValueForKey("PciRoot", &val, &len, &bootInfo->chameleonConfig)) {
65if (isdigit(val[0])) rootuid = val[0] - '0';
66goto out;
67}
68/* PCEFI compatibility */
69else if (getValueForKey("-pci0", &val, &len, &bootInfo->chameleonConfig)) {
70rootuid = 0;
71goto out;
72}
73else if (getValueForKey("-pci1", &val, &len, &bootInfo->chameleonConfig)) {
74rootuid = 1;
75goto out;
76}
77
78
79// Try using the file specified with the DSDT option
80if (getValueForKey(kDSDT, &dsdt_filename, &len, &bootInfo->chameleonConfig))
81{
82sprintf(dsdt_dirSpec, dsdt_filename);
83}
84else
85{
86sprintf(dsdt_dirSpec, "DSDT.aml");
87}
88
89int fd = search_and_get_acpi_fd(dsdt_dirSpec, &dsdt_filename);
90
91// Check booting partition
92if (fd<0)
93{
94 verbose("No DSDT found, using 0 as uid value.\n");
95 rootuid = 0;
96 goto out;
97}
98
99fsize = file_size(fd);
100
101if ((new_dsdt = malloc(fsize)) == NULL) {
102verbose("[ERROR] alloc DSDT memory failed\n");
103close (fd);
104goto out;
105}
106if (read (fd, new_dsdt, fsize) != fsize) {
107verbose("[ERROR] read %s failed\n", dsdt_filename);
108close (fd);
109goto out;
110}
111close (fd);
112
113rootuid = findpciroot(new_dsdt, fsize);
114free(new_dsdt);
115
116// make sure it really works:
117if (rootuid == 11) rootuid=0; //usually when _UID isnt present, it means uid is zero
118else if (rootuid < 0 || rootuid > 9)
119{
120printf("PciRoot uid value wasnt found, using 0, if you want it to be 1, use -PciRootUID flag");
121rootuid = 0;
122}
123out:
124verbose("Using PCI-Root-UID value: %d\n", rootuid);
125return rootuid;
126}
127

Archive Download this file

Revision: 1808