Chameleon

Chameleon Svn Source Tree

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

Archive Download this file

Revision: 1171