x86: Introduce GDT_ENTRY_INIT(), initialize bad_bios_desc statically
authorAkinobu Mita <akinobu.mita@gmail.com>
Sun, 9 Aug 2009 08:03:52 +0000 (17:03 +0900)
committerIngo Molnar <mingo@elte.hu>
Mon, 10 Aug 2009 09:10:52 +0000 (11:10 +0200)
Fully initialize bad_bios_desc statically instead of doing some
fields statically and some dynamically.

Suggested-by: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
LKML-Reference: <20090809080350.GA4765@localhost.localdomain>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/apm_32.c
drivers/pnp/pnpbios/bioscalls.c

index febb2da..39a4462 100644 (file)
@@ -403,7 +403,15 @@ static DECLARE_WAIT_QUEUE_HEAD(apm_waitqueue);
 static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue);
 static struct apm_user *user_list;
 static DEFINE_SPINLOCK(user_list_lock);
-static struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4092, 0, 0);
+
+/*
+ * Set up a segment that references the real mode segment 0x40
+ * that extends up to the end of page zero (that we have reserved).
+ * This is for buggy BIOS's that refer to (real mode) segment 0x40
+ * even though they are called in protected mode.
+ */
+static struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4092,
+                       (unsigned long)__va(0x400UL), PAGE_SIZE - 0x400 - 1);
 
 static const char driver_version[] = "1.16ac"; /* no spaces */
 
@@ -2332,15 +2340,6 @@ static int __init apm_init(void)
        pm_flags |= PM_APM;
 
        /*
-        * Set up a segment that references the real mode segment 0x40
-        * that extends up to the end of page zero (that we have reserved).
-        * This is for buggy BIOS's that refer to (real mode) segment 0x40
-        * even though they are called in protected mode.
-        */
-       set_desc_base(&bad_bios_desc, (unsigned long)__va(0x40UL << 4));
-       set_desc_limit(&bad_bios_desc, 4095 - (0x40 << 4));
-
-       /*
         * Set up the long jump entry point to the APM BIOS, which is called
         * from inline assembly.
         */
index bd035e3..fc83783 100644 (file)
@@ -60,7 +60,8 @@ do { \
        set_desc_limit(&gdt[(selname) >> 3], (size) - 1); \
 } while(0)
 
-static struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4092, 0, 0);
+static struct desc_struct bad_bios_desc = GDT_ENTRY_INIT(0x4092,
+                       (unsigned long)__va(0x400UL), PAGE_SIZE - 0x400 - 1);
 
 /*
  * At some point we want to use this stack frame pointer to unwind
@@ -476,8 +477,6 @@ void pnpbios_calls_init(union pnp_bios_install_struct *header)
        pnp_bios_callpoint.offset = header->fields.pm16offset;
        pnp_bios_callpoint.segment = PNP_CS16;
 
-       set_desc_base(&bad_bios_desc, (unsigned long)__va(0x40UL << 4));
-       set_desc_limit(&bad_bios_desc, 4095 - (0x40 << 4));
        for_each_possible_cpu(i) {
                struct desc_struct *gdt = get_cpu_gdt_table(i);
                if (!gdt)