Commit 14f54697 authored by Pavel Machek's avatar Pavel Machek Committed by Linus Torvalds

[PATCH] Fix suspend-to-RAM in 2.5.20

I created arch/i386/suspend.c not to clash with ACPI people so much in
future. (More stuff is going to move into it in the future, to clean
up functions that really do not belong to the headers.)
parent 5ca5a885
...@@ -24,6 +24,8 @@ obj-$(CONFIG_ACPI_SLEEP) += acpi_wakeup.o ...@@ -24,6 +24,8 @@ obj-$(CONFIG_ACPI_SLEEP) += acpi_wakeup.o
obj-$(CONFIG_SMP) += smp.o smpboot.o trampoline.o obj-$(CONFIG_SMP) += smp.o smpboot.o trampoline.o
obj-$(CONFIG_X86_LOCAL_APIC) += mpparse.o apic.o nmi.o obj-$(CONFIG_X86_LOCAL_APIC) += mpparse.o apic.o nmi.o
obj-$(CONFIG_X86_IO_APIC) += io_apic.o obj-$(CONFIG_X86_IO_APIC) += io_apic.o
obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
obj-$(CONFIG_ACPI_SLEEP) += suspend.o
ifdef CONFIG_VISWS ifdef CONFIG_VISWS
obj-y += setup-visws.o obj-y += setup-visws.o
obj-$(CONFIG_X86_VISWS_APIC) += visws_apic.o obj-$(CONFIG_X86_VISWS_APIC) += visws_apic.o
......
/*
* Suspend support specific for i386.
*
* Distribute under GPLv2
*
* Copyright (c) 2002 Pavel Machek <pavel@suse.cz>
*/
#define ACPI_C
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/spinlock.h>
#include <linux/poll.h>
#include <linux/delay.h>
#include <linux/sysrq.h>
#include <linux/compatmac.h>
#include <linux/proc_fs.h>
#include <linux/irq.h>
#include <linux/pm.h>
#include <linux/device.h>
#include <linux/suspend.h>
#include <asm/uaccess.h>
#include <asm/acpi.h>
void do_suspend_lowlevel(int resume)
{
/*
* FIXME: This function should really be written in assembly. Actually
* requirement is that it does not touch stack, because %esp will be
* wrong during resume before restore_processor_context(). Check
* assembly if you modify this.
*/
if (!resume) {
save_processor_context();
acpi_save_register_state((unsigned long)&&acpi_sleep_done);
acpi_enter_sleep_state(3);
return;
}
acpi_sleep_done:
restore_processor_context();
}
...@@ -260,10 +260,8 @@ acpi_system_suspend( ...@@ -260,10 +260,8 @@ acpi_system_suspend(
u32 state) u32 state)
{ {
acpi_status status = AE_ERROR; acpi_status status = AE_ERROR;
#if 0
unsigned long flags = 0; unsigned long flags = 0;
/* this is very broken, so don't do anything until it's fixed */
save_flags(flags); save_flags(flags);
switch (state) switch (state)
...@@ -289,8 +287,6 @@ acpi_system_suspend( ...@@ -289,8 +287,6 @@ acpi_system_suspend(
fix_processor_context(); fix_processor_context();
restore_flags(flags); restore_flags(flags);
#endif
printk("ACPI: ACPI-based suspend currently broken, aborting\n");
return status; return status;
} }
......
...@@ -294,3 +294,27 @@ static void do_magic(int resume) ...@@ -294,3 +294,27 @@ static void do_magic(int resume)
} }
#endif #endif
#ifdef CONFIG_ACPI_SLEEP
extern unsigned long saved_eip;
extern unsigned long saved_esp;
extern unsigned long saved_ebp;
extern unsigned long saved_ebx;
extern unsigned long saved_esi;
extern unsigned long saved_edi;
static inline void acpi_save_register_state(unsigned long return_point)
{
saved_eip = return_point;
asm volatile ("movl %%esp,(%0)" : "=m" (saved_esp));
asm volatile ("movl %%ebp,(%0)" : "=m" (saved_ebp));
asm volatile ("movl %%ebx,(%0)" : "=m" (saved_ebx));
asm volatile ("movl %%edi,(%0)" : "=m" (saved_edi));
asm volatile ("movl %%esi,(%0)" : "=m" (saved_esi));
}
#define acpi_restore_register_state() do {} while (0)
/* routines for saving/restoring kernel state */
extern int acpi_save_state_mem(void);
extern int acpi_save_state_disk(void);
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment