overdue-scratch

Author Topic: Backporting the Meklort patches for auto patching mach_kernel's CPUID panic etc.  (Read 51843 times)

0 Members and 1 Guest are viewing this topic.

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Quote
The "commpage no match for last, next address ffff1000" panic shouldb't be there, probably has something to do with one of the patches working improperly, I ran into that once and then fixed it, but I haven't uploaded it.
If you say so :)
I can't remember if the address was always ffff1000. All i can say is that i always had this commpage kp without the patch i mentioned and the explanation i gave came from MercurySquad. I'll keep a closer eye on it.

Quote
As far as the ACPI_SMC_PlatformPlugin panic, the CPUID patch just removes the panic for now, I have it partially working in 64bit but it's not done yet.
yep.. no pressure; will test as you put out.

Quote
Yes, other patches can be applied, some require more work than others, although I'll be writing some additional functions that'll let you do things a bit easier.
This is nice. By the way, nice going with the modules support! Didn't saw that one coming ;D

Was paying a visit to Leo, remembered to try compiling the booter and was greeted with this stuff:
Code: [Select]
-MD -dependency-file /Volumes/Home/Azi/ChopShop/Booters/Chameleon/branches/meklort/obj/i386/boot2/modules.d
modules.c: In function 'parse_mach':
modules.c:452: error: 'LC_DYLD_INFO' undeclared (first use in this function)
modules.c:452: error: (Each undeclared identifier is reported only once
modules.c:452: error: for each function it appears in.)
modules.c:478: error: dereferencing pointer to incomplete type
modules.c:480: error: dereferencing pointer to incomplete type
modules.c:480: error: dereferencing pointer to incomplete type
modules.c:483: error: dereferencing pointer to incomplete type
modules.c:485: error: dereferencing pointer to incomplete type
modules.c:485: error: dereferencing pointer to incomplete type
modules.c:488: error: dereferencing pointer to incomplete type
modules.c:491: error: dereferencing pointer to incomplete type
modules.c:491: error: dereferencing pointer to incomplete type
modules.c:494: error: dereferencing pointer to incomplete type
modules.c:498: error: dereferencing pointer to incomplete type
modules.c:498: error: dereferencing pointer to incomplete type
modules.c: In function 'rebase_macho':
modules.c:529: error: 'REBASE_IMMEDIATE_MASK' undeclared (first use in this function)
modules.c:530: error: 'REBASE_OPCODE_MASK' undeclared (first use in this function)
modules.c:535: error: 'REBASE_OPCODE_DONE' undeclared (first use in this function)
modules.c:541: error: 'REBASE_OPCODE_SET_TYPE_IMM' undeclared (first use in this function)
modules.c:549: error: 'REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB' undeclared (first use in this function)
modules.c:584: error: 'REBASE_OPCODE_ADD_ADDR_ULEB' undeclared (first use in this function)
modules.c:599: error: 'REBASE_OPCODE_ADD_ADDR_IMM_SCALED' undeclared (first use in this function)
modules.c:604: error: 'REBASE_OPCODE_DO_REBASE_IMM_TIMES' undeclared (first use in this function)
modules.c:613: error: 'REBASE_OPCODE_DO_REBASE_ULEB_TIMES' undeclared (first use in this function)
modules.c:631: error: 'REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB' undeclared (first use in this function)
modules.c:646: error: 'REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB' undeclared (first use in this function)
modules.c: In function 'bind_macho':
modules.c:712: error: 'BIND_IMMEDIATE_MASK' undeclared (first use in this function)
modules.c:713: error: 'BIND_OPCODE_MASK' undeclared (first use in this function)
modules.c:718: error: 'BIND_OPCODE_DONE' undeclared (first use in this function)
modules.c:722: error: 'BIND_OPCODE_SET_DYLIB_ORDINAL_IMM' undeclared (first use in this function)
modules.c:727: error: 'BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB' undeclared (first use in this function)
modules.c:741: error: 'BIND_OPCODE_SET_DYLIB_SPECIAL_IMM' undeclared (first use in this function)
modules.c:748: error: 'BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM' undeclared (first use in this function)
modules.c:758: error: 'BIND_OPCODE_SET_TYPE_IMM' undeclared (first use in this function)
modules.c:765: error: 'BIND_OPCODE_SET_ADDEND_SLEB' undeclared (first use in this function)
modules.c:780: error: 'BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB' undeclared (first use in this function)
modules.c:813: error: 'BIND_OPCODE_ADD_ADDR_ULEB' undeclared (first use in this function)
modules.c:828: error: 'BIND_OPCODE_DO_BIND' undeclared (first use in this function)
modules.c:847: error: 'BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB' undeclared (first use in this function)
modules.c:881: error: 'BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED' undeclared (first use in this function)
modules.c:902: error: 'BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB' undeclared (first use in this function)
make[2]: *** [modules.o] Error 1
make[1]: *** [all] Error 2
make: *** [all] Error 2
Needs some tuning...
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

meklort

  • VoodooLabs
  • Posts: 65
Some headers are probably missing in 10.5, might need to install the xnu source too. If needed I can include the required #defs / header instead.
return c ? c : !c;

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Yep.. not missing, changed; loader.h at least. Will check in Leo...

UPDATE: it builds on Leo using loader.h from "Snow", but i get a bunch of warnings:
Code: [Select]
/Users/burro/Desktop/meklort/obj/i386/modules/.//KernelPatcher/kernel_patcher.o -o /Users/burro/Desktop/meklort/sym/i386/KernelPatcher.dylib
ld warning: codegen in _register_kernel_symbol (offset 0x0000000D) prevents image from loading in dyld shared cache
ld warning: codegen in _register_kernel_symbol (offset 0x0000007A) prevents image from loading in dyld shared cache
ld warning: codegen in _register_kernel_symbol (offset 0x00000086) prevents image from loading in dyld shared cache
ld warning: codegen in _register_kernel_symbol (offset 0x0000008D) prevents image from loading in dyld shared cache
ld warning: codegen in _register_kernel_patch (offset 0x0000000C) prevents image from loading in dyld shared cache
ld warning: codegen in _register_kernel_patch (offset 0x0000001D) prevents image from loading in dyld shared cache
ld warning: codegen in _register_kernel_patch (offset 0x0000009C) prevents image from loading in dyld shared cache
ld warning: codegen in _lookup_kernel_symbol (offset 0x0000000D) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_kernel (offset 0x0000000E) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_kernel (offset 0x0000004A) prevents image from loading in dyld shared cache
ld warning: codegen in _symbol_handler (offset 0x0000000D) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info (offset 0x0000001E) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info (offset 0x0000005B) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info (offset 0x000000AA) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info (offset 0x000000B1) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info (offset 0x000000C1) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info (offset 0x000000D2) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_cpuid_set_info_all (offset 0x0000000A) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_pmCPUExitHaltToOff (offset 0x0000000A) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_pmCPUExitHaltToOff (offset 0x00000049) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_pmCPUExitHaltToOff (offset 0x00000055) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_init (offset 0x0000000B) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_init (offset 0x00000054) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_init (offset 0x0000005E) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_init (offset 0x0000006C) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_init (offset 0x000000B5) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_init (offset 0x000000D2) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_commpage_stuff_routine (offset 0x0000000B) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_commpage_stuff_routine (offset 0x00000059) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_commpage_stuff_routine (offset 0x00000062) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_commpage_stuff_routine (offset 0x0000006A) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_commpage_stuff_routine (offset 0x000000B8) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_commpage_stuff_routine (offset 0x000000C5) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_interrupt (offset 0x0000000B) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_interrupt (offset 0x00000059) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_interrupt (offset 0x00000062) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_interrupt (offset 0x0000006A) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_interrupt (offset 0x000000B8) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_interrupt (offset 0x000000C5) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_configure (offset 0x0000000E) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_configure (offset 0x0000005C) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_configure (offset 0x00000065) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_configure (offset 0x0000006D) prevents image from loading in dyld shared cache
ld warning: codegen in _patch_lapic_configure (offset 0x000000BF) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000008) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000022) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000074) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000000C6) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000118) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000016A) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000001BC) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000020E) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000260) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000002B2) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000304) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000356) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000003A8) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000433) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000043F) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000044A) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000047B) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000004A1) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000004C7) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000004ED) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000004F9) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000504) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000538) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000544) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000054F) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000583) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000058F) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000059A) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000005CE) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000005DA) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000005E5) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000619) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000625) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000630) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000664) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x00000670) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x0000067B) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000006AF) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000006BB) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000006C6) prevents image from loading in dyld shared cache
ld warning: codegen in _KernelPatcher_start (offset 0x000006FA) prevents image from loading in dyld shared cache

/Users/burro/Desktop/meklort/obj/i386/modules/.//Symbols/Symbols.o -o /Users/burro/Desktop/meklort/sym/i386/Symbols.dylib \

ld warning: codegen in _lookup_symbol (offset 0x00000032) prevents image from loading in dyld shared cache
ld warning: codegen in _lookup_symbol (offset 0x00000057) prevents image from loading in dyld shared cache
If you need any other feedback on this, just let me know.

About the "Sync with trunk, untested" (rev 505), looks fine!
« Last Edit: September 08, 2010, 11:51:38 AM by Azimutz »
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Hi Mek,

i'm having a doubt here; if md0=<file>, this first open
Code: [Select]
fh = open(filename, 0);will just check current dir for filename, right!? Is this on purpose?
I ask because looking at the rest of the paths, i get the feeling that the .img file is to be kept under Extra folder.
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

meklort

  • VoodooLabs
  • Posts: 65
I've always specified the full file path when using open, I don't know what happens if you do something like open("Blah", 0);
Anyway, the only cause where that will happen is if you specify the file name with md0=filename (actually it'll probably look in at bt(0,0)/filename (or /filename) if you don't specify the full path).

Basically, it'll check the user specified filename, where ever it might be, then it'll check in /Extra, lastly, it'll fallback to a patch I use in NBI (Postboot.img).
return c ? c : !c;

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Ok.. i didn't evaluated that stuff properly; forgot that if i pass a full path, the other two checks (lines 37 & 42) will not be performed at all; that is, if my path is correct. But, i still have a point; a full path like /extra/test/filename will get messed up on the other two checks; for those we should just use file name. Hence my doubt...
I'm doing some research for documentation and that stuff caught my attention.
« Last Edit: September 11, 2010, 04:43:51 AM by Azimutz »
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
 :o modules all over ;D
Meklort, GraphicsEnabler is doing fine here. Going to take a look at the rest... see if i can fit AutoResolution in between;
need to check this against your Resolution stuff, some is in fact yours, edid.c/h at least. And the gma stuff is most probably based on what you have too... i think Lebidou used the stuff on Andy's or Prasys branch.
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

meklort

  • VoodooLabs
  • Posts: 65
Pretty much the only module that isn't working right now is the GUI module, It was *way* too integrated into the rest of the source code, so I had to strip that out. As it is it replaces the printf / verbose /etc routines correctly, just the gui part itself isn't working. I also need to enable the embedded theme for that.

Anyway, main reason I'm changing things to modules (other than because nobody else is), is because I need boot2 to be smaller, *much* smaller, for something I'm doing (about half the size my current branch compiles to).

« Last Edit: September 14, 2010, 08:45:31 PM by meklort »
return c ? c : !c;

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Quote
Pretty much the only module that isn't working right now is the GUI   module, It was *way* too integrated into the rest of the source code,...
I see what you mean..! Still editing stuff to get the feeling on the work involved just on GUI module... uff
I suppose the theme will be embedded on the module, right?

The modules i have now (GE and memory) are working perfectly, no delays, no glitches... pretty cool, this stuff!
And thinking that weeks ago we were worried with booter size, now your target is 60K+-...
Finally we will be able to include wc, kitchen, etc ;D
If i had more knowledge i'd be converting stuff atm... i need to learn more! But that won't keep me from trying.
Think i will leave GUI for now and focus on AutoResolution..?!
« Last Edit: September 15, 2010, 11:39:10 AM by Azimutz »
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

meklort

  • VoodooLabs
  • Posts: 65
The issue with the GUI module is that the gui.maxdevices value is being set to 0 somewhere, causing a device by 0 error, and so an instant reboot. I will modify the gui module so that embedtheme works with it, right now it doesn't.

The Resolution module contains the 915resoluition code as well as the edid code.

Next thing I'm going to do is probably fixup some of the code to be more efficient space wise (drivers.c, boot.c, and a few other can easily be modified to save some space).
return c ? c : !c;

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Back...
Quote
The issue with the GUI module is that the gui.maxdevices value is being set to 0 somewhere, causing a device by 0 error, and so an instant reboot.
Any progress on this? Been taking a look at it while studying this stuff but, still no luck.
Shouldn't the booter work without GUI module? or GUI=n?... cause it doesn't.

Quote
The Resolution module contains the 915resoluition code as well as the edid code.
Studying your Resolution module doesn't help much with this AutoResolution... i learn more with GUI module :)

One thing i found by chance, while checking a reported hang, supposedly caused by -f argument;
i get an instant reboot right after s/l/e drivers finish loading, if using -f and HelloWorld module. Any idea on this?
I wasn't using the module anymore; it found it's way into Modules folder because i forgot to remove it from the script i use to update the booter. Anyway, i don't even remember why i suspected of it..?!
Any reason i should keep it around, besides being an example?
« Last Edit: September 20, 2010, 05:25:08 AM by Azimutz »
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

meklort

  • VoodooLabs
  • Posts: 65
The GUI module isn't needed. Everything works fine without it (other than the gui of course). I've tested it multiple time. Without the module, you get the text screen. With the module and no theme directory, you get the text screen and the boot logo. With the module and a theme directory, you get a reboot due to a divide by zero. I haven't had time to fix the reboot issue, but it should be an easy fix..

The resolution module is simple, it just patched the video bios with the optimal resolution read from the edid. HelloWorld.dylib shouldn't be doing anything, all it does in my branch is print the address of the kernel, and then pauses. Yes, it's not needed.
return c ? c : !c;

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
You're right about the booter running without the GUI module... i don't know were i had my mind when i tested that bit??! Sorry.

About HelloWorld module, i understand it shouldn't be causing any problem.. can't understand how it can be related with booting with -f flag!? I'm pretty sure i tested this one correctly several times, but will take another look.

Update: hum.. if i remove Memory.dylib and leave HW, booting with -f goes fine. Will test more later.. still need to catch up with latest updates on your branch.
« Last Edit: September 20, 2010, 06:44:23 AM by Azimutz »
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT

meklort

  • VoodooLabs
  • Posts: 65
I've updated a few things, let me know if the GUI module works now. Also, let me know if you run into more issues with the Memory module.
return c ? c : !c;

Azimutz

  • VoodooLabs
  • Posts: 420
  • Paranoid Android
Mek,

Rev 534:
- GUI doesn't load. Else seems to work fine, embedding theme and so...

- ACPIPatcher: 2 things don't work; getting PciRootUID from dsdt (setting UID with PciRoot=1 works fine),
Code: [Select]
Read HFS+ file: [hd(0,4)/Extra/modules/Symbols.dylib] 16604 bytes.
Read HFS+ file: [hd(0,4)/Extra/modules/ACPIPatcher.dylib] 25076 bytes.
Unable to locate symbol ___udivdi3
Unable to bind symbol ___udivdi3
Unable to locate symbol getPciRootUID
Read HFS+ file: [hd(0,4)/Extra/modules/GraphicsEnabler.dylib] 35004 bytes...
and
setting SystemID (didn't tested key).
Code: [Select]
fake_efi.c: In function ‘getSmbiosUUID’:
fake_efi.c:495: warning: function returns address of local variable

Rev 535 fails to build:
Code: [Select]
/usr/bin/ld_classic: Undefined symbols:
_promptForRescanOption

About that HW+Memory+-f instant reboot, it's only on my branch; as it is, i don't get it with your branch.
« Last Edit: September 21, 2010, 06:58:58 PM by Azimutz »
 System & Patches: http://goo.gl/i961
 Chameleon:
- trunk builds: http://goo.gl/9G1Hq
- pref pane: http://goo.gl/OL2UT