[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 <[email protected]>
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));
 }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux