lkml.org 
[lkml]   [2003]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] restore sysenter MSRs at resume
Hi!

> Ok. I haven't updated it for 2.5.69 version, but it doesn't look like
> any changes are required. Here is the relevant part of the full swsusp
> patch.

I guess it still needs to be updated for the driver model....


> Regards,
>
> Nigel
>
> On Mon, 2003-05-12 at 07:08, Pavel Machek wrote:
> > Hi!
> >
> > Nigel, perhaps this is the right time for retransmitting the mtrr
> > patch?
> >
> > Pavel
> > >
> > > On Sat, 10 May 2003 mikpe@csd.uu.se wrote:
> > > >
> > > > This patch should be better. It changes apm.c to invoke
> > > > suspend.c's save and restore processor state procedures
> > > > around suspends, which fixes the SYSENTER MSR problem.
> > >
> > > Applied.
> > >
> > > However, the fact that the SYSENTER MSR needs to be restored makes me
> > > suspect that the other MSR/MTRR also will need restoring. I don't see
> > > where we'd be doing that, but it sounds to me like it should be done here
> > > too..
> > >
> > > Linus
>
> diff -ruN linux-2.5.68/arch/i386/kernel/cpu/mtrr/main.c linux-2.5.68-swsusp1925/arch/i386/kernel/cpu/mtrr/main.c
> --- linux-2.5.68/arch/i386/kernel/cpu/mtrr/main.c 2003-01-15 17:00:38.000000000 +1300
> +++ linux-2.5.68-swsusp1925/arch/i386/kernel/cpu/mtrr/main.c 2003-04-25 14:13:05.000000000 +1200
> @@ -35,6 +35,7 @@
> #include <linux/init.h>
> #include <linux/pci.h>
> #include <linux/smp.h>
> +#include <linux/suspend.h>
>
> #include <asm/mtrr.h>
>
> @@ -644,6 +645,65 @@
> "write-protect", /* 5 */
> "write-back", /* 6 */
> };
> -
> +
> +#ifdef SOFTWARE_SUSPEND_MTRR
> +struct mtrr_suspend_state
> +{
> + mtrr_type ltype;
> + unsigned long lbase;
> + unsigned int lsize;
> +};
> +/* We return a pointer ptr on an area of *ptr bytes
> + beginning at ptr+sizeof(int)
> + This buffer has to be saved in some way during suspension */
> +int *mtrr_suspend(void)
> +{
> + int i, len;
> + int *ptr = NULL;
> + static struct mtrr_suspend_state *mtrr_suspend_buffer=NULL;
> +
> + if(!mtrr_suspend_buffer)
> + {
> + len = num_var_ranges * sizeof (struct mtrr_suspend_state) + sizeof(int);
> + ptr = kmalloc (len, GFP_KERNEL);
> + if (ptr == NULL)
> + return(NULL);
> + *ptr = len;
> + ptr++;
> + mtrr_suspend_buffer = (struct mtrr_suspend_state *)ptr;
> + ptr--;
> + }
> + for (i = 0; i < num_var_ranges; ++i,mtrr_suspend_buffer++)
> + mtrr_if->get (i,
> + &(mtrr_suspend_buffer->lbase),
> + &(mtrr_suspend_buffer->lsize),
> + &(mtrr_suspend_buffer->ltype));
> + return(ptr);
> +}
> +
> +/* We restore mtrrs from buffer ptr */
> +void mtrr_resume(int *ptr)
> +{
> + int i, len;
> + struct mtrr_suspend_state *mtrr_suspend_buffer;
> +
> + len = num_var_ranges * sizeof (struct mtrr_suspend_state) + sizeof(int);
> + if(*ptr != len)
> + {
> + printk ("mtrr: Resuming failed due to different number of MTRRs\n");
> + return;
> + }
> + ptr++;
> + mtrr_suspend_buffer=(struct mtrr_suspend_state *)ptr;
> + for (i = 0; i < num_var_ranges; ++i,mtrr_suspend_buffer++)
> + if (mtrr_suspend_buffer->lsize)
> + set_mtrr(i,
> + mtrr_suspend_buffer->lbase,
> + mtrr_suspend_buffer->lsize,
> + mtrr_suspend_buffer->ltype);
> +}
> +EXPORT_SYMBOL(mtrr_suspend);
> +EXPORT_SYMBOL(mtrr_resume);
> +#endif
> core_initcall(mtrr_init);
>
>
>

--
Horseback riding is like software...
...vgf orggre jura vgf serr.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:35    [W:0.125 / U:0.476 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site