Chameleon

Chameleon Svn Source Tree

Root/branches/meklortOld/i386/modules/ACPIPatcher/ACPIPatcher.c

Source at commit 1158 created 13 years 16 days ago.
By azimutz, Match nvidia.c with the one on my branch (Chazi) adding dev id's from issue 99 and Asus G74SX (0DF4, 1251).
1/*
2 * Copyright (c) 2009 Evan Lojewski. All rights reserved.
3 *
4 */
5
6#include "libsaio.h"
7#include "modules.h"
8#include "boot.h"
9#include "bootstruct.h"
10#include "pci_root.h"
11#include "acpi_patcher.h"
12
13int ACPIPatcher_getPciRootUID(void);
14unsigned int findpciroot(unsigned char * dsdt,int len);
15static unsigned int findrootuid(unsigned char * dsdt, int len);
16
17void ACPIPatcher_setupEfiConfigurationTable_hook(void* binary, void* arg2, void* arg3, void* arg4)
18{
19// Setup ACPI with DSDT overrides (mackerintel's patch)
20setupAcpi();
21}
22
23void ACPIPatcher_start()
24{
25replace_function("_getPciRootUID", &ACPIPatcher_getPciRootUID);
26register_hook_callback("setupEfiConfigurationTable", &ACPIPatcher_setupEfiConfigurationTable_hook);
27}
28
29int ACPIPatcher_rootuid = 10; //value means function wasnt ran yet
30
31int ACPIPatcher_getPciRootUID(void)
32{
33void *new_dsdt;
34const char *val;
35int len,fsize;
36const char * dsdt_filename=NULL;
37extern int search_and_get_acpi_fd(const char *, const char **);
38
39if (ACPIPatcher_rootuid < 10) return ACPIPatcher_rootuid;
40ACPIPatcher_rootuid = 0;/* default uid = 0 */
41
42if (getValueForKey(kPCIRootUID, &val, &len, &bootInfo->bootConfig)) {
43if (isdigit(val[0])) ACPIPatcher_rootuid = val[0] - '0';
44goto out;
45}
46/* Chameleon compatibility */
47else if (getValueForKey("PciRoot", &val, &len, &bootInfo->bootConfig)) {
48if (isdigit(val[0])) ACPIPatcher_rootuid = val[0] - '0';
49goto out;
50}
51/* PCEFI compatibility */
52else if (getValueForKey("-pci0", &val, &len, &bootInfo->bootConfig)) {
53ACPIPatcher_rootuid = 0;
54goto out;
55}
56else if (getValueForKey("-pci1", &val, &len, &bootInfo->bootConfig)) {
57ACPIPatcher_rootuid = 1;
58goto out;
59}
60
61int fd = search_and_get_acpi_fd("DSDT.aml", &dsdt_filename);
62
63// Check booting partition
64if (fd<0)
65{
66verbose("No DSDT found, using 0 as uid value.\n");
67ACPIPatcher_rootuid = 0;
68goto out;
69}
70
71fsize = file_size(fd);
72
73if ((new_dsdt = malloc(fsize)) == NULL) {
74verbose("[ERROR] alloc DSDT memory failed\n");
75close (fd);
76goto out;
77}
78if (read (fd, new_dsdt, fsize) != fsize) {
79verbose("[ERROR] read %s failed\n", dsdt_filename);
80close (fd);
81goto out;
82}
83close (fd);
84
85ACPIPatcher_rootuid = findpciroot(new_dsdt, fsize);
86free(new_dsdt);
87
88// make sure it really works:
89if (ACPIPatcher_rootuid == 11) ACPIPatcher_rootuid=0; //usually when _UID isnt present, it means uid is zero
90else if (ACPIPatcher_rootuid < 0 || ACPIPatcher_rootuid > 9)
91{
92printf("PciRoot uid value wasnt found, using 0, if you want it to be 1, use -PciRootUID flag");
93ACPIPatcher_rootuid = 0;
94}
95out:
96verbose("Using PCI-Root-UID value: %d\n", ACPIPatcher_rootuid);
97return ACPIPatcher_rootuid;
98}
99
100unsigned int findpciroot(unsigned char * dsdt,int len)
101{
102int i;
103
104for (i=0; i<len-4; i++) {
105if(dsdt[i] == 'P' && dsdt[i+1] == 'C' && dsdt[i+2] == 'I' && (dsdt[i+3] == 0x08 || dsdt [i+4] == 0x08)) {
106return findrootuid(dsdt+i, len-i);
107}
108}
109return 10;
110}
111
112static unsigned int findrootuid(unsigned char * dsdt, int len)
113{
114int i;
115for (i=0; i<64 && i<len-5; i++) //not far than 64 symbols from pci root
116{
117if(dsdt[i] == '_' && dsdt[i+1] == 'U' && dsdt[i+2] == 'I' && dsdt[i+3] == 'D' && dsdt[i+5] == 0x08)
118{
119return dsdt[i+4];
120}
121}
122return 11;
123}
124

Archive Download this file

Revision: 1158