[PATCH 2/3] Pnp bios gdt fix

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



PnP BIOS for x86 is part of drivers, so I missed it in the initial
GDT page alignment patch.  Kudos to Andrew for fixing that.
Unfortunately, fixing the build introduced a kernel panic when
trying to setup the as of yet unallocated GDTs for the APs.
This fixes the problem by setting only the BSP's GDT, then copying
the PnP segments back to the cpu_gdt_table template.

Signed-off-by: Zachary Amsden <zach@xxxxxxxxxx>
Index: linux-2.6.14-rc2/drivers/pnp/pnpbios/bioscalls.c
===================================================================
--- linux-2.6.14-rc2.orig/drivers/pnp/pnpbios/bioscalls.c	2005-09-28 14:16:34.000000000 -0700
+++ linux-2.6.14-rc2/drivers/pnp/pnpbios/bioscalls.c	2005-09-28 14:23:57.000000000 -0700
@@ -528,17 +528,24 @@ static int pnp_bios_write_escd(char *dat
 
 void pnpbios_calls_init(union pnp_bios_install_struct *header)
 {
-	int i;
 	spin_lock_init(&pnp_bios_lock);
 	pnp_bios_callpoint.offset = header->fields.pm16offset;
 	pnp_bios_callpoint.segment = PNP_CS16;
 
 	set_base(bad_bios_desc, __va((unsigned long)0x40 << 4));
 	_set_limit((char *)&bad_bios_desc, 4095 - (0x40 << 4));
-	for(i=0; i < NR_CPUS; i++)
-	{
-		Q2_SET_SEL(i, PNP_CS32, &pnp_bios_callfunc, 64 * 1024);
-		Q_SET_SEL(i, PNP_CS16, header->fields.pm16cseg, 64 * 1024);
-		Q_SET_SEL(i, PNP_DS, header->fields.pm16dseg, 64 * 1024);
-	}
+
+	/*
+	 * This is awkward; GDT entries needed for this driver must
+	 * be set during init on the BSP, but also copied into the
+	 * cpu_gdt_table template for the APs to acquire.  This is
+	 * because APs will not have allocated GDTs until later in
+	 * the boot process.
+	 */
+	Q2_SET_SEL(0, PNP_CS32, &pnp_bios_callfunc, 64 * 1024);
+	Q_SET_SEL(0, PNP_CS16, header->fields.pm16cseg, 64 * 1024);
+	Q_SET_SEL(0, PNP_DS, header->fields.pm16dseg, 64 * 1024);
+	memcpy(&cpu_gdt_table[GDT_ENTRY_PNPBIOS_BASE],
+		&get_cpu_gdt_table(0)[GDT_ENTRY_PNPBIOS_BASE],
+		3 * sizeof(struct desc_struct));
 }

[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux