Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/platform/goldfish: Prevent unconditional loading

The goldfish platform code registers the platform device unconditionally
which causes havoc in several ways if the goldfish_pdev_bus driver is
enabled:

- Access to the hardcoded physical memory region, which is either not
available or contains stuff which is completely unrelated.

- Prevents that the interrupt of the serial port can be requested

- In case of a spurious interrupt it goes into a infinite loop in the
interrupt handler of the pdev_bus driver (which needs to be fixed
seperately).

Add a 'goldfish' command line option to make the registration opt-in when
the platform is compiled in.

I'm seriously grumpy about this engineering trainwreck, which has seven
SOBs from Intel developers for 50 lines of code. And none of them figured
out that this is broken. Impressive fail!

Fixes: ddd70cf93d78 ("goldfish: platform device for x86")
Reported-by: Gabriel C <nix.or.die@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Thomas Gleixner and committed by
Greg Kroah-Hartman
47512cfd 8d12f882

+17 -1
+4
Documentation/admin-guide/kernel-parameters.txt
··· 1201 1201 When zero, profiling data is discarded and associated 1202 1202 debugfs files are removed at module unload time. 1203 1203 1204 + goldfish [X86] Enable the goldfish android emulator platform. 1205 + Don't use this when you are not running on the 1206 + android emulator 1207 + 1204 1208 gpt [EFI] Forces disk with valid GPT signature but 1205 1209 invalid Protective MBR to be treated as GPT. If the 1206 1210 primary GPT is corrupted, it enables the backup/alternate
+13 -1
arch/x86/platform/goldfish/goldfish.c
··· 42 42 } 43 43 }; 44 44 45 + static bool goldfish_enable __initdata; 46 + 47 + static int __init goldfish_setup(char *str) 48 + { 49 + goldfish_enable = true; 50 + return 0; 51 + } 52 + __setup("goldfish", goldfish_setup); 53 + 45 54 static int __init goldfish_init(void) 46 55 { 56 + if (!goldfish_enable) 57 + return -ENODEV; 58 + 47 59 platform_device_register_simple("goldfish_pdev_bus", -1, 48 - goldfish_pdev_bus_resources, 2); 60 + goldfish_pdev_bus_resources, 2); 49 61 return 0; 50 62 } 51 63 device_initcall(goldfish_init);