Re: [PATCH] Fix reloading GDT on ACPI S3 wakeup

From: Len Brown
Date: Mon Apr 11 2005 - 12:20:10 EST


I've applied Nickolai's patch -- thanks for the ping.

-Len

On Fri, 2005-04-08 at 12:14, Juerg Billeter wrote:
> Hi
>
> This patch - based on
> http://marc.theaimsgroup.com/?l=linux-kernel&m=110055503031009&w=2 -
> makes ACPI S3 wakeup work for me on a ThinkPad T40p laptop with a SMP
> kernel. Without it only UP kernels work. I've been using the patch for
> three months now without any issues.
>
> The ACPI resume code currently uses a real-mode 16-bit lgdt
> instruction
> to reload the GDT. This only restores the lower 24 bits of the GDT
> base
> address. In recent SMP kernels, the GDT seems to have moved out of
> the
> lower 16 megs, thereby causing the ACPI resume to fail -- an invalid
> GDT
> was being loaded.
>
> Regards,
>
> Juerg
>
> --
> Signed-off-by: Juerg Billeter <juerg@xxxxxxxxx>
>
> diff -uNr linux-2.6.10.orig/arch/i386/kernel/acpi/wakeup.S
> linux-2.6.10/arch/i386/kernel/acpi/wakeup.S
> --- linux-2.6.10.orig/arch/i386/kernel/acpi/wakeup.S 2004-12-24
> 22:34:26.000000000 +0100
> +++ linux-2.6.10/arch/i386/kernel/acpi/wakeup.S 2005-01-08
> 23:34:38.551471486 +0100
> @@ -74,8 +74,9 @@
> movw %ax,%fs
> movw $0x0e00 + 'i', %fs:(0x12)
>
> - # need a gdt
> - lgdt real_save_gdt - wakeup_code
> + # need a gdt -- use lgdtl to force 32-bit operands, in case
> + # the GDT is located past 16 megabytes
> + lgdtl real_save_gdt - wakeup_code
>
> movl real_save_cr0 - wakeup_code, %eax
> movl %eax, %cr0
>
>
>
>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/