x86: Introduce set_desc_base() and set_desc_limit()
Rename set_base()/set_limit to set_desc_base()/set_desc_limit() and rewrite them in C. These are naturally introduced by the idea of get_desc_base()/get_desc_limit(). The conversion actually found the bug in apm_32.c: bad_bios_desc is written at run-time, but it is defined const variable. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> LKML-Reference: <20090718151105.GC11294@localhost.localdomain> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:

committed by
Ingo Molnar

parent
fde0312d01
commit
57594742a2
@@ -55,9 +55,9 @@ __asm__(".text \n"
|
||||
|
||||
#define Q2_SET_SEL(cpu, selname, address, size) \
|
||||
do { \
|
||||
struct desc_struct *gdt = get_cpu_gdt_table((cpu)); \
|
||||
set_base(gdt[(selname) >> 3], (u32)(address)); \
|
||||
set_limit(gdt[(selname) >> 3], size); \
|
||||
struct desc_struct *gdt = get_cpu_gdt_table((cpu)); \
|
||||
set_desc_base(&gdt[(selname) >> 3], (u32)(address)); \
|
||||
set_desc_limit(&gdt[(selname) >> 3], (size) - 1); \
|
||||
} while(0)
|
||||
|
||||
static struct desc_struct bad_bios_desc;
|
||||
@@ -479,16 +479,17 @@ void pnpbios_calls_init(union pnp_bios_install_struct *header)
|
||||
bad_bios_desc.a = 0;
|
||||
bad_bios_desc.b = 0x00409200;
|
||||
|
||||
set_base(bad_bios_desc, __va((unsigned long)0x40 << 4));
|
||||
_set_limit((char *)&bad_bios_desc, 4095 - (0x40 << 4));
|
||||
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)
|
||||
continue;
|
||||
set_base(gdt[GDT_ENTRY_PNPBIOS_CS32], &pnp_bios_callfunc);
|
||||
set_base(gdt[GDT_ENTRY_PNPBIOS_CS16],
|
||||
__va(header->fields.pm16cseg));
|
||||
set_base(gdt[GDT_ENTRY_PNPBIOS_DS],
|
||||
__va(header->fields.pm16dseg));
|
||||
set_desc_base(&gdt[GDT_ENTRY_PNPBIOS_CS32],
|
||||
(unsigned long)&pnp_bios_callfunc);
|
||||
set_desc_base(&gdt[GDT_ENTRY_PNPBIOS_CS16],
|
||||
(unsigned long)__va(header->fields.pm16cseg));
|
||||
set_desc_base(&gdt[GDT_ENTRY_PNPBIOS_DS],
|
||||
(unsigned long)__va(header->fields.pm16dseg));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user