Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-13 Thread Bill Davidsen

H. Peter Anvin wrote:

Rafael J. Wysocki wrote:
The asm() for making beeps really need to be moved to a function and 
cleaned up (redone in C using inb()/outb()) if they are to be 
retained at all.


Yes, they are.  For some people they're the only tool to debug broken 
resume.


That's fine, but they should get cleaned up.

/me is tempted to provide a version which can send messages in Morse 
Code ;)



Thought someone did that a while ago. Alan Cox, maybe.

--
Bill Davidsen <[EMAIL PROTECTED]>
  "We have more to fear from the bungling of the incompetent than from
the machinations of the wicked."  - from Slashdot
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-13 Thread Bill Davidsen

H. Peter Anvin wrote:

Rafael J. Wysocki wrote:
The asm() for making beeps really need to be moved to a function and 
cleaned up (redone in C using inb()/outb()) if they are to be 
retained at all.


Yes, they are.  For some people they're the only tool to debug broken 
resume.


That's fine, but they should get cleaned up.

/me is tempted to provide a version which can send messages in Morse 
Code ;)



Thought someone did that a while ago. Alan Cox, maybe.

--
Bill Davidsen [EMAIL PROTECTED]
  We have more to fear from the bungling of the incompetent than from
the machinations of the wicked.  - from Slashdot
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-10 Thread Sam Ravnborg
On Sun, Feb 10, 2008 at 10:14:57PM +0100, Pavel Machek wrote:
> On Fri 2008-02-08 16:32:08, H. Peter Anvin wrote:
> > Rafael J. Wysocki wrote:
> >>
> >> Consolidated patch is appended.  I'll test it tomorrow on x86-64.
> >>
> >> I'd like to add the cleaned up beeping code to it and perhaps try to push 
> >> it
> >> for -mm testing without any further changes.  We can still do more 
> >> cleanups in
> >> followup patches.
> >>
> >
> > The other thing to figure out is to what extent we can clean up the 
> > conditionals in the video mode code by refactoring.  All they really do 
> > here is save space by removing functionality not needed for wakeup, because 
> > I didn't know how much space was realistic.
> >
> > It's possible we can remove them altogether by having a dummy boot_params 
> > structure (4K).
> 
> I'd say that few #ifdefs are acceptable if we save 4K, but...
> 
> Sam... is there something that urgently needs fixing?

I will prepare some build system bits later.
So please use what you have today and I can always clean it up
when I have something better.

So for the bits I have competence in - no issues.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-10 Thread Pavel Machek
On Fri 2008-02-08 16:32:08, H. Peter Anvin wrote:
> Rafael J. Wysocki wrote:
>>
>> Consolidated patch is appended.  I'll test it tomorrow on x86-64.
>>
>> I'd like to add the cleaned up beeping code to it and perhaps try to push it
>> for -mm testing without any further changes.  We can still do more cleanups 
>> in
>> followup patches.
>>
>
> The other thing to figure out is to what extent we can clean up the 
> conditionals in the video mode code by refactoring.  All they really do 
> here is save space by removing functionality not needed for wakeup, because 
> I didn't know how much space was realistic.
>
> It's possible we can remove them altogether by having a dummy boot_params 
> structure (4K).

I'd say that few #ifdefs are acceptable if we save 4K, but...

Sam... is there something that urgently needs fixing?
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-10 Thread Sam Ravnborg
On Sun, Feb 10, 2008 at 10:14:57PM +0100, Pavel Machek wrote:
 On Fri 2008-02-08 16:32:08, H. Peter Anvin wrote:
  Rafael J. Wysocki wrote:
 
  Consolidated patch is appended.  I'll test it tomorrow on x86-64.
 
  I'd like to add the cleaned up beeping code to it and perhaps try to push 
  it
  for -mm testing without any further changes.  We can still do more 
  cleanups in
  followup patches.
 
 
  The other thing to figure out is to what extent we can clean up the 
  conditionals in the video mode code by refactoring.  All they really do 
  here is save space by removing functionality not needed for wakeup, because 
  I didn't know how much space was realistic.
 
  It's possible we can remove them altogether by having a dummy boot_params 
  structure (4K).
 
 I'd say that few #ifdefs are acceptable if we save 4K, but...
 
 Sam... is there something that urgently needs fixing?

I will prepare some build system bits later.
So please use what you have today and I can always clean it up
when I have something better.

So for the bits I have competence in - no issues.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-10 Thread Pavel Machek
On Fri 2008-02-08 16:32:08, H. Peter Anvin wrote:
 Rafael J. Wysocki wrote:

 Consolidated patch is appended.  I'll test it tomorrow on x86-64.

 I'd like to add the cleaned up beeping code to it and perhaps try to push it
 for -mm testing without any further changes.  We can still do more cleanups 
 in
 followup patches.


 The other thing to figure out is to what extent we can clean up the 
 conditionals in the video mode code by refactoring.  All they really do 
 here is save space by removing functionality not needed for wakeup, because 
 I didn't know how much space was realistic.

 It's possible we can remove them altogether by having a dummy boot_params 
 structure (4K).

I'd say that few #ifdefs are acceptable if we save 4K, but...

Sam... is there something that urgently needs fixing?
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-09 Thread Rafael J. Wysocki
On Saturday, 9 of February 2008, H. Peter Anvin wrote:
> Rafael J. Wysocki wrote:
> > 
> > Consolidated patch is appended.  I'll test it tomorrow on x86-64.
> > 
> > I'd like to add the cleaned up beeping code to it and perhaps try to push it
> > for -mm testing without any further changes.  We can still do more cleanups 
> > in
> > followup patches.
> > 
> 
> The other thing to figure out is to what extent we can clean up the 
> conditionals in the video mode code by refactoring.  All they really do 
> here is save space by removing functionality not needed for wakeup, 
> because I didn't know how much space was realistic.

OK, I have an idea.

For now, below is a patch that adds your beeping code to wakemain.c (on top of
the previous one). ;-)

Rafael

---
 arch/x86/kernel/acpi/realmode/wakemain.c |   69 ---
 1 file changed, 63 insertions(+), 6 deletions(-)

Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakemain.c
===
--- linux-2.6.orig/arch/x86/kernel/acpi/realmode/wakemain.c
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakemain.c
@@ -3,20 +3,77 @@
 
 extern volatile struct wakeup_header wakeup_header;
 
+static void udelay(int loops)
+{
+   while (loops--)
+   io_delay(); /* Approximately 1 us */
+}
+
+static void beep(unsigned int hz)
+{
+   u8 enable;
+
+   if (!hz) {
+   enable = 0x00;  /* Turn off speaker */
+   } else {
+   u16 div = 1193181/hz;
+
+   outb(0xb6, 0x43);   /* Ctr 2, squarewave, load, binary */
+   io_delay();
+   outb(div, 0x42);/* LSB of counter */
+   io_delay();
+   outb(div >> 8, 0x42);   /* MSB of counter */
+   io_delay();
+
+   enable = 0x03;  /* Turn on speaker */
+   }
+   inb(0x61);  /* Dummy read of System Control Port B */
+   io_delay();
+   outb(enable, 0x61); /* Enable timer 2 output to speaker */
+   io_delay();
+}
+
+#define DOT_HZ 880
+#define DASH_HZ587
+#define US_PER_DOT 125000
+
+/* Okay, this is totally silly, but it's kind of fun. */
+static void send_morse(const char *pattern)
+{
+   char s;
+
+   while ((s = *pattern++)) {
+   switch (s) {
+   case '.':
+   beep(DOT_HZ);
+   udelay(US_PER_DOT);
+   beep(0);
+   udelay(US_PER_DOT);
+   break;
+   case '-':
+   beep(DASH_HZ);
+   udelay(US_PER_DOT * 3);
+   beep(0);
+   udelay(US_PER_DOT);
+   break;
+   default:/* Assume it's a space */
+   udelay(US_PER_DOT * 3);
+   break;
+   }
+   }
+}
+
 void main(void)
 {
/* Kill machine if structures are wrong */
if (wakeup_header.real_magic != 0x12345678)
while(1);
 
-   if (wakeup_header.realmode_flags & 4) {
-   asm volatile("inb   $97, %al;   outb%al, 
$0x80; movb$3, %al;outb%al, $97;
   outb%al, $0x80; movb$-74, %al;  outb%al, 
$67;   outb%al, $0x80; movb$-119, %al;  
   outb%al, $66;   outb%al, $0x80; movb$15, 
%al;   outb%al, $66");
-   }
+   if (wakeup_header.realmode_flags & 4)
+   send_morse("...-");
 
-   if (wakeup_header.realmode_flags & 1) {
+   if (wakeup_header.realmode_flags & 1)
asm volatile("lcallw   $0xc000,$3");
-// ("movw%cs, %ax; movw%ax, %ds;   movw%ax, 
%es; movw%ax, %ss");
-   }
 
if (wakeup_header.realmode_flags & 2) {
/* Need to call BIOS */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-09 Thread Rafael J. Wysocki
On Saturday, 9 of February 2008, H. Peter Anvin wrote:
 Rafael J. Wysocki wrote:
  
  Consolidated patch is appended.  I'll test it tomorrow on x86-64.
  
  I'd like to add the cleaned up beeping code to it and perhaps try to push it
  for -mm testing without any further changes.  We can still do more cleanups 
  in
  followup patches.
  
 
 The other thing to figure out is to what extent we can clean up the 
 conditionals in the video mode code by refactoring.  All they really do 
 here is save space by removing functionality not needed for wakeup, 
 because I didn't know how much space was realistic.

OK, I have an idea.

For now, below is a patch that adds your beeping code to wakemain.c (on top of
the previous one). ;-)

Rafael

---
 arch/x86/kernel/acpi/realmode/wakemain.c |   69 ---
 1 file changed, 63 insertions(+), 6 deletions(-)

Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakemain.c
===
--- linux-2.6.orig/arch/x86/kernel/acpi/realmode/wakemain.c
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakemain.c
@@ -3,20 +3,77 @@
 
 extern volatile struct wakeup_header wakeup_header;
 
+static void udelay(int loops)
+{
+   while (loops--)
+   io_delay(); /* Approximately 1 us */
+}
+
+static void beep(unsigned int hz)
+{
+   u8 enable;
+
+   if (!hz) {
+   enable = 0x00;  /* Turn off speaker */
+   } else {
+   u16 div = 1193181/hz;
+
+   outb(0xb6, 0x43);   /* Ctr 2, squarewave, load, binary */
+   io_delay();
+   outb(div, 0x42);/* LSB of counter */
+   io_delay();
+   outb(div  8, 0x42);   /* MSB of counter */
+   io_delay();
+
+   enable = 0x03;  /* Turn on speaker */
+   }
+   inb(0x61);  /* Dummy read of System Control Port B */
+   io_delay();
+   outb(enable, 0x61); /* Enable timer 2 output to speaker */
+   io_delay();
+}
+
+#define DOT_HZ 880
+#define DASH_HZ587
+#define US_PER_DOT 125000
+
+/* Okay, this is totally silly, but it's kind of fun. */
+static void send_morse(const char *pattern)
+{
+   char s;
+
+   while ((s = *pattern++)) {
+   switch (s) {
+   case '.':
+   beep(DOT_HZ);
+   udelay(US_PER_DOT);
+   beep(0);
+   udelay(US_PER_DOT);
+   break;
+   case '-':
+   beep(DASH_HZ);
+   udelay(US_PER_DOT * 3);
+   beep(0);
+   udelay(US_PER_DOT);
+   break;
+   default:/* Assume it's a space */
+   udelay(US_PER_DOT * 3);
+   break;
+   }
+   }
+}
+
 void main(void)
 {
/* Kill machine if structures are wrong */
if (wakeup_header.real_magic != 0x12345678)
while(1);
 
-   if (wakeup_header.realmode_flags  4) {
-   asm volatile(inb   $97, %al;   outb%al, 
$0x80; movb$3, %al;outb%al, $97;
   outb%al, $0x80; movb$-74, %al;  outb%al, 
$67;   outb%al, $0x80; movb$-119, %al;  
   outb%al, $66;   outb%al, $0x80; movb$15, 
%al;   outb%al, $66);
-   }
+   if (wakeup_header.realmode_flags  4)
+   send_morse(...-);
 
-   if (wakeup_header.realmode_flags  1) {
+   if (wakeup_header.realmode_flags  1)
asm volatile(lcallw   $0xc000,$3);
-// (movw%cs, %ax; movw%ax, %ds;   movw%ax, 
%es; movw%ax, %ss);
-   }
 
if (wakeup_header.realmode_flags  2) {
/* Need to call BIOS */
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Rafael J. Wysocki wrote:


Consolidated patch is appended.  I'll test it tomorrow on x86-64.

I'd like to add the cleaned up beeping code to it and perhaps try to push it
for -mm testing without any further changes.  We can still do more cleanups in
followup patches.



The other thing to figure out is to what extent we can clean up the 
conditionals in the video mode code by refactoring.  All they really do 
here is save space by removing functionality not needed for wakeup, 
because I didn't know how much space was realistic.


It's possible we can remove them altogether by having a dummy 
boot_params structure (4K).


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
> On Fri 2008-02-08 23:01:51, Rafael J. Wysocki wrote:
> > On Friday, 8 of February 2008, Pavel Machek wrote:
> > > Hi!
> > > 
> > > Rafael, this is for you.
> > 
> > Thanks.
> > 
> > > My cleanups, relative to your cleanup patch. You may need manual patching
> > > around rep/stosd.
> > 
> > OK, I'll try to merge it.
> 
> For the record, now it is even tested on 32-bit and test-compiled on
> 64-bit.

Consolidated patch is appended.  I'll test it tomorrow on x86-64.

I'd like to add the cleaned up beeping code to it and perhaps try to push it
for -mm testing without any further changes.  We can still do more cleanups in
followup patches.

Thanks,
Rafael


---
 arch/x86/boot/Makefile |2 
 arch/x86/boot/boot.h   |5 
 arch/x86/boot/video-bios.c |6 
 arch/x86/boot/video-mode.c |  173 
 arch/x86/boot/video-vesa.c |8 
 arch/x86/boot/video-vga.c  |   12 -
 arch/x86/boot/video.c  |  157 --
 arch/x86/kernel/acpi/Makefile  |9 
 arch/x86/kernel/acpi/realmode/Makefile |   58 +
 arch/x86/kernel/acpi/realmode/copy.S   |1 
 arch/x86/kernel/acpi/realmode/video-bios.c |1 
 arch/x86/kernel/acpi/realmode/video-mode.c |1 
 arch/x86/kernel/acpi/realmode/video-vesa.c |1 
 arch/x86/kernel/acpi/realmode/video-vga.c  |1 
 arch/x86/kernel/acpi/realmode/wakemain.c   |   26 ++
 arch/x86/kernel/acpi/realmode/wakeup.S |  113 ++
 arch/x86/kernel/acpi/realmode/wakeup.h |   35 +++
 arch/x86/kernel/acpi/realmode/wakeup.lds.S |   61 +
 arch/x86/kernel/acpi/sleep.c   |   80 ++-
 arch/x86/kernel/acpi/wakeup_32.S   |  245 +-
 arch/x86/kernel/acpi/wakeup_64.S   |  313 -
 arch/x86/kernel/acpi/wakeup_rm.S   |   10 
 arch/x86/kernel/head_64.S  |4 
 arch/x86/kernel/setup_32.c |4 
 arch/x86/kernel/smpboot_64.c   |   10 
 25 files changed, 624 insertions(+), 712 deletions(-)

Index: linux-2.6/arch/x86/boot/Makefile
===
--- linux-2.6.orig/arch/x86/boot/Makefile
+++ linux-2.6/arch/x86/boot/Makefile
@@ -30,7 +30,7 @@ subdir-   := compressed
 
 setup-y+= a20.o cmdline.o copy.o cpu.o cpucheck.o edd.o
 setup-y+= header.o main.o mca.o memory.o pm.o pmjump.o
-setup-y+= printf.o string.o tty.o video.o version.o
+setup-y+= printf.o string.o tty.o video.o video-mode.o 
version.o
 setup-$(CONFIG_X86_APM_BOOT) += apm.o
 setup-$(CONFIG_X86_VOYAGER) += voyager.o
 
Index: linux-2.6/arch/x86/boot/boot.h
===
--- linux-2.6.orig/arch/x86/boot/boot.h
+++ linux-2.6/arch/x86/boot/boot.h
@@ -286,6 +286,11 @@ int getchar_timeout(void);
 /* video.c */
 void set_video(void);
 
+/* video-mode.c */
+int set_mode(u16 mode);
+int mode_defined(u16 mode);
+void probe_cards(int unsafe);
+
 /* video-vesa.c */
 void vesa_store_edid(void);
 
Index: linux-2.6/arch/x86/boot/video-bios.c
===
--- linux-2.6.orig/arch/x86/boot/video-bios.c
+++ linux-2.6/arch/x86/boot/video-bios.c
@@ -50,6 +50,7 @@ static int set_bios_mode(u8 mode)
if (new_mode == mode)
return 0;   /* Mode change OK */
 
+#ifndef _WAKEUP
if (new_mode != boot_params.screen_info.orig_video_mode) {
/* Mode setting failed, but we didn't end up where we
   started.  That's bad.  Try to revert to the original
@@ -59,13 +60,18 @@ static int set_bios_mode(u8 mode)
 : "+a" (ax)
 : : "ebx", "ecx", "edx", "esi", "edi");
}
+#endif
return -1;
 }
 
 static int bios_probe(void)
 {
u8 mode;
+#ifdef _WAKEUP
+   u8 saved_mode = 0x03;
+#else
u8 saved_mode = boot_params.screen_info.orig_video_mode;
+#endif
u16 crtc;
struct mode_info *mi;
int nmodes = 0;
Index: linux-2.6/arch/x86/boot/video-mode.c
===
--- /dev/null
+++ linux-2.6/arch/x86/boot/video-mode.c
@@ -0,0 +1,173 @@
+/* -*- linux-c -*- --- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007-2008 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * --- */
+
+/*
+ * arch/i386/boot/video-mode.c
+ *
+ * Set the video mode.  This is separated out into a different
+ * file in order to be shared with the ACPI 

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 23:01:51, Rafael J. Wysocki wrote:
> On Friday, 8 of February 2008, Pavel Machek wrote:
> > Hi!
> > 
> > Rafael, this is for you.
> 
> Thanks.
> 
> > My cleanups, relative to your cleanup patch. You may need manual patching
> > around rep/stosd.
> 
> OK, I'll try to merge it.

For the record, now it is even tested on 32-bit and test-compiled on
64-bit.

Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
> Hi!
> 
> Rafael, this is for you.

Thanks.

> My cleanups, relative to your cleanup patch. You may need manual patching
> around rep/stosd.

OK, I'll try to merge it.

Rafael


> diff --git a/arch/x86/kernel/acpi/realmode/Makefile 
> b/arch/x86/kernel/acpi/realmode/Makefile
> index b239f0f..0e4742b 100644
> --- a/arch/x86/kernel/acpi/realmode/Makefile
> +++ b/arch/x86/kernel/acpi/realmode/Makefile
> @@ -46,7 +46,10 @@ KBUILD_AFLAGS  := $(KBUILD_CFLAGS) -D__AS
>  WAKEUP_OBJS = $(addprefix $(obj)/,$(wakeup-y))
>  
>  LDFLAGS_wakeup.elf   := -T
> -$(obj)/wakeup.elf: $(src)/wakeup.ld $(WAKEUP_OBJS) FORCE
> +
> +CPPFLAGS_wakeup.lds += -P -C
> +
> +$(obj)/wakeup.elf: $(src)/wakeup.lds $(WAKEUP_OBJS) FORCE
>   $(call if_changed,ld)
>  
>  OBJCOPYFLAGS_wakeup.bin  := -O binary
> diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S 
> b/arch/x86/kernel/acpi/realmode/wakeup.S
> index 26145c0..edff763 100644
> --- a/arch/x86/kernel/acpi/realmode/wakeup.S
> +++ b/arch/x86/kernel/acpi/realmode/wakeup.S
> @@ -56,14 +56,6 @@ _start:
>   cmpl$0x65a22c82, %eax
>   jne bogus_real_magic
>  
> - /* Zero the bss */
> - xorl%eax, %eax
> - movw$__bss_start, %di
> - movw$__bss_end + 3, %cx
> - subw%di, %cx
> - shrw$2, %cx
> - rep; stosl
> -
>   /* Call the C code */
>   calll   main
>  
> diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h 
> b/arch/x86/kernel/acpi/realmode/wakeup.h
> index 4a26e27..6a49435 100644
> --- a/arch/x86/kernel/acpi/realmode/wakeup.h
> +++ b/arch/x86/kernel/acpi/realmode/wakeup.h
> @@ -6,12 +6,11 @@
>  #ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
>  #define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
>  
> +#ifndef __ASSEMBLY__
>  #include 
>  
>  /* This must match data at wakeup.S */
>  struct wakeup_header {
> - u16 entry;  /* unused */
> - u16 total;  /* unused */
>   u16 video_mode; /* Video mode number */
>   u16 _jmp1;
>   u32 pmode_entry;/* Protected mode resume point */
> @@ -27,5 +26,10 @@ struct wakeup_header {
>   u16 trampoline_segment;
>   u32 signature;  /* To check we have correct structure */
>  } __attribute__((__packed__));
> +#endif
> +
> +#define HEADER_OFFSET 0x3f00
> +#define WAKEUP_SIZE   0x4000
> +
>  
>  #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
> diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
> b/arch/x86/kernel/acpi/realmode/wakeup.ld
> deleted file mode 100644
> index 5dff2f0..000
> --- a/arch/x86/kernel/acpi/realmode/wakeup.ld
> +++ /dev/null
> @@ -1,51 +0,0 @@
> -/*
> - * wakeup.ld
> - *
> - * Linker script for the real-mode wakeup code
> - */
> -OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
> -OUTPUT_ARCH(i386)
> -ENTRY(_start)
> -
> -SECTIONS
> -{
> - . = 0x3f00;
> - .header : { *(.header) }
> -
> - . = 0;
> - .text   : { *(.text*) }
> -
> - . = ALIGN(16);
> - .rodata : { *(.rodata*) }
> -
> - .videocards : {
> - video_cards = .;
> - *(.videocards)
> - video_cards_end = .;
> - }
> -
> - . = ALIGN(16);
> - .data   : { *(.data*) }
> -
> - .signature  : {
> - end_signature = .;
> - LONG(0x65a22c82)
> - }
> -
> - . = ALIGN(16);
> - .bss:
> - {
> - __bss_start = .;
> - *(.bss)
> - __bss_end = .;
> - }
> -
> - . = ALIGN(16);
> - _end = .;
> -
> - /DISCARD/ : { *(.note*) }
> -
> - /* Adjust this as appropriate */
> - /* This allows 4 pages (16K) */
> - . = ASSERT(_end <= 0x4000, "Wakeup too big!");
> -}
> diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S 
> b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
> new file mode 100644
> index 000..22fab6c
> --- /dev/null
> +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
> @@ -0,0 +1,61 @@
> +/*
> + * wakeup.ld
> + *
> + * Linker script for the real-mode wakeup code
> + */
> +#undef i386
> +#include "wakeup.h"
> +
> +OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
> +OUTPUT_ARCH(i386)
> +ENTRY(_start)
> +
> +SECTIONS
> +{
> + . = HEADER_OFFSET;
> + .header : {
> +  *(.header)
> + }
> +
> + . = 0;
> + .text : {
> +  *(.text*)
> + }
> +
> + . = ALIGN(16);
> + .rodata : {
> + *(.rodata*)
> + }
> +
> + .videocards : {
> + video_cards = .;
> + *(.videocards)
> + video_cards_end = .;
> + }
> +
> + . = ALIGN(16);
> + .data : {
> +  *(.data*)
> + }
> +
> + .signature : {
> + end_signature = .;
> + LONG(0x65a22c82)
> + }
> +
> + . = ALIGN(16);
> + .bss :  {
> + __bss_start = .;
> + *(.bss)
> + __bss_end = .;
> + }
> +
> + . = ALIGN(16);
> + _end = .;
> +
> 

Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 22:56:08, Rafael J. Wysocki wrote:
> On Friday, 8 of February 2008, Pavel Machek wrote:
> > On Fri 2008-02-08 13:27:30, H. Peter Anvin wrote:
> > > Pavel Machek wrote:
> > >>
> > >> See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
> > >> to the list). No problem there, but table stored at nonzero
> > >> offset. Short jump at the beggining of table would fix it (ugly).
> > >>
> > >
> > > Ugly, but it's the standard way to deal.  We have it in the bzImage 
> > > format, 
> > > too.
> > 
> > I'd prefer to keep it as it is, there are no problems.
> > 
> > This way, we can put debugging instructions at the first byte of
> > wakeup code, which is somehow important.
> > 
> > Plus, with right #defines, it should be clean enough.
> 
> Well, I don't know how to evaluate #defines in *.ld files ...

See a patch in your inbox :-). Sam told me how to do it.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
> On Fri 2008-02-08 13:27:30, H. Peter Anvin wrote:
> > Pavel Machek wrote:
> >>
> >> See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
> >> to the list). No problem there, but table stored at nonzero
> >> offset. Short jump at the beggining of table would fix it (ugly).
> >>
> >
> > Ugly, but it's the standard way to deal.  We have it in the bzImage format, 
> > too.
> 
> I'd prefer to keep it as it is, there are no problems.
> 
> This way, we can put debugging instructions at the first byte of
> wakeup code, which is somehow important.
> 
> Plus, with right #defines, it should be clean enough.

Well, I don't know how to evaluate #defines in *.ld files ...

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

Rafael, this is for you. My cleanups, relative to your cleanup
patch. You may need manual patching around rep/stosd.

Pavel

diff --git a/arch/x86/kernel/acpi/realmode/Makefile 
b/arch/x86/kernel/acpi/realmode/Makefile
index b239f0f..0e4742b 100644
--- a/arch/x86/kernel/acpi/realmode/Makefile
+++ b/arch/x86/kernel/acpi/realmode/Makefile
@@ -46,7 +46,10 @@ KBUILD_AFLAGS:= $(KBUILD_CFLAGS) -D__AS
 WAKEUP_OBJS = $(addprefix $(obj)/,$(wakeup-y))
 
 LDFLAGS_wakeup.elf := -T
-$(obj)/wakeup.elf: $(src)/wakeup.ld $(WAKEUP_OBJS) FORCE
+
+CPPFLAGS_wakeup.lds += -P -C
+
+$(obj)/wakeup.elf: $(src)/wakeup.lds $(WAKEUP_OBJS) FORCE
$(call if_changed,ld)
 
 OBJCOPYFLAGS_wakeup.bin:= -O binary
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S 
b/arch/x86/kernel/acpi/realmode/wakeup.S
index 26145c0..edff763 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.S
+++ b/arch/x86/kernel/acpi/realmode/wakeup.S
@@ -56,14 +56,6 @@ _start:
cmpl$0x65a22c82, %eax
jne bogus_real_magic
 
-   /* Zero the bss */
-   xorl%eax, %eax
-   movw$__bss_start, %di
-   movw$__bss_end + 3, %cx
-   subw%di, %cx
-   shrw$2, %cx
-   rep; stosl
-
/* Call the C code */
calll   main
 
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h 
b/arch/x86/kernel/acpi/realmode/wakeup.h
index 4a26e27..6a49435 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.h
+++ b/arch/x86/kernel/acpi/realmode/wakeup.h
@@ -6,12 +6,11 @@
 #ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 #define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 
+#ifndef __ASSEMBLY__
 #include 
 
 /* This must match data at wakeup.S */
 struct wakeup_header {
-   u16 entry;  /* unused */
-   u16 total;  /* unused */
u16 video_mode; /* Video mode number */
u16 _jmp1;
u32 pmode_entry;/* Protected mode resume point */
@@ -27,5 +26,10 @@ struct wakeup_header {
u16 trampoline_segment;
u32 signature;  /* To check we have correct structure */
 } __attribute__((__packed__));
+#endif
+
+#define HEADER_OFFSET 0x3f00
+#define WAKEUP_SIZE   0x4000
+
 
 #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
b/arch/x86/kernel/acpi/realmode/wakeup.ld
deleted file mode 100644
index 5dff2f0..000
--- a/arch/x86/kernel/acpi/realmode/wakeup.ld
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * wakeup.ld
- *
- * Linker script for the real-mode wakeup code
- */
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-   . = 0x3f00;
-   .header : { *(.header) }
-
-   . = 0;
-   .text   : { *(.text*) }
-
-   . = ALIGN(16);
-   .rodata : { *(.rodata*) }
-
-   .videocards : {
-   video_cards = .;
-   *(.videocards)
-   video_cards_end = .;
-   }
-
-   . = ALIGN(16);
-   .data   : { *(.data*) }
-
-   .signature  : {
-   end_signature = .;
-   LONG(0x65a22c82)
-   }
-
-   . = ALIGN(16);
-   .bss:
-   {
-   __bss_start = .;
-   *(.bss)
-   __bss_end = .;
-   }
-
-   . = ALIGN(16);
-   _end = .;
-
-   /DISCARD/ : { *(.note*) }
-
-   /* Adjust this as appropriate */
-   /* This allows 4 pages (16K) */
-   . = ASSERT(_end <= 0x4000, "Wakeup too big!");
-}
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S 
b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
new file mode 100644
index 000..22fab6c
--- /dev/null
+++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
@@ -0,0 +1,61 @@
+/*
+ * wakeup.ld
+ *
+ * Linker script for the real-mode wakeup code
+ */
+#undef i386
+#include "wakeup.h"
+
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+   . = HEADER_OFFSET;
+   .header : {
+*(.header)
+   }
+
+   . = 0;
+   .text : {
+*(.text*)
+   }
+
+   . = ALIGN(16);
+   .rodata : {
+   *(.rodata*)
+   }
+
+   .videocards : {
+   video_cards = .;
+   *(.videocards)
+   video_cards_end = .;
+   }
+
+   . = ALIGN(16);
+   .data : {
+*(.data*)
+   }
+
+   .signature : {
+   end_signature = .;
+   LONG(0x65a22c82)
+   }
+
+   . = ALIGN(16);
+   .bss :  {
+   __bss_start = .;
+   *(.bss)
+   __bss_end = .;
+   }
+
+   . = ALIGN(16);
+   _end = .;
+
+   /DISCARD/ : {
+   *(.note*)
+   }
+
+   . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!");
+}
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 1b282b1..561565e 100644
--- 

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

>> +.section ".header", "a"
>> +
>> +/* This should match the structure in wakeup.h */
>> +.globl  wakeup_header
>> +wakeup_header:
>> +video_mode: .short  0   /* Video mode number */
>> +pmode_return:   .byte   0x66, 0xea  /* ljmpl */
>> +.long   0   /* offset goes here */
>> +.short  __KERNEL_CS
>
> Missing a .short pad here... Pavel fixed that at some point, I thought.

No pad needed, AFAICT.

>>  }
>> -memcpy((void *)acpi_wakeup_address, _start,
>> -   _end - _start);
>> -acpi_copy_wakeup_routine(acpi_wakeup_address);
>> +memcpy((void *)acpi_realmode, _code_start, 4*PAGE_SIZE);
>
> Using a PAGE_SIZE multiplier here isn't a good thing...

Fixed.

>> +header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
>
> ... especially not with magic constants like this.

Fixed.

> If you're putting the "header" at the end, then you should also replace the 
> end_signature stuff since that's, then, redundant.  Furthermore, by doing 
> so, you're also padding the binary out to its maximum length, so you might 
> as well just remove the .bss-clearing stuff.

Good, lets remove bss clearing.

>> +header->pmode_efer_low = nx_enabled;
>> +if (header->pmode_efer_low & 1) {
>> +/* This is strange, why not save efer, always? */
>> +rdmsr(MSR_EFER, header->pmode_efer_low,
>> +header->pmode_efer_high);
>> +}
>
> Yes, why not save EFER every time?

Dunno, I copied it from other code, and as it depends on nx setting,
I'd prefer not to touch it for now. Do old CPUs have EFER?

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

> I remember that I did about 1500 reboots to try to fix this.
> (According to hard disk's 'smart' statistics)

Poor you.

> Suggestion: the speaker usually is quite loud, thus it can be annoying to use
> for morse code or so.
> Why not to use keyboard leds for this purpose?
> (USB keyboard probably isn't an option, but user can always pull an old PC 
> keyboard
> out of closet, and use it)

IIRC keyboard leds are quite hard to drive, plus decoding audible
morse is easier than blinkenlights...
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

This cleans up .lds, making use of constants...

Pavel

diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h 
b/arch/x86/kernel/acpi/realmode/wakeup.h
index 4a26e27..ee7c68b 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.h
+++ b/arch/x86/kernel/acpi/realmode/wakeup.h
@@ -6,6 +6,7 @@
 #ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 #define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 
+#ifndef __ASSEMBLY__
 #include 
 
 /* This must match data at wakeup.S */
@@ -27,5 +28,10 @@ struct wakeup_header {
u16 trampoline_segment;
u32 signature;  /* To check we have correct structure */
 } __attribute__((__packed__));
+#endif
+
+#define HEADER_OFFSET 0x3f00
+#define WAKEUP_SIZE   0x4000
+
 
 #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S 
b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
index 24ebe75..22fab6c 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S
+++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
@@ -4,6 +4,7 @@
  * Linker script for the real-mode wakeup code
  */
 #undef i386
+#include "wakeup.h"
 
 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
 OUTPUT_ARCH(i386)
@@ -11,7 +12,7 @@ ENTRY(_start)
 
 SECTIONS
 {
-   . = 0x3f00;
+   . = HEADER_OFFSET;
.header : {
 *(.header)
}
@@ -56,7 +57,5 @@ SECTIONS
*(.note*)
}
 
-   /* Adjust this as appropriate */
-   /* This allows 4 pages (16K) */
-   . = ASSERT(_end <= 0x4000, "Wakeup too big!");
+   . = ASSERT(_end <= WAKEUP_SIZE, "Wakeup too big!");
 }
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 1b282b1..561565e 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -53,9 +53,9 @@ int acpi_save_state_mem(void)
   "S3 disabled\n");
return -ENOMEM;
}
-   memcpy((void *)acpi_realmode, _code_start, 4*PAGE_SIZE);
+   memcpy((void *)acpi_realmode, _code_start, WAKEUP_SIZE);
 
-   header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
+   header = (struct wakeup_header *)(acpi_realmode + HEADER_OFFSET);
if (header->signature != 0x51ee) {
printk(KERN_ERR "wakeup header does not match\n");
return -EINVAL;
@@ -111,13 +111,13 @@ void acpi_restore_state_mem(void)
  */
 void __init acpi_reserve_bootmem(void)
 {
-   if ((_code_end - _code_start) > PAGE_SIZE*4) {
+   if ((_code_end - _code_start) > WAKEUP_SIZE) {
printk(KERN_ERR
   "ACPI: Wakeup code way too big, S3 disabled.\n");
return;
}
 
-   acpi_realmode = (unsigned long)alloc_bootmem_low(PAGE_SIZE*4);
+   acpi_realmode = (unsigned long)alloc_bootmem_low(WAKEUP_SIZE);
 
if (!acpi_realmode) {
printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n");




-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Sam Ravnborg
On Fri, Feb 08, 2008 at 10:41:45PM +0100, Pavel Machek wrote:
> > Do we never need data from a .h file?
> > If we do name it wakeup.lds.S and kbuild
> > will fix it (assuming we have wakeup.lds
> > as a prerequisite where it is needed.
> 
> Ok, I got it to work... but notice the ugly #undef :-(.
Great.
We have the same issue with vmlinux_64.lds.S in x86/kernel/

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Maxim Levitsky
On Friday, 8 February 2008 23:13:46 Pavel Machek wrote:
> Hi!
> 
> > > Can you post a delta against my versoin? I do not see any changes from
> > > a quick glance.
> > 
> > Appended (plus I removed two hunks, one in arch/x86/Makefile and one in
> > drivers/acpi/sleep/main.c that were unrelated to the rest of the patch).
> 
> Thanks, applied.
> 
> > > This is probably more acceptable version of beep; but there are
> > > probably even better ways to clean it...
> > > 
> > > if (wakeup_header.realmode_flags & 4) {
> > > inb(97);
> > > outb(0, 0x80);
> > > outb(3, 97);
> > > outb(0, 0x80);
> > > outb(-74, 67);
> > > outb(0, 0x80);
> > > outb(-119, 66);
> > > outb(0, 0x80);
> > > outb(15, 66);
> > > }
> > > 
> > > ...like the version that makes beep/pause/beep/pause, so that user can
> > > count them.
> > 
> > Can we move it into a separate function?
> 
> I guess we want to use HPA's morse code ;-).
>   Pavel

Seriously, why not...
For decades BIOSes have used sound beeps to tell the user about a early problem
that happened have before video is initialized.

Maybe not a long messages using morse code, but at least
you can have several messages to tell the user about different problems in the 
boot code

like

two short beeps for an oops
1 short beep for normal resume (so the user will know that the video is to 
blame)

and so on.

I don't know morse code, but I probably would have learn it.
Once I had very nasty problem with resume, a hang, but only sometimes,
and I had to play with rtc to debug it, and still I couldn't figure out
what was wrong.

Fortunately, this problem disappeared (was somehow fixed).
For reference take a look at http://lkml.org/lkml/2007/3/17/155

I remember that I did about 1500 reboots to try to fix this.
(According to hard disk's 'smart' statistics)



Suggestion: the speaker usually is quite loud, thus it can be annoying to use
for morse code or so.
Why not to use keyboard leds for this purpose?
(USB keyboard probably isn't an option, but user can always pull an old PC 
keyboard
out of closet, and use it)


Best regards,
Maxim Levitsky

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
> Do we never need data from a .h file?
> If we do name it wakeup.lds.S and kbuild
> will fix it (assuming we have wakeup.lds
> as a prerequisite where it is needed.

Ok, I got it to work... but notice the ugly #undef :-(.

Pavel

diff --git a/arch/x86/kernel/acpi/realmode/Makefile 
b/arch/x86/kernel/acpi/realmode/Makefile
index b239f0f..0e4742b 100644
--- a/arch/x86/kernel/acpi/realmode/Makefile
+++ b/arch/x86/kernel/acpi/realmode/Makefile
@@ -46,7 +46,10 @@ KBUILD_AFLAGS:= $(KBUILD_CFLAGS) -D__AS
 WAKEUP_OBJS = $(addprefix $(obj)/,$(wakeup-y))
 
 LDFLAGS_wakeup.elf := -T
-$(obj)/wakeup.elf: $(src)/wakeup.ld $(WAKEUP_OBJS) FORCE
+
+CPPFLAGS_wakeup.lds += -P -C
+
+$(obj)/wakeup.elf: $(src)/wakeup.lds $(WAKEUP_OBJS) FORCE
$(call if_changed,ld)
 
 OBJCOPYFLAGS_wakeup.bin:= -O binary
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
b/arch/x86/kernel/acpi/realmode/wakeup.ld
deleted file mode 100644
--- /dev/null
+++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
@@ -0,0 +1,62 @@
+/*
+ * wakeup.ld
+ *
+ * Linker script for the real-mode wakeup code
+ */
+#undef i386
+
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+   . = 0x3f00;
+   .header : {
+*(.header)
+   }
+
+   . = 0;
+   .text : {
+*(.text*)
+   }
+
+   . = ALIGN(16);
+   .rodata : {
+   *(.rodata*)
+   }
+
+   .videocards : {
+   video_cards = .;
+   *(.videocards)
+   video_cards_end = .;
+   }
+
+   . = ALIGN(16);
+   .data : {
+*(.data*)
+   }
+
+   .signature : {
+   end_signature = .;
+   LONG(0x65a22c82)
+   }
+
+   . = ALIGN(16);
+   .bss :  {
+   __bss_start = .;
+   *(.bss)
+   __bss_end = .;
+   }
+
+   . = ALIGN(16);
+   _end = .;
+
+   /DISCARD/ : {
+   *(.note*)
+   }
+
+   /* Adjust this as appropriate */
+   /* This allows 4 pages (16K) */
+   . = ASSERT(_end <= 0x4000, "Wakeup too big!");
+}


> > +
> > +   . = 0;
> > +   .text   : { *(.text*) }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   .rodata : { *(.rodata*) }
> > +
> > +   .videocards : {
> > +   video_cards = .;
> > +   *(.videocards)
> > +   video_cards_end = .;
> > +   }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   .data   : { *(.data*) }
> > +
> > +   .signature  : {
> > +   end_signature = .;
> > +   LONG(0x65a22c82)
> > +   }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   .bss:
> > +   {
> > +   __bss_start = .;
> > +   *(.bss)
> > +   __bss_end = .;
> > +   }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   _end = .;
> > +
> > +   /DISCARD/ : { *(.note*) }
> > +
> > +   /* Adjust this as appropriate */
> > +   /* This allows 4 pages (16K) */
> > +   . = ASSERT(_end <= 0x4000, "Wakeup too big!");
> PAGE_SIZE * 4?
> 
> 
>   Sam

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

> Okay, this uses the iodelay as the timesource... here is the total 
> silliness (and totally untested, of course.)

Why untested? Testing suspend is easy ;-). s2ram from suspend.sf.net
tends to just work...
Pavel

> static inline void io_delay(void)
> {
>   outb(0, 0x80);
> }
> 
> static void udelay(int loops)
> {
>   while (loops--)
>   io_delay(); /* Approximately 1 us */
> }
> 
> static void beep(unsigned int hz)
> {
>   u8 enable;
> 
>   if (!hz) {
>   enable = 0x00;  /* Turn off speaker */
>   } else {
>   u16 div = 1193181/hz;
> 
>   outb(0xb6, 0x43);   /* Ctr 2, squarewave, load, binary */
>   io_delay();
>   outb(div, 0x42);/* LSB of counter */
>   io_delay();
>   outb(div >> 8, 0x42);   /* MSB of counter */
>   io_delay();
> 
>   enable = 0x03;  /* Turn on speaker */
>   }
>   inb(0x61);  /* Dummy read of System Control Port B */
>   io_delay();
>   outb(enable, 0x61); /* Enable timer 2 output to speaker */
>   io_delay();
> }
> 
> #define DOT_HZ880
> #define DASH_HZ   587
> #define US_PER_DOT125000
> 
> /* Okay, this is totally silly, but it's kind of fun. */
> void send_morse(const char *pattern)
> {
>   char s;
> 
>   while ((s = *pattern++)) {
>   switch (s) {
>   case '.':
>   beep(DOT_HZ);
>   udelay(US_PER_DOT);
>   beep(0);
>   udelay(US_PER_DOT);
>   break;
>   case '-':
>   beep(DASH_HZ);
>   udelay(US_PER_DOT*3);
>   beep(0);
>   udelay(US_PER_DOT);
>   break;
>   default:/* Assume it's a space */
>   udelay(US_PER_DOT*3);
>   break;
>   }
>   }
> }
> 
> 


-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

> And for good measure name it wakeup.lds.
> 
> Do we never need data from a .h file?
> If we do name it wakeup.lds.S and kbuild
> will fix it (assuming we have wakeup.lds
> as a prerequisite where it is needed.

This does not work for me. gas (or someone?) puts # comments on the
beggining of wakeup.lds, and I get compile failure. Yes, I'd like to
have it preprocessed.

# 1 "/data/l/linux/arch/x86/kernel/acpi/realmode/wakeup.lds.S"
# 1 ""
# 1 ""
# 1 "./include/linux/autoconf.h" 1
# 1 "" 2
# 1 "/data/l/linux/arch/x86/kernel/acpi/realmode/wakeup.lds.S"





OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(1)
ENTRY(_start)


ld:arch/x86/kernel/acpi/realmode/wakeup.lds:1: ignoring invalid
character `#' in expression
ld:arch/x86/kernel/acpi/realmode/wakeup.lds:1: syntax error


-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Thu 2008-02-07 23:28:33, Sam Ravnborg wrote:
> > ===
> > --- /dev/null
> > +++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.ld
> > @@ -0,0 +1,51 @@
> > +/*
> > + * wakeup.ld
> > + *
> > + * Linker script for the real-mode wakeup code
> > + */
> > +OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
> > +OUTPUT_ARCH(i386)
> > +ENTRY(_start)
> > +
> > +SECTIONS
> > +{
> > +   . = 0x3f00;
> > +   .header : { *(.header) }
> 
> Can we please use C style in this file.
> Like this:

Commiting now :-).
Pavel

diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
b/arch/x86/kernel/acpi/realmode/wakeup.ld
index 5dff2f0..1a1e755 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.ld
+++ b/arch/x86/kernel/acpi/realmode/wakeup.ld
@@ -10,31 +10,38 @@ ENTRY(_start)
 SECTIONS
 {
. = 0x3f00;
-   .header : { *(.header) }
+   .header : {
+*(.header)
+   }
 
. = 0;
-   .text   : { *(.text*) }
+   .text : {
+*(.text*)
+   }
 
. = ALIGN(16);
-   .rodata : { *(.rodata*) }
+   .rodata : {
+   *(.rodata*)
+   }
 
-   .videocards : {
+   .videocards : {
video_cards = .;
*(.videocards)
video_cards_end = .;
}
 
. = ALIGN(16);
-   .data   : { *(.data*) }
+   .data : {
+*(.data*)
+   }
 
-   .signature  : {
+   .signature : {
end_signature = .;
LONG(0x65a22c82)
}
 
. = ALIGN(16);
-   .bss:
-   {
+   .bss :  {
__bss_start = .;
*(.bss)
__bss_end = .;
@@ -43,7 +50,9 @@ SECTIONS
. = ALIGN(16);
_end = .;
 
-   /DISCARD/ : { *(.note*) }
+   /DISCARD/ : {
+   *(.note*)
+   }
 
/* Adjust this as appropriate */
/* This allows 4 pages (16K) */



> 
> {
>   .header : {
>   *(.header)
>   }
> 
> It is not as short as the above but it pays of to keep
> an consistent style in the whole file and across
> different .lds files.
> 
> And for good measure name it wakeup.lds.
> 
> Do we never need data from a .h file?
> If we do name it wakeup.lds.S and kbuild
> will fix it (assuming we have wakeup.lds
> as a prerequisite where it is needed.
> 
> > +
> > +   . = 0;
> > +   .text   : { *(.text*) }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   .rodata : { *(.rodata*) }
> > +
> > +   .videocards : {
> > +   video_cards = .;
> > +   *(.videocards)
> > +   video_cards_end = .;
> > +   }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   .data   : { *(.data*) }
> > +
> > +   .signature  : {
> > +   end_signature = .;
> > +   LONG(0x65a22c82)
> > +   }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   .bss:
> > +   {
> > +   __bss_start = .;
> > +   *(.bss)
> > +   __bss_end = .;
> > +   }
> > +
> > +   . = ALIGN(16);
> Why?
> > +   _end = .;
> > +
> > +   /DISCARD/ : { *(.note*) }
> > +
> > +   /* Adjust this as appropriate */
> > +   /* This allows 4 pages (16K) */
> > +   . = ASSERT(_end <= 0x4000, "Wakeup too big!");
> PAGE_SIZE * 4?
> 
> 
>   Sam

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 13:27:30, H. Peter Anvin wrote:
> Pavel Machek wrote:
>>
>> See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
>> to the list). No problem there, but table stored at nonzero
>> offset. Short jump at the beggining of table would fix it (ugly).
>>
>
> Ugly, but it's the standard way to deal.  We have it in the bzImage format, 
> too.

I'd prefer to keep it as it is, there are no problems.

This way, we can put debugging instructions at the first byte of
wakeup code, which is somehow important.

Plus, with right #defines, it should be clean enough.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Pavel Machek wrote:


See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
to the list). No problem there, but table stored at nonzero
offset. Short jump at the beggining of table would fix it (ugly).



Ugly, but it's the standard way to deal.  We have it in the bzImage 
format, too.


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


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

> > > > segments:offsets rear its ugly head here. I need %ds to point to my
> > > > data, and the way to do it is copy it from %cs; that needs start to be
> > > > at 0.
> > > 
> > > Hm, why exactly is that necessay?
> > 
> > It is not _neccessary_. Try to come up with another method that gets
> > relocations right. I could not :-(.
> > 
> > (Actually, putting table at the offset 0 and short jump at beggining
> > of the table would probably do the trick. But that still keeps code at
> > offset 0 :-).
> 
> Pavel, can you explain in greater detail exactly what you need?

I do not think I need anything. I'm just explaining why data need to
go at nonzero offset. Nothing to see here, move on ;-).

> It sounds like you are running in real mode with code stored at some 
> (unknown?) location in memory.  The BIOS calls this code with IP=0 and 
> CS=, which apparently doesn't fit your requirements.

> So just what are your requirements?  The only possibilities I can think 
> of are:
> 
>   Code stored at a particular location in memory;
> 
>   CS, IP, etc. initialized to some particular values.
> 
> What am I missing?

See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
to the list). No problem there, but table stored at nonzero
offset. Short jump at the beggining of table would fix it (ugly).

Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Alan Stern
On Fri, 8 Feb 2008, Pavel Machek wrote:

> > > segments:offsets rear its ugly head here. I need %ds to point to my
> > > data, and the way to do it is copy it from %cs; that needs start to be
> > > at 0.
> > 
> > Hm, why exactly is that necessay?
> 
> It is not _neccessary_. Try to come up with another method that gets
> relocations right. I could not :-(.
> 
> (Actually, putting table at the offset 0 and short jump at beggining
> of the table would probably do the trick. But that still keeps code at
> offset 0 :-).

Pavel, can you explain in greater detail exactly what you need?

It sounds like you are running in real mode with code stored at some 
(unknown?) location in memory.  The BIOS calls this code with IP=0 and 
CS=, which apparently doesn't fit your requirements.

So just what are your requirements?  The only possibilities I can think 
of are:

Code stored at a particular location in memory;

CS, IP, etc. initialized to some particular values.

What am I missing?

Alan Stern

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Pavel Machek wrote:



Indirect call from where?

BIOS jumps to address you provide.


Where is this code?


arch/x86/kernel/acpi/realmode/wakeup.S

BIOS jumps to wakeup_code. With CS=something, IP=0. If wakeup code is
at other address than zero, I'll not be able to easily address data
below it.
Pavel


Ah, okay.  Yes, the canonical way to deal with that is to put a short 
jump at the top.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

> > Can you post a delta against my versoin? I do not see any changes from
> > a quick glance.
> 
> Appended (plus I removed two hunks, one in arch/x86/Makefile and one in
> drivers/acpi/sleep/main.c that were unrelated to the rest of the patch).

Thanks, applied.

> > This is probably more acceptable version of beep; but there are
> > probably even better ways to clean it...
> > 
> > if (wakeup_header.realmode_flags & 4) {
> > inb(97);
> > outb(0, 0x80);
> > outb(3, 97);
> > outb(0, 0x80);
> > outb(-74, 67);
> > outb(0, 0x80);
> > outb(-119, 66);
> > outb(0, 0x80);
> > outb(15, 66);
> > }
> > 
> > ...like the version that makes beep/pause/beep/pause, so that user can
> > count them.
> 
> Can we move it into a separate function?

I guess we want to use HPA's morse code ;-).
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 13:02:57, H. Peter Anvin wrote:
> Pavel Machek wrote:
>> On Fri 2008-02-08 17:23:15, Rafael J. Wysocki wrote:
>>> On Friday, 8 of February 2008, Pavel Machek wrote:
 Hi!
>>> Hi,
>>>
>> I really need the entry point to be at offset 0, so that I can get
>> pointers to my data. I could not figure out how to do it any other
>> way. And if 0 is taken, I thought I'd put header at the end.
>>
> Why not just put the structure at 0, and put pointers in the structure 
> to everything else you need?
 segments:offsets rear its ugly head here. I need %ds to point to my
 data, and the way to do it is copy it from %cs; that needs start to be
 at 0.
>>> Hm, why exactly is that necessay?
>>
>> It is not _neccessary_. Try to come up with another method that gets
>> relocations right. I could not :-(.
>>
>> (Actually, putting table at the offset 0 and short jump at beggining
>> of the table would probably do the trick. But that still keeps code at
>> offset 0 :-).
>
> Why not just put a pointer to the start of the code in the table, and make 
> an indirect call to it?

Indirect call from where?

BIOS jumps to address you provide.

> Where is this code?

arch/x86/kernel/acpi/realmode/wakeup.S

BIOS jumps to wakeup_code. With CS=something, IP=0. If wakeup code is
at other address than zero, I'll not be able to easily address data
below it.
Pavel

.globl  wakeup_header
wakeup_header:
...
realmode_flags: .long   0
signature:  .long   0x51ee
...
.text
.globl  _start
.code16
wakeup_code:
_start:
cli
cld

/* Set up segments */
movw%cs,%ax
movw%ax,%ds
movw%ax,%es
movw%ax,%ss

...
/* Check header signature... */
movlsignature, %eax
cmpl$0x51ee, %eax
jne bogus_real_magic



Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Pavel Machek wrote:

On Fri 2008-02-08 17:23:15, Rafael J. Wysocki wrote:

On Friday, 8 of February 2008, Pavel Machek wrote:

Hi!

Hi,

I really need the entry point to be at offset 0, so 
that I can get
pointers to my data. I could not figure out how to do 
it any other
way. And if 0 is taken, I thought I'd put header at the 
end.


Why not just put the structure at 0, and put pointers in 
the structure to everything else you need?

segments:offsets rear its ugly head here. I need %ds to point to my
data, and the way to do it is copy it from %cs; that needs start to be
at 0.

Hm, why exactly is that necessay?


It is not _neccessary_. Try to come up with another method that gets
relocations right. I could not :-(.

(Actually, putting table at the offset 0 and short jump at beggining
of the table would probably do the trick. But that still keeps code at
offset 0 :-).
Pavel


Why not just put a pointer to the start of the code in the table, and 
make an indirect call to it?


Where is this code?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 17:23:15, Rafael J. Wysocki wrote:
> On Friday, 8 of February 2008, Pavel Machek wrote:
> > Hi!
> 
> Hi,
> 
> > > >I really need the entry point to be at offset 0, so 
> > > >that I can get
> > > >pointers to my data. I could not figure out how to do 
> > > >it any other
> > > >way. And if 0 is taken, I thought I'd put header at the 
> > > >end.
> > > >
> > > 
> > > Why not just put the structure at 0, and put pointers in 
> > > the structure to everything else you need?
> > 
> > segments:offsets rear its ugly head here. I need %ds to point to my
> > data, and the way to do it is copy it from %cs; that needs start to be
> > at 0.
> 
> Hm, why exactly is that necessay?

It is not _neccessary_. Try to come up with another method that gets
relocations right. I could not :-(.

(Actually, putting table at the offset 0 and short jump at beggining
of the table would probably do the trick. But that still keeps code at
offset 0 :-).
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
> Hi!

Hi,

> > >I really need the entry point to be at offset 0, so 
> > >that I can get
> > >pointers to my data. I could not figure out how to do 
> > >it any other
> > >way. And if 0 is taken, I thought I'd put header at the 
> > >end.
> > >
> > 
> > Why not just put the structure at 0, and put pointers in 
> > the structure to everything else you need?
> 
> segments:offsets rear its ugly head here. I need %ds to point to my
> data, and the way to do it is copy it from %cs; that needs start to be
> at 0.

Hm, why exactly is that necessay?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
 Hi!
 
 Rafael, this is for you.

Thanks.

 My cleanups, relative to your cleanup patch. You may need manual patching
 around rep/stosd.

OK, I'll try to merge it.

Rafael


 diff --git a/arch/x86/kernel/acpi/realmode/Makefile 
 b/arch/x86/kernel/acpi/realmode/Makefile
 index b239f0f..0e4742b 100644
 --- a/arch/x86/kernel/acpi/realmode/Makefile
 +++ b/arch/x86/kernel/acpi/realmode/Makefile
 @@ -46,7 +46,10 @@ KBUILD_AFLAGS  := $(KBUILD_CFLAGS) -D__AS
  WAKEUP_OBJS = $(addprefix $(obj)/,$(wakeup-y))
  
  LDFLAGS_wakeup.elf   := -T
 -$(obj)/wakeup.elf: $(src)/wakeup.ld $(WAKEUP_OBJS) FORCE
 +
 +CPPFLAGS_wakeup.lds += -P -C
 +
 +$(obj)/wakeup.elf: $(src)/wakeup.lds $(WAKEUP_OBJS) FORCE
   $(call if_changed,ld)
  
  OBJCOPYFLAGS_wakeup.bin  := -O binary
 diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S 
 b/arch/x86/kernel/acpi/realmode/wakeup.S
 index 26145c0..edff763 100644
 --- a/arch/x86/kernel/acpi/realmode/wakeup.S
 +++ b/arch/x86/kernel/acpi/realmode/wakeup.S
 @@ -56,14 +56,6 @@ _start:
   cmpl$0x65a22c82, %eax
   jne bogus_real_magic
  
 - /* Zero the bss */
 - xorl%eax, %eax
 - movw$__bss_start, %di
 - movw$__bss_end + 3, %cx
 - subw%di, %cx
 - shrw$2, %cx
 - rep; stosl
 -
   /* Call the C code */
   calll   main
  
 diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h 
 b/arch/x86/kernel/acpi/realmode/wakeup.h
 index 4a26e27..6a49435 100644
 --- a/arch/x86/kernel/acpi/realmode/wakeup.h
 +++ b/arch/x86/kernel/acpi/realmode/wakeup.h
 @@ -6,12 +6,11 @@
  #ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
  #define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
  
 +#ifndef __ASSEMBLY__
  #include linux/types.h
  
  /* This must match data at wakeup.S */
  struct wakeup_header {
 - u16 entry;  /* unused */
 - u16 total;  /* unused */
   u16 video_mode; /* Video mode number */
   u16 _jmp1;
   u32 pmode_entry;/* Protected mode resume point */
 @@ -27,5 +26,10 @@ struct wakeup_header {
   u16 trampoline_segment;
   u32 signature;  /* To check we have correct structure */
  } __attribute__((__packed__));
 +#endif
 +
 +#define HEADER_OFFSET 0x3f00
 +#define WAKEUP_SIZE   0x4000
 +
  
  #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
 diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
 b/arch/x86/kernel/acpi/realmode/wakeup.ld
 deleted file mode 100644
 index 5dff2f0..000
 --- a/arch/x86/kernel/acpi/realmode/wakeup.ld
 +++ /dev/null
 @@ -1,51 +0,0 @@
 -/*
 - * wakeup.ld
 - *
 - * Linker script for the real-mode wakeup code
 - */
 -OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
 -OUTPUT_ARCH(i386)
 -ENTRY(_start)
 -
 -SECTIONS
 -{
 - . = 0x3f00;
 - .header : { *(.header) }
 -
 - . = 0;
 - .text   : { *(.text*) }
 -
 - . = ALIGN(16);
 - .rodata : { *(.rodata*) }
 -
 - .videocards : {
 - video_cards = .;
 - *(.videocards)
 - video_cards_end = .;
 - }
 -
 - . = ALIGN(16);
 - .data   : { *(.data*) }
 -
 - .signature  : {
 - end_signature = .;
 - LONG(0x65a22c82)
 - }
 -
 - . = ALIGN(16);
 - .bss:
 - {
 - __bss_start = .;
 - *(.bss)
 - __bss_end = .;
 - }
 -
 - . = ALIGN(16);
 - _end = .;
 -
 - /DISCARD/ : { *(.note*) }
 -
 - /* Adjust this as appropriate */
 - /* This allows 4 pages (16K) */
 - . = ASSERT(_end = 0x4000, Wakeup too big!);
 -}
 diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S 
 b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
 new file mode 100644
 index 000..22fab6c
 --- /dev/null
 +++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
 @@ -0,0 +1,61 @@
 +/*
 + * wakeup.ld
 + *
 + * Linker script for the real-mode wakeup code
 + */
 +#undef i386
 +#include wakeup.h
 +
 +OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
 +OUTPUT_ARCH(i386)
 +ENTRY(_start)
 +
 +SECTIONS
 +{
 + . = HEADER_OFFSET;
 + .header : {
 +  *(.header)
 + }
 +
 + . = 0;
 + .text : {
 +  *(.text*)
 + }
 +
 + . = ALIGN(16);
 + .rodata : {
 + *(.rodata*)
 + }
 +
 + .videocards : {
 + video_cards = .;
 + *(.videocards)
 + video_cards_end = .;
 + }
 +
 + . = ALIGN(16);
 + .data : {
 +  *(.data*)
 + }
 +
 + .signature : {
 + end_signature = .;
 + LONG(0x65a22c82)
 + }
 +
 + . = ALIGN(16);
 + .bss :  {
 + __bss_start = .;
 + *(.bss)
 + __bss_end = .;
 + }
 +
 + . = ALIGN(16);
 + _end = .;
 +
 + /DISCARD/ : {
 + *(.note*)
 + }
 +
 + . = ASSERT(_end = WAKEUP_SIZE, Wakeup too big!);
 +}
 diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
 

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Sam Ravnborg
On Fri, Feb 08, 2008 at 10:41:45PM +0100, Pavel Machek wrote:
  Do we never need data from a .h file?
  If we do name it wakeup.lds.S and kbuild
  will fix it (assuming we have wakeup.lds
  as a prerequisite where it is needed.
 
 Ok, I got it to work... but notice the ugly #undef :-(.
Great.
We have the same issue with vmlinux_64.lds.S in x86/kernel/

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


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
 On Fri 2008-02-08 13:27:30, H. Peter Anvin wrote:
  Pavel Machek wrote:
 
  See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
  to the list). No problem there, but table stored at nonzero
  offset. Short jump at the beggining of table would fix it (ugly).
 
 
  Ugly, but it's the standard way to deal.  We have it in the bzImage format, 
  too.
 
 I'd prefer to keep it as it is, there are no problems.
 
 This way, we can put debugging instructions at the first byte of
 wakeup code, which is somehow important.
 
 Plus, with right #defines, it should be clean enough.

Well, I don't know how to evaluate #defines in *.ld files ...

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


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 22:56:08, Rafael J. Wysocki wrote:
 On Friday, 8 of February 2008, Pavel Machek wrote:
  On Fri 2008-02-08 13:27:30, H. Peter Anvin wrote:
   Pavel Machek wrote:
  
   See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
   to the list). No problem there, but table stored at nonzero
   offset. Short jump at the beggining of table would fix it (ugly).
  
  
   Ugly, but it's the standard way to deal.  We have it in the bzImage 
   format, 
   too.
  
  I'd prefer to keep it as it is, there are no problems.
  
  This way, we can put debugging instructions at the first byte of
  wakeup code, which is somehow important.
  
  Plus, with right #defines, it should be clean enough.
 
 Well, I don't know how to evaluate #defines in *.ld files ...

See a patch in your inbox :-). Sam told me how to do it.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
 On Fri 2008-02-08 23:01:51, Rafael J. Wysocki wrote:
  On Friday, 8 of February 2008, Pavel Machek wrote:
   Hi!
   
   Rafael, this is for you.
  
  Thanks.
  
   My cleanups, relative to your cleanup patch. You may need manual patching
   around rep/stosd.
  
  OK, I'll try to merge it.
 
 For the record, now it is even tested on 32-bit and test-compiled on
 64-bit.

Consolidated patch is appended.  I'll test it tomorrow on x86-64.

I'd like to add the cleaned up beeping code to it and perhaps try to push it
for -mm testing without any further changes.  We can still do more cleanups in
followup patches.

Thanks,
Rafael


---
 arch/x86/boot/Makefile |2 
 arch/x86/boot/boot.h   |5 
 arch/x86/boot/video-bios.c |6 
 arch/x86/boot/video-mode.c |  173 
 arch/x86/boot/video-vesa.c |8 
 arch/x86/boot/video-vga.c  |   12 -
 arch/x86/boot/video.c  |  157 --
 arch/x86/kernel/acpi/Makefile  |9 
 arch/x86/kernel/acpi/realmode/Makefile |   58 +
 arch/x86/kernel/acpi/realmode/copy.S   |1 
 arch/x86/kernel/acpi/realmode/video-bios.c |1 
 arch/x86/kernel/acpi/realmode/video-mode.c |1 
 arch/x86/kernel/acpi/realmode/video-vesa.c |1 
 arch/x86/kernel/acpi/realmode/video-vga.c  |1 
 arch/x86/kernel/acpi/realmode/wakemain.c   |   26 ++
 arch/x86/kernel/acpi/realmode/wakeup.S |  113 ++
 arch/x86/kernel/acpi/realmode/wakeup.h |   35 +++
 arch/x86/kernel/acpi/realmode/wakeup.lds.S |   61 +
 arch/x86/kernel/acpi/sleep.c   |   80 ++-
 arch/x86/kernel/acpi/wakeup_32.S   |  245 +-
 arch/x86/kernel/acpi/wakeup_64.S   |  313 -
 arch/x86/kernel/acpi/wakeup_rm.S   |   10 
 arch/x86/kernel/head_64.S  |4 
 arch/x86/kernel/setup_32.c |4 
 arch/x86/kernel/smpboot_64.c   |   10 
 25 files changed, 624 insertions(+), 712 deletions(-)

Index: linux-2.6/arch/x86/boot/Makefile
===
--- linux-2.6.orig/arch/x86/boot/Makefile
+++ linux-2.6/arch/x86/boot/Makefile
@@ -30,7 +30,7 @@ subdir-   := compressed
 
 setup-y+= a20.o cmdline.o copy.o cpu.o cpucheck.o edd.o
 setup-y+= header.o main.o mca.o memory.o pm.o pmjump.o
-setup-y+= printf.o string.o tty.o video.o version.o
+setup-y+= printf.o string.o tty.o video.o video-mode.o 
version.o
 setup-$(CONFIG_X86_APM_BOOT) += apm.o
 setup-$(CONFIG_X86_VOYAGER) += voyager.o
 
Index: linux-2.6/arch/x86/boot/boot.h
===
--- linux-2.6.orig/arch/x86/boot/boot.h
+++ linux-2.6/arch/x86/boot/boot.h
@@ -286,6 +286,11 @@ int getchar_timeout(void);
 /* video.c */
 void set_video(void);
 
+/* video-mode.c */
+int set_mode(u16 mode);
+int mode_defined(u16 mode);
+void probe_cards(int unsafe);
+
 /* video-vesa.c */
 void vesa_store_edid(void);
 
Index: linux-2.6/arch/x86/boot/video-bios.c
===
--- linux-2.6.orig/arch/x86/boot/video-bios.c
+++ linux-2.6/arch/x86/boot/video-bios.c
@@ -50,6 +50,7 @@ static int set_bios_mode(u8 mode)
if (new_mode == mode)
return 0;   /* Mode change OK */
 
+#ifndef _WAKEUP
if (new_mode != boot_params.screen_info.orig_video_mode) {
/* Mode setting failed, but we didn't end up where we
   started.  That's bad.  Try to revert to the original
@@ -59,13 +60,18 @@ static int set_bios_mode(u8 mode)
 : +a (ax)
 : : ebx, ecx, edx, esi, edi);
}
+#endif
return -1;
 }
 
 static int bios_probe(void)
 {
u8 mode;
+#ifdef _WAKEUP
+   u8 saved_mode = 0x03;
+#else
u8 saved_mode = boot_params.screen_info.orig_video_mode;
+#endif
u16 crtc;
struct mode_info *mi;
int nmodes = 0;
Index: linux-2.6/arch/x86/boot/video-mode.c
===
--- /dev/null
+++ linux-2.6/arch/x86/boot/video-mode.c
@@ -0,0 +1,173 @@
+/* -*- linux-c -*- --- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007-2008 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * --- */
+
+/*
+ * arch/i386/boot/video-mode.c
+ *
+ * Set the video mode.  This is separated out into a different
+ * file in order to be shared with the ACPI wakeup code.
+ */
+
+#include boot.h

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Rafael J. Wysocki wrote:


Consolidated patch is appended.  I'll test it tomorrow on x86-64.

I'd like to add the cleaned up beeping code to it and perhaps try to push it
for -mm testing without any further changes.  We can still do more cleanups in
followup patches.



The other thing to figure out is to what extent we can clean up the 
conditionals in the video mode code by refactoring.  All they really do 
here is save space by removing functionality not needed for wakeup, 
because I didn't know how much space was realistic.


It's possible we can remove them altogether by having a dummy 
boot_params structure (4K).


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 17:23:15, Rafael J. Wysocki wrote:
 On Friday, 8 of February 2008, Pavel Machek wrote:
  Hi!
 
 Hi,
 
   I really need the entry point to be at offset 0, so 
   that I can get
   pointers to my data. I could not figure out how to do 
   it any other
   way. And if 0 is taken, I thought I'd put header at the 
   end.
   
   
   Why not just put the structure at 0, and put pointers in 
   the structure to everything else you need?
  
  segments:offsets rear its ugly head here. I need %ds to point to my
  data, and the way to do it is copy it from %cs; that needs start to be
  at 0.
 
 Hm, why exactly is that necessay?

It is not _neccessary_. Try to come up with another method that gets
relocations right. I could not :-(.

(Actually, putting table at the offset 0 and short jump at beggining
of the table would probably do the trick. But that still keeps code at
offset 0 :-).
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Pavel Machek wrote:

On Fri 2008-02-08 17:23:15, Rafael J. Wysocki wrote:

On Friday, 8 of February 2008, Pavel Machek wrote:

Hi!

Hi,

I really need the entry point to be at offset 0, so 
that I can get
pointers to my data. I could not figure out how to do 
it any other
way. And if 0 is taken, I thought I'd put header at the 
end.


Why not just put the structure at 0, and put pointers in 
the structure to everything else you need?

segments:offsets rear its ugly head here. I need %ds to point to my
data, and the way to do it is copy it from %cs; that needs start to be
at 0.

Hm, why exactly is that necessay?


It is not _neccessary_. Try to come up with another method that gets
relocations right. I could not :-(.

(Actually, putting table at the offset 0 and short jump at beggining
of the table would probably do the trick. But that still keeps code at
offset 0 :-).
Pavel


Why not just put a pointer to the start of the code in the table, and 
make an indirect call to it?


Where is this code?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

  Can you post a delta against my versoin? I do not see any changes from
  a quick glance.
 
 Appended (plus I removed two hunks, one in arch/x86/Makefile and one in
 drivers/acpi/sleep/main.c that were unrelated to the rest of the patch).

Thanks, applied.

  This is probably more acceptable version of beep; but there are
  probably even better ways to clean it...
  
  if (wakeup_header.realmode_flags  4) {
  inb(97);
  outb(0, 0x80);
  outb(3, 97);
  outb(0, 0x80);
  outb(-74, 67);
  outb(0, 0x80);
  outb(-119, 66);
  outb(0, 0x80);
  outb(15, 66);
  }
  
  ...like the version that makes beep/pause/beep/pause, so that user can
  count them.
 
 Can we move it into a separate function?

I guess we want to use HPA's morse code ;-).
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Pavel Machek wrote:



Indirect call from where?

BIOS jumps to address you provide.


Where is this code?


arch/x86/kernel/acpi/realmode/wakeup.S

BIOS jumps to wakeup_code. With CS=something, IP=0. If wakeup code is
at other address than zero, I'll not be able to easily address data
below it.
Pavel


Ah, okay.  Yes, the canonical way to deal with that is to put a short 
jump at the top.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 13:02:57, H. Peter Anvin wrote:
 Pavel Machek wrote:
 On Fri 2008-02-08 17:23:15, Rafael J. Wysocki wrote:
 On Friday, 8 of February 2008, Pavel Machek wrote:
 Hi!
 Hi,

 I really need the entry point to be at offset 0, so that I can get
 pointers to my data. I could not figure out how to do it any other
 way. And if 0 is taken, I thought I'd put header at the end.

 Why not just put the structure at 0, and put pointers in the structure 
 to everything else you need?
 segments:offsets rear its ugly head here. I need %ds to point to my
 data, and the way to do it is copy it from %cs; that needs start to be
 at 0.
 Hm, why exactly is that necessay?

 It is not _neccessary_. Try to come up with another method that gets
 relocations right. I could not :-(.

 (Actually, putting table at the offset 0 and short jump at beggining
 of the table would probably do the trick. But that still keeps code at
 offset 0 :-).

 Why not just put a pointer to the start of the code in the table, and make 
 an indirect call to it?

Indirect call from where?

BIOS jumps to address you provide.

 Where is this code?

arch/x86/kernel/acpi/realmode/wakeup.S

BIOS jumps to wakeup_code. With CS=something, IP=0. If wakeup code is
at other address than zero, I'll not be able to easily address data
below it.
Pavel

.globl  wakeup_header
wakeup_header:
...
realmode_flags: .long   0
signature:  .long   0x51ee
...
.text
.globl  _start
.code16
wakeup_code:
_start:
cli
cld

/* Set up segments */
movw%cs,%ax
movw%ax,%ds
movw%ax,%es
movw%ax,%ss

...
/* Check header signature... */
movlsignature, %eax
cmpl$0x51ee, %eax
jne bogus_real_magic



Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

 I remember that I did about 1500 reboots to try to fix this.
 (According to hard disk's 'smart' statistics)

Poor you.

 Suggestion: the speaker usually is quite loud, thus it can be annoying to use
 for morse code or so.
 Why not to use keyboard leds for this purpose?
 (USB keyboard probably isn't an option, but user can always pull an old PC 
 keyboard
 out of closet, and use it)

IIRC keyboard leds are quite hard to drive, plus decoding audible
morse is easier than blinkenlights...
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

This cleans up .lds, making use of constants...

Pavel

diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h 
b/arch/x86/kernel/acpi/realmode/wakeup.h
index 4a26e27..ee7c68b 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.h
+++ b/arch/x86/kernel/acpi/realmode/wakeup.h
@@ -6,6 +6,7 @@
 #ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 #define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 
+#ifndef __ASSEMBLY__
 #include linux/types.h
 
 /* This must match data at wakeup.S */
@@ -27,5 +28,10 @@ struct wakeup_header {
u16 trampoline_segment;
u32 signature;  /* To check we have correct structure */
 } __attribute__((__packed__));
+#endif
+
+#define HEADER_OFFSET 0x3f00
+#define WAKEUP_SIZE   0x4000
+
 
 #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S 
b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
index 24ebe75..22fab6c 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.lds.S
+++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
@@ -4,6 +4,7 @@
  * Linker script for the real-mode wakeup code
  */
 #undef i386
+#include wakeup.h
 
 OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
 OUTPUT_ARCH(i386)
@@ -11,7 +12,7 @@ ENTRY(_start)
 
 SECTIONS
 {
-   . = 0x3f00;
+   . = HEADER_OFFSET;
.header : {
 *(.header)
}
@@ -56,7 +57,5 @@ SECTIONS
*(.note*)
}
 
-   /* Adjust this as appropriate */
-   /* This allows 4 pages (16K) */
-   . = ASSERT(_end = 0x4000, Wakeup too big!);
+   . = ASSERT(_end = WAKEUP_SIZE, Wakeup too big!);
 }
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 1b282b1..561565e 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -53,9 +53,9 @@ int acpi_save_state_mem(void)
   S3 disabled\n);
return -ENOMEM;
}
-   memcpy((void *)acpi_realmode, wakeup_code_start, 4*PAGE_SIZE);
+   memcpy((void *)acpi_realmode, wakeup_code_start, WAKEUP_SIZE);
 
-   header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
+   header = (struct wakeup_header *)(acpi_realmode + HEADER_OFFSET);
if (header-signature != 0x51ee) {
printk(KERN_ERR wakeup header does not match\n);
return -EINVAL;
@@ -111,13 +111,13 @@ void acpi_restore_state_mem(void)
  */
 void __init acpi_reserve_bootmem(void)
 {
-   if ((wakeup_code_end - wakeup_code_start)  PAGE_SIZE*4) {
+   if ((wakeup_code_end - wakeup_code_start)  WAKEUP_SIZE) {
printk(KERN_ERR
   ACPI: Wakeup code way too big, S3 disabled.\n);
return;
}
 
-   acpi_realmode = (unsigned long)alloc_bootmem_low(PAGE_SIZE*4);
+   acpi_realmode = (unsigned long)alloc_bootmem_low(WAKEUP_SIZE);
 
if (!acpi_realmode) {
printk(KERN_ERR ACPI: Cannot allocate lowmem, S3 disabled.\n);




-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Maxim Levitsky
On Friday, 8 February 2008 23:13:46 Pavel Machek wrote:
 Hi!
 
   Can you post a delta against my versoin? I do not see any changes from
   a quick glance.
  
  Appended (plus I removed two hunks, one in arch/x86/Makefile and one in
  drivers/acpi/sleep/main.c that were unrelated to the rest of the patch).
 
 Thanks, applied.
 
   This is probably more acceptable version of beep; but there are
   probably even better ways to clean it...
   
   if (wakeup_header.realmode_flags  4) {
   inb(97);
   outb(0, 0x80);
   outb(3, 97);
   outb(0, 0x80);
   outb(-74, 67);
   outb(0, 0x80);
   outb(-119, 66);
   outb(0, 0x80);
   outb(15, 66);
   }
   
   ...like the version that makes beep/pause/beep/pause, so that user can
   count them.
  
  Can we move it into a separate function?
 
 I guess we want to use HPA's morse code ;-).
   Pavel

Seriously, why not...
For decades BIOSes have used sound beeps to tell the user about a early problem
that happened have before video is initialized.

Maybe not a long messages using morse code, but at least
you can have several messages to tell the user about different problems in the 
boot code

like

two short beeps for an oops
1 short beep for normal resume (so the user will know that the video is to 
blame)

and so on.

I don't know morse code, but I probably would have learn it.
Once I had very nasty problem with resume, a hang, but only sometimes,
and I had to play with rtc to debug it, and still I couldn't figure out
what was wrong.

Fortunately, this problem disappeared (was somehow fixed).
For reference take a look at http://lkml.org/lkml/2007/3/17/155

I remember that I did about 1500 reboots to try to fix this.
(According to hard disk's 'smart' statistics)



Suggestion: the speaker usually is quite loud, thus it can be annoying to use
for morse code or so.
Why not to use keyboard leds for this purpose?
(USB keyboard probably isn't an option, but user can always pull an old PC 
keyboard
out of closet, and use it)


Best regards,
Maxim Levitsky

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Thu 2008-02-07 23:28:33, Sam Ravnborg wrote:
  ===
  --- /dev/null
  +++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.ld
  @@ -0,0 +1,51 @@
  +/*
  + * wakeup.ld
  + *
  + * Linker script for the real-mode wakeup code
  + */
  +OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
  +OUTPUT_ARCH(i386)
  +ENTRY(_start)
  +
  +SECTIONS
  +{
  +   . = 0x3f00;
  +   .header : { *(.header) }
 
 Can we please use C style in this file.
 Like this:

Commiting now :-).
Pavel

diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
b/arch/x86/kernel/acpi/realmode/wakeup.ld
index 5dff2f0..1a1e755 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.ld
+++ b/arch/x86/kernel/acpi/realmode/wakeup.ld
@@ -10,31 +10,38 @@ ENTRY(_start)
 SECTIONS
 {
. = 0x3f00;
-   .header : { *(.header) }
+   .header : {
+*(.header)
+   }
 
. = 0;
-   .text   : { *(.text*) }
+   .text : {
+*(.text*)
+   }
 
. = ALIGN(16);
-   .rodata : { *(.rodata*) }
+   .rodata : {
+   *(.rodata*)
+   }
 
-   .videocards : {
+   .videocards : {
video_cards = .;
*(.videocards)
video_cards_end = .;
}
 
. = ALIGN(16);
-   .data   : { *(.data*) }
+   .data : {
+*(.data*)
+   }
 
-   .signature  : {
+   .signature : {
end_signature = .;
LONG(0x65a22c82)
}
 
. = ALIGN(16);
-   .bss:
-   {
+   .bss :  {
__bss_start = .;
*(.bss)
__bss_end = .;
@@ -43,7 +50,9 @@ SECTIONS
. = ALIGN(16);
_end = .;
 
-   /DISCARD/ : { *(.note*) }
+   /DISCARD/ : {
+   *(.note*)
+   }
 
/* Adjust this as appropriate */
/* This allows 4 pages (16K) */



 
 {
   .header : {
   *(.header)
   }
 
 It is not as short as the above but it pays of to keep
 an consistent style in the whole file and across
 different .lds files.
 
 And for good measure name it wakeup.lds.
 
 Do we never need data from a .h file?
 If we do name it wakeup.lds.S and kbuild
 will fix it (assuming we have wakeup.lds
 as a prerequisite where it is needed.
 
  +
  +   . = 0;
  +   .text   : { *(.text*) }
  +
  +   . = ALIGN(16);
 Why?
  +   .rodata : { *(.rodata*) }
  +
  +   .videocards : {
  +   video_cards = .;
  +   *(.videocards)
  +   video_cards_end = .;
  +   }
  +
  +   . = ALIGN(16);
 Why?
  +   .data   : { *(.data*) }
  +
  +   .signature  : {
  +   end_signature = .;
  +   LONG(0x65a22c82)
  +   }
  +
  +   . = ALIGN(16);
 Why?
  +   .bss:
  +   {
  +   __bss_start = .;
  +   *(.bss)
  +   __bss_end = .;
  +   }
  +
  +   . = ALIGN(16);
 Why?
  +   _end = .;
  +
  +   /DISCARD/ : { *(.note*) }
  +
  +   /* Adjust this as appropriate */
  +   /* This allows 4 pages (16K) */
  +   . = ASSERT(_end = 0x4000, Wakeup too big!);
 PAGE_SIZE * 4?
 
 
   Sam

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 13:27:30, H. Peter Anvin wrote:
 Pavel Machek wrote:

 See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
 to the list). No problem there, but table stored at nonzero
 offset. Short jump at the beggining of table would fix it (ugly).


 Ugly, but it's the standard way to deal.  We have it in the bzImage format, 
 too.

I'd prefer to keep it as it is, there are no problems.

This way, we can put debugging instructions at the first byte of
wakeup code, which is somehow important.

Plus, with right #defines, it should be clean enough.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

Rafael, this is for you. My cleanups, relative to your cleanup
patch. You may need manual patching around rep/stosd.

Pavel

diff --git a/arch/x86/kernel/acpi/realmode/Makefile 
b/arch/x86/kernel/acpi/realmode/Makefile
index b239f0f..0e4742b 100644
--- a/arch/x86/kernel/acpi/realmode/Makefile
+++ b/arch/x86/kernel/acpi/realmode/Makefile
@@ -46,7 +46,10 @@ KBUILD_AFLAGS:= $(KBUILD_CFLAGS) -D__AS
 WAKEUP_OBJS = $(addprefix $(obj)/,$(wakeup-y))
 
 LDFLAGS_wakeup.elf := -T
-$(obj)/wakeup.elf: $(src)/wakeup.ld $(WAKEUP_OBJS) FORCE
+
+CPPFLAGS_wakeup.lds += -P -C
+
+$(obj)/wakeup.elf: $(src)/wakeup.lds $(WAKEUP_OBJS) FORCE
$(call if_changed,ld)
 
 OBJCOPYFLAGS_wakeup.bin:= -O binary
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S 
b/arch/x86/kernel/acpi/realmode/wakeup.S
index 26145c0..edff763 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.S
+++ b/arch/x86/kernel/acpi/realmode/wakeup.S
@@ -56,14 +56,6 @@ _start:
cmpl$0x65a22c82, %eax
jne bogus_real_magic
 
-   /* Zero the bss */
-   xorl%eax, %eax
-   movw$__bss_start, %di
-   movw$__bss_end + 3, %cx
-   subw%di, %cx
-   shrw$2, %cx
-   rep; stosl
-
/* Call the C code */
calll   main
 
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.h 
b/arch/x86/kernel/acpi/realmode/wakeup.h
index 4a26e27..6a49435 100644
--- a/arch/x86/kernel/acpi/realmode/wakeup.h
+++ b/arch/x86/kernel/acpi/realmode/wakeup.h
@@ -6,12 +6,11 @@
 #ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 #define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
 
+#ifndef __ASSEMBLY__
 #include linux/types.h
 
 /* This must match data at wakeup.S */
 struct wakeup_header {
-   u16 entry;  /* unused */
-   u16 total;  /* unused */
u16 video_mode; /* Video mode number */
u16 _jmp1;
u32 pmode_entry;/* Protected mode resume point */
@@ -27,5 +26,10 @@ struct wakeup_header {
u16 trampoline_segment;
u32 signature;  /* To check we have correct structure */
 } __attribute__((__packed__));
+#endif
+
+#define HEADER_OFFSET 0x3f00
+#define WAKEUP_SIZE   0x4000
+
 
 #endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
b/arch/x86/kernel/acpi/realmode/wakeup.ld
deleted file mode 100644
index 5dff2f0..000
--- a/arch/x86/kernel/acpi/realmode/wakeup.ld
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * wakeup.ld
- *
- * Linker script for the real-mode wakeup code
- */
-OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-
-SECTIONS
-{
-   . = 0x3f00;
-   .header : { *(.header) }
-
-   . = 0;
-   .text   : { *(.text*) }
-
-   . = ALIGN(16);
-   .rodata : { *(.rodata*) }
-
-   .videocards : {
-   video_cards = .;
-   *(.videocards)
-   video_cards_end = .;
-   }
-
-   . = ALIGN(16);
-   .data   : { *(.data*) }
-
-   .signature  : {
-   end_signature = .;
-   LONG(0x65a22c82)
-   }
-
-   . = ALIGN(16);
-   .bss:
-   {
-   __bss_start = .;
-   *(.bss)
-   __bss_end = .;
-   }
-
-   . = ALIGN(16);
-   _end = .;
-
-   /DISCARD/ : { *(.note*) }
-
-   /* Adjust this as appropriate */
-   /* This allows 4 pages (16K) */
-   . = ASSERT(_end = 0x4000, Wakeup too big!);
-}
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.lds.S 
b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
new file mode 100644
index 000..22fab6c
--- /dev/null
+++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
@@ -0,0 +1,61 @@
+/*
+ * wakeup.ld
+ *
+ * Linker script for the real-mode wakeup code
+ */
+#undef i386
+#include wakeup.h
+
+OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+   . = HEADER_OFFSET;
+   .header : {
+*(.header)
+   }
+
+   . = 0;
+   .text : {
+*(.text*)
+   }
+
+   . = ALIGN(16);
+   .rodata : {
+   *(.rodata*)
+   }
+
+   .videocards : {
+   video_cards = .;
+   *(.videocards)
+   video_cards_end = .;
+   }
+
+   . = ALIGN(16);
+   .data : {
+*(.data*)
+   }
+
+   .signature : {
+   end_signature = .;
+   LONG(0x65a22c82)
+   }
+
+   . = ALIGN(16);
+   .bss :  {
+   __bss_start = .;
+   *(.bss)
+   __bss_end = .;
+   }
+
+   . = ALIGN(16);
+   _end = .;
+
+   /DISCARD/ : {
+   *(.note*)
+   }
+
+   . = ASSERT(_end = WAKEUP_SIZE, Wakeup too big!);
+}
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 1b282b1..561565e 100644
--- 

Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Alan Stern
On Fri, 8 Feb 2008, Pavel Machek wrote:

   segments:offsets rear its ugly head here. I need %ds to point to my
   data, and the way to do it is copy it from %cs; that needs start to be
   at 0.
  
  Hm, why exactly is that necessay?
 
 It is not _neccessary_. Try to come up with another method that gets
 relocations right. I could not :-(.
 
 (Actually, putting table at the offset 0 and short jump at beggining
 of the table would probably do the trick. But that still keeps code at
 offset 0 :-).

Pavel, can you explain in greater detail exactly what you need?

It sounds like you are running in real mode with code stored at some 
(unknown?) location in memory.  The BIOS calls this code with IP=0 and 
CS=something, which apparently doesn't fit your requirements.

So just what are your requirements?  The only possibilities I can think 
of are:

Code stored at a particular location in memory;

CS, IP, etc. initialized to some particular values.

What am I missing?

Alan Stern

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
Hi!

 Okay, this uses the iodelay as the timesource... here is the total 
 silliness (and totally untested, of course.)

Why untested? Testing suspend is easy ;-). s2ram from suspend.sf.net
tends to just work...
Pavel

 static inline void io_delay(void)
 {
   outb(0, 0x80);
 }
 
 static void udelay(int loops)
 {
   while (loops--)
   io_delay(); /* Approximately 1 us */
 }
 
 static void beep(unsigned int hz)
 {
   u8 enable;
 
   if (!hz) {
   enable = 0x00;  /* Turn off speaker */
   } else {
   u16 div = 1193181/hz;
 
   outb(0xb6, 0x43);   /* Ctr 2, squarewave, load, binary */
   io_delay();
   outb(div, 0x42);/* LSB of counter */
   io_delay();
   outb(div  8, 0x42);   /* MSB of counter */
   io_delay();
 
   enable = 0x03;  /* Turn on speaker */
   }
   inb(0x61);  /* Dummy read of System Control Port B */
   io_delay();
   outb(enable, 0x61); /* Enable timer 2 output to speaker */
   io_delay();
 }
 
 #define DOT_HZ880
 #define DASH_HZ   587
 #define US_PER_DOT125000
 
 /* Okay, this is totally silly, but it's kind of fun. */
 void send_morse(const char *pattern)
 {
   char s;
 
   while ((s = *pattern++)) {
   switch (s) {
   case '.':
   beep(DOT_HZ);
   udelay(US_PER_DOT);
   beep(0);
   udelay(US_PER_DOT);
   break;
   case '-':
   beep(DASH_HZ);
   udelay(US_PER_DOT*3);
   beep(0);
   udelay(US_PER_DOT);
   break;
   default:/* Assume it's a space */
   udelay(US_PER_DOT*3);
   break;
   }
   }
 }
 
 


-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
 Do we never need data from a .h file?
 If we do name it wakeup.lds.S and kbuild
 will fix it (assuming we have wakeup.lds
 as a prerequisite where it is needed.

Ok, I got it to work... but notice the ugly #undef :-(.

Pavel

diff --git a/arch/x86/kernel/acpi/realmode/Makefile 
b/arch/x86/kernel/acpi/realmode/Makefile
index b239f0f..0e4742b 100644
--- a/arch/x86/kernel/acpi/realmode/Makefile
+++ b/arch/x86/kernel/acpi/realmode/Makefile
@@ -46,7 +46,10 @@ KBUILD_AFLAGS:= $(KBUILD_CFLAGS) -D__AS
 WAKEUP_OBJS = $(addprefix $(obj)/,$(wakeup-y))
 
 LDFLAGS_wakeup.elf := -T
-$(obj)/wakeup.elf: $(src)/wakeup.ld $(WAKEUP_OBJS) FORCE
+
+CPPFLAGS_wakeup.lds += -P -C
+
+$(obj)/wakeup.elf: $(src)/wakeup.lds $(WAKEUP_OBJS) FORCE
$(call if_changed,ld)
 
 OBJCOPYFLAGS_wakeup.bin:= -O binary
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.ld 
b/arch/x86/kernel/acpi/realmode/wakeup.ld
deleted file mode 100644
--- /dev/null
+++ b/arch/x86/kernel/acpi/realmode/wakeup.lds.S
@@ -0,0 +1,62 @@
+/*
+ * wakeup.ld
+ *
+ * Linker script for the real-mode wakeup code
+ */
+#undef i386
+
+OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+   . = 0x3f00;
+   .header : {
+*(.header)
+   }
+
+   . = 0;
+   .text : {
+*(.text*)
+   }
+
+   . = ALIGN(16);
+   .rodata : {
+   *(.rodata*)
+   }
+
+   .videocards : {
+   video_cards = .;
+   *(.videocards)
+   video_cards_end = .;
+   }
+
+   . = ALIGN(16);
+   .data : {
+*(.data*)
+   }
+
+   .signature : {
+   end_signature = .;
+   LONG(0x65a22c82)
+   }
+
+   . = ALIGN(16);
+   .bss :  {
+   __bss_start = .;
+   *(.bss)
+   __bss_end = .;
+   }
+
+   . = ALIGN(16);
+   _end = .;
+
+   /DISCARD/ : {
+   *(.note*)
+   }
+
+   /* Adjust this as appropriate */
+   /* This allows 4 pages (16K) */
+   . = ASSERT(_end = 0x4000, Wakeup too big!);
+}


  +
  +   . = 0;
  +   .text   : { *(.text*) }
  +
  +   . = ALIGN(16);
 Why?
  +   .rodata : { *(.rodata*) }
  +
  +   .videocards : {
  +   video_cards = .;
  +   *(.videocards)
  +   video_cards_end = .;
  +   }
  +
  +   . = ALIGN(16);
 Why?
  +   .data   : { *(.data*) }
  +
  +   .signature  : {
  +   end_signature = .;
  +   LONG(0x65a22c82)
  +   }
  +
  +   . = ALIGN(16);
 Why?
  +   .bss:
  +   {
  +   __bss_start = .;
  +   *(.bss)
  +   __bss_end = .;
  +   }
  +
  +   . = ALIGN(16);
 Why?
  +   _end = .;
  +
  +   /DISCARD/ : { *(.note*) }
  +
  +   /* Adjust this as appropriate */
  +   /* This allows 4 pages (16K) */
  +   . = ASSERT(_end = 0x4000, Wakeup too big!);
 PAGE_SIZE * 4?
 
 
   Sam

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread Pavel Machek
On Fri 2008-02-08 23:01:51, Rafael J. Wysocki wrote:
 On Friday, 8 of February 2008, Pavel Machek wrote:
  Hi!
  
  Rafael, this is for you.
 
 Thanks.
 
  My cleanups, relative to your cleanup patch. You may need manual patching
  around rep/stosd.
 
 OK, I'll try to merge it.

For the record, now it is even tested on 32-bit and test-compiled on
64-bit.

Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [linux-pm] Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-08 Thread H. Peter Anvin

Pavel Machek wrote:


See arch/x86/kernel/acpi/realmode/wakeup.S (the version that was sent
to the list). No problem there, but table stored at nonzero
offset. Short jump at the beggining of table would fix it (ugly).



Ugly, but it's the standard way to deal.  We have it in the bzImage 
format, too.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Pavel Machek wrote:

Hi!

I really need the entry point to be at offset 0, so 
that I can get
pointers to my data. I could not figure out how to do 
it any other
way. And if 0 is taken, I thought I'd put header at the 
end.


Why not just put the structure at 0, and put pointers in 
the structure to everything else you need?


segments:offsets rear its ugly head here. I need %ds to point to my
data, and the way to do it is copy it from %cs; that needs start to be
at 0.

If you can find a solution that does not need this (some
segment/offset arithmetics at beggining of wakeup?) we could use it,
but I was lost between relocations.



Let me look at it in the morning.  Got a specific pointer?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

> >I really need the entry point to be at offset 0, so 
> >that I can get
> >pointers to my data. I could not figure out how to do 
> >it any other
> >way. And if 0 is taken, I thought I'd put header at the 
> >end.
> >
> 
> Why not just put the structure at 0, and put pointers in 
> the structure to everything else you need?

segments:offsets rear its ugly head here. I need %ds to point to my
data, and the way to do it is copy it from %cs; that needs start to be
at 0.

If you can find a solution that does not need this (some
segment/offset arithmetics at beggining of wakeup?) we could use it,
but I was lost between relocations.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Pavel Machek wrote:


I really need the entry point to be at offset 0, so that I can get
pointers to my data. I could not figure out how to do it any other
way. And if 0 is taken, I thought I'd put header at the end.



Why not just put the structure at 0, and put pointers in the structure 
to everything else you need?


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

> > > > > + header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
> > > > 
> > > > ... especially not with magic constants like this.
> > > 
> > > Yeah.  Pavel, what's at 0x3f00, btw?
> > 
> > struct wakeup_header.
> > 
> > I really need the entry point to be at offset 0, so that I can get
> > pointers to my data. I could not figure out how to do it any other
> > way. And if 0 is taken, I thought I'd put header at the end.
> 
> What does the number 0x3f00 follow from?

wakeup.ld:

SECTIONS
{
. = 0x3f00;
.header : { *(.header) }

Ok, if we can use defines, this is probably great candidate for one of
them.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
> Hi!

Hi,

> > > > -   memcpy((void *)acpi_wakeup_address, _start,
> > > > -  _end - _start);
> > > > -   acpi_copy_wakeup_routine(acpi_wakeup_address);
> > > > +   memcpy((void *)acpi_realmode, _code_start, 4*PAGE_SIZE);
> > > 
> > > Using a PAGE_SIZE multiplier here isn't a good thing...
> > 
> > Yes, I'll fix that in one of the next iterations.
> 
> Agreed.
> 
> > > > +   header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
> > > 
> > > ... especially not with magic constants like this.
> > 
> > Yeah.  Pavel, what's at 0x3f00, btw?
> 
> struct wakeup_header.
> 
> I really need the entry point to be at offset 0, so that I can get
> pointers to my data. I could not figure out how to do it any other
> way. And if 0 is taken, I thought I'd put header at the end.

What does the number 0x3f00 follow from?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

> > > - memcpy((void *)acpi_wakeup_address, _start,
> > > -_end - _start);
> > > - acpi_copy_wakeup_routine(acpi_wakeup_address);
> > > + memcpy((void *)acpi_realmode, _code_start, 4*PAGE_SIZE);
> > 
> > Using a PAGE_SIZE multiplier here isn't a good thing...
> 
> Yes, I'll fix that in one of the next iterations.

Agreed.

> > > + header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
> > 
> > ... especially not with magic constants like this.
> 
> Yeah.  Pavel, what's at 0x3f00, btw?

struct wakeup_header.

I really need the entry point to be at offset 0, so that I can get
pointers to my data. I could not figure out how to do it any other
way. And if 0 is taken, I thought I'd put header at the end.

Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin
Okay, this uses the iodelay as the timesource... here is the total 
silliness (and totally untested, of course.)


-hpa

static inline void io_delay(void)
{
	outb(0, 0x80);
}

static void udelay(int loops)
{
	while (loops--)
		io_delay();	/* Approximately 1 us */
}

static void beep(unsigned int hz)
{
	u8 enable;

	if (!hz) {
		enable = 0x00;		/* Turn off speaker */
	} else {
		u16 div = 1193181/hz;

		outb(0xb6, 0x43);	/* Ctr 2, squarewave, load, binary */
		io_delay();
		outb(div, 0x42);	/* LSB of counter */
		io_delay();
		outb(div >> 8, 0x42);	/* MSB of counter */
		io_delay();

		enable = 0x03;		/* Turn on speaker */
	}
	inb(0x61);		/* Dummy read of System Control Port B */
	io_delay();
	outb(enable, 0x61);	/* Enable timer 2 output to speaker */
	io_delay();
}

#define DOT_HZ		880
#define DASH_HZ		587
#define US_PER_DOT	125000

/* Okay, this is totally silly, but it's kind of fun. */
void send_morse(const char *pattern)
{
	char s;

	while ((s = *pattern++)) {
		switch (s) {
		case '.':
			beep(DOT_HZ);
			udelay(US_PER_DOT);
			beep(0);
			udelay(US_PER_DOT);
			break;
		case '-':
			beep(DASH_HZ);
			udelay(US_PER_DOT*3);
			beep(0);
			udelay(US_PER_DOT);
			break;
		default:	/* Assume it's a space */
			udelay(US_PER_DOT*3);
			break;
		}
	}
}




Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Rafael J. Wysocki wrote:

On Thursday, 7 of February 2008, H. Peter Anvin wrote:

Rafael J. Wysocki wrote:

Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
===
--- /dev/null
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
@@ -0,0 +1,122 @@
+/*
+ * ACPI wakeup real mode startup stub
+ */
+#include 
+#include 
+#include 
+#include 
+
+   .code16
+   .section ".header", "a"
+
+/* This should match the structure in wakeup.h */
+   .globl  wakeup_header
+wakeup_header:
+video_mode:.short  0   /* Video mode number */
+pmode_return:  .byte   0x66, 0xea  /* ljmpl */
+   .long   0   /* offset goes here */
+   .short  __KERNEL_CS

Missing a .short pad here... Pavel fixed that at some point, I thought.


Hm, the struct in wakeup.h doesn't contain it too.  Why exactly is it
necessary?


Err, I guess it's only necessary if _jmp2 is declared u32.  I generally 
prefer to keep fields naturally aligned even though x86 doesn't require 
it, it's a bit of paranoia on my part.




Yeah.  Pavel, what's at 0x3f00, btw?



To be fair, this might have come from my early hack, I don't know for sure.


In fact, I'd prefer to remove .signature from the header and use the
end_signature only, so that I can use struct wakeup_header for addressing
the header fields in the assembly too.


I *thought* that's what I had originally.  I'm a bit confused, or it 
might have been something Pavel changed.



Furthermore, by doing so, you're also padding the binary out to its maximum
length, so you might as well just remove the .bss-clearing stuff.


Do you mean placing the header at the end will fill the area between it and the
code with zeros, so the .bss clearing is not necessary?


Yes.  It could, of course, also be cleared by a simple memset() in the 
setup code in the kernel, as opposed by the initial assembly code. 
That's probably the preferred option.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, Pavel Machek wrote:
> On Thu 2008-02-07 14:46:25, H. Peter Anvin wrote:
> > Pavel Machek wrote:
> >>
> >> This is probably more acceptable version of beep; but there are
> >> probably even better ways to clean it...
> >>
> >> if (wakeup_header.realmode_flags & 4) {
> >> inb(97);
> >> outb(0, 0x80);
> >> outb(3, 97);
> >> outb(0, 0x80);
> >> outb(-74, 67);
> >> outb(0, 0x80);
> >> outb(-119, 66);
> >> outb(0, 0x80);
> >> outb(15, 66);
> >> }
> >>
> >
> > What is available at this point -- are BIOS calls still accessible; are 
> > interrupts running?
> 
> No interrupts. BIOS calls work on some machines, but I'd like this to
> work when bios does not.
> 
> Actually, matthieu's code is probably better to start from:
> 
> +/* one ISA cycle @8Mhz */
> +#define PAUSE outb %al, $0x80
> +#define WAIT_100MS \
> +   movl $80, %eax; \
> +   2: \
> +   PAUSE; \
> +   dec %eax; \
> +   jne 2b
> +
> +/* What's the PIT rate */
> +#define COUNT 0xf89
>  #define BEEP \
> -   inb $97, %al;   \
> -   outb%al, $0x80; \
> -   movb$3, %al;\
> -   outb%al, $97;   \
> -   outb%al, $0x80; \
> -   movb$-74, %al;  \
> -   outb%al, $67;   \
> -   outb%al, $0x80; \
> -   movb$-119, %al; \
> -   outb%al, $66;   \
> -   outb%al, $0x80; \
> -   movb$15, %al;   \
> -   outb%al, $66;
> +   /* enable counter 2 */ \
> +   inb $0x61, %al; \
> +   PAUSE;  \
> +   orb $3, %al; \
> +   outb%al, $0x61; \
> +   PAUSE;  \
> +   /* set command for counter 2, 2 byte write */ \
> +   movb$0xB6, %al; \
> +   outb%al, $0x43; \
> +   PAUSE;  \
> +   /* select desired HZ */ \
> +   movb$(COUNT & 0xff), %al; \
> +   outb%al, $0x42; \
> +   PAUSE;  \
> +   movb$(COUNT >> 8), %al; \
> +   outb%al, $0x42; \
> +   WAIT_100MS; \
> +   /* disable counter 2 */ \
> +   inb $0x61, %al; \
> +   PAUSE;  \
> +   andb$0xFC, %al; \
> +   outb%al, $0x61; \
> +   WAIT_100MS
> +
> +#define CBEEP \
> +   testl   $4, realmode_flags - wakeup_code; \
> +   jz  1f; \
> +   BEEP; \
> +1:
> 
> ...because it allows user to compute number of beeps.

Hm, it seems we can convert it at least partially to C.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, H. Peter Anvin wrote:
> Rafael J. Wysocki wrote:
> > Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
> > ===
> > --- /dev/null
> > +++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
> > @@ -0,0 +1,122 @@
> > +/*
> > + * ACPI wakeup real mode startup stub
> > + */
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +   .code16
> > +   .section ".header", "a"
> > +
> > +/* This should match the structure in wakeup.h */
> > +   .globl  wakeup_header
> > +wakeup_header:
> > +video_mode:.short  0   /* Video mode number */
> > +pmode_return:  .byte   0x66, 0xea  /* ljmpl */
> > +   .long   0   /* offset goes here */
> > +   .short  __KERNEL_CS
> 
> Missing a .short pad here... Pavel fixed that at some point, I thought.

Hm, the struct in wakeup.h doesn't contain it too.  Why exactly is it
necessary?

[--snip--]
> > }
> > -   memcpy((void *)acpi_wakeup_address, _start,
> > -  _end - _start);
> > -   acpi_copy_wakeup_routine(acpi_wakeup_address);
> > +   memcpy((void *)acpi_realmode, _code_start, 4*PAGE_SIZE);
> 
> Using a PAGE_SIZE multiplier here isn't a good thing...

Yes, I'll fix that in one of the next iterations.

> 
> > +   header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
> 
> ... especially not with magic constants like this.

Yeah.  Pavel, what's at 0x3f00, btw?

> If you're putting the "header" at the end, then you should also replace 
> the end_signature stuff since that's, then, redundant.

In fact, I'd prefer to remove .signature from the header and use the
end_signature only, so that I can use struct wakeup_header for addressing
the header fields in the assembly too.

> Furthermore, by doing so, you're also padding the binary out to its maximum
> length, so you might as well just remove the .bss-clearing stuff.

Do you mean placing the header at the end will fill the area between it and the
code with zeros, so the .bss clearing is not necessary?

> It's not really clear to me why to do this what way...
> 
> > +   if (header->signature != 0x51ee) {
> > +   printk(KERN_ERR "wakeup header does not match\n");
> > +   return -EINVAL;
> > +   }
> > +
> > +   header->video_mode = saved_video_mode;
> > +
> > +#ifndef CONFIG_64BIT
> > +   store_gdt(>pmode_gdt);
> > +
> > +   header->pmode_efer_low = nx_enabled;
> > +   if (header->pmode_efer_low & 1) {
> > +   /* This is strange, why not save efer, always? */
> > +   rdmsr(MSR_EFER, header->pmode_efer_low,
> > +   header->pmode_efer_high);
> > +   }
> 
> Yes, why not save EFER every time?

Well, I think we can do that.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, H. Peter Anvin wrote:
> Pavel Machek wrote:
> > 
> > This is probably more acceptable version of beep; but there are
> > probably even better ways to clean it...
> > 
> > if (wakeup_header.realmode_flags & 4) {
> > inb(97);
> > outb(0, 0x80);
> > outb(3, 97);
> > outb(0, 0x80);
> > outb(-74, 67);
> > outb(0, 0x80);
> > outb(-119, 66);
> > outb(0, 0x80);
> > outb(15, 66);
> > }
> > 
> 
> What is available at this point -- are BIOS calls still accessible; are 
> interrupts running?

No interrupts.

We're in the real mode, so BIOS calls should be accessible.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, H. Peter Anvin wrote:
> Rafael J. Wysocki wrote:
> > -   rep; stosl
> > +   rep
> > +   stosl
> 
> Yuck!
> 
> Please don't perpetuate the braindamage that this is two instructions. 
> It's one instruction with a modifier;

Sure, it is.

> the fact that gas wants a separator is broken enough as it is.

[Well, the newline is a separator too.]  I'll keep it in one line if you want
that.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
On Thu 2008-02-07 14:46:25, H. Peter Anvin wrote:
> Pavel Machek wrote:
>>
>> This is probably more acceptable version of beep; but there are
>> probably even better ways to clean it...
>>
>> if (wakeup_header.realmode_flags & 4) {
>> inb(97);
>> outb(0, 0x80);
>> outb(3, 97);
>> outb(0, 0x80);
>> outb(-74, 67);
>> outb(0, 0x80);
>> outb(-119, 66);
>> outb(0, 0x80);
>> outb(15, 66);
>> }
>>
>
> What is available at this point -- are BIOS calls still accessible; are 
> interrupts running?

No interrupts. BIOS calls work on some machines, but I'd like this to
work when bios does not.

Actually, matthieu's code is probably better to start from:

+/* one ISA cycle @8Mhz */
+#define PAUSE outb %al, $0x80
+#define WAIT_100MS \
+   movl $80, %eax; \
+   2: \
+   PAUSE; \
+   dec %eax; \
+   jne 2b
+
+/* What's the PIT rate */
+#define COUNT 0xf89
 #define BEEP \
-   inb $97, %al;   \
-   outb%al, $0x80; \
-   movb$3, %al;\
-   outb%al, $97;   \
-   outb%al, $0x80; \
-   movb$-74, %al;  \
-   outb%al, $67;   \
-   outb%al, $0x80; \
-   movb$-119, %al; \
-   outb%al, $66;   \
-   outb%al, $0x80; \
-   movb$15, %al;   \
-   outb%al, $66;
+   /* enable counter 2 */ \
+   inb $0x61, %al; \
+   PAUSE;  \
+   orb $3, %al; \
+   outb%al, $0x61; \
+   PAUSE;  \
+   /* set command for counter 2, 2 byte write */ \
+   movb$0xB6, %al; \
+   outb%al, $0x43; \
+   PAUSE;  \
+   /* select desired HZ */ \
+   movb$(COUNT & 0xff), %al; \
+   outb%al, $0x42; \
+   PAUSE;  \
+   movb$(COUNT >> 8), %al; \
+   outb%al, $0x42; \
+   WAIT_100MS; \
+   /* disable counter 2 */ \
+   inb $0x61, %al; \
+   PAUSE;  \
+   andb$0xFC, %al; \
+   outb%al, $0x61; \
+   WAIT_100MS
+
+#define CBEEP \
+   testl   $4, realmode_flags - wakeup_code; \
+   jz  1f; \
+   BEEP; \
+1:

...because it allows user to compute number of beeps.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
On Thu 2008-02-07 14:45:35, H. Peter Anvin wrote:
> Rafael J. Wysocki wrote:
>
>>  ENTRY(wakeup_long64)
>>  wakeup_long64:
>> -movqsaved_magic, %rax
>> -movq$0x123456789abcdef0, %rdx
>> -cmpq%rdx, %rax
>> -jne bogus_64_magic
>> +movqsaved_magic, %rax
>> +movq$0x123456789abcdef0, %rdx
>> +cmpq%rdx, %rax
>> +jne bogus_64_magic
>
> A random magic is probably more likely to be unique than something like 
> that.

This is already "unlikely enough", I'd say. It does not look like a
pointer, and it is long enough.

Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Pavel Machek wrote:


This is probably more acceptable version of beep; but there are
probably even better ways to clean it...

if (wakeup_header.realmode_flags & 4) {
inb(97);
outb(0, 0x80);
outb(3, 97);
outb(0, 0x80);
outb(-74, 67);
outb(0, 0x80);
outb(-119, 66);
outb(0, 0x80);
outb(15, 66);
}



What is available at this point -- are BIOS calls still accessible; are 
interrupts running?


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Rafael J. Wysocki wrote:


 ENTRY(wakeup_long64)
 wakeup_long64:
-   movqsaved_magic, %rax
-   movq$0x123456789abcdef0, %rdx
-   cmpq%rdx, %rax
-   jne bogus_64_magic
+   movqsaved_magic, %rax
+   movq$0x123456789abcdef0, %rdx
+   cmpq%rdx, %rax
+   jne bogus_64_magic


A random magic is probably more likely to be unique than something like 
that.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Rafael J. Wysocki wrote:

-   rep; stosl
+   rep
+   stosl


Yuck!

Please don't perpetuate the braindamage that this is two instructions. 
It's one instruction with a modifier; the fact that gas wants a 
separator is broken enough as it is.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, Pavel Machek wrote:
> Hi!
> 
> > > > > This rewrites wakeup code to .c, and it fixes stack (should use movl
> > > > > ,%esp, not movw). Testers wanted. Makefile infrastructure was done by
> > > > > hpa, cleanups by rjw.
> > > > 
> > > > I'll test it tomorrow
> > > 
> > > Works on my nx6325 (good sign, the box is easy to break ;-)).
> > > 
> > > > and I still have some more cleanups (I was distracted by a nasty 
> > > > scheduler
> > > > issue in the current mainline).
> > > 
> > > The cleanups are still in the works (sorry).
> > 
> > Below is a version with some easy cleanups, rebased on top of the patches 
> > that
> > move the 64-bit hibernation code to arch/x86/power .
> 
> Can you post a delta against my versoin? I do not see any changes from
> a quick glance.

Appended (plus I removed two hunks, one in arch/x86/Makefile and one in
drivers/acpi/sleep/main.c that were unrelated to the rest of the patch).
 
> This is probably more acceptable version of beep; but there are
> probably even better ways to clean it...
> 
> if (wakeup_header.realmode_flags & 4) {
> inb(97);
> outb(0, 0x80);
> outb(3, 97);
> outb(0, 0x80);
> outb(-74, 67);
> outb(0, 0x80);
> outb(-119, 66);
> outb(0, 0x80);
> outb(15, 66);
> }
> 
> ...like the version that makes beep/pause/beep/pause, so that user can
> count them.

Can we move it into a separate function?

Rafael

---
 arch/x86/boot/video-vesa.c |   12 
 arch/x86/kernel/acpi/Makefile  |2 
 arch/x86/kernel/acpi/realmode/Makefile |2 
 arch/x86/kernel/acpi/realmode/wakeup.S |   34 +-
 arch/x86/kernel/acpi/wakeup.S  |1 
 arch/x86/kernel/acpi/wakeup_32.S   |   34 +-
 arch/x86/kernel/acpi/wakeup_64.S   |   21 -
 arch/x86/kernel/acpi/wakeup_rm.S   |2 
 arch/x86_64/kernel/acpi/wakeup.S   |  425 -
 9 files changed, 50 insertions(+), 483 deletions(-)

Index: linux-2.6/arch/x86_64/kernel/acpi/wakeup.S
===
--- linux-2.6.orig/arch/x86_64/kernel/acpi/wakeup.S
+++ /dev/null
@@ -1,425 +0,0 @@
-.text
-#include 
-#include 
-#include 
-#include 
-#include 
-
-# Copyright 2003 Pavel Machek <[EMAIL PROTECTED]>, distribute under GPLv2
-#
-# wakeup_code runs in real mode, and at unknown address (determined at 
run-time).
-# Therefore it must only use relative jumps/calls. 
-#
-# Do we need to deal with A20? It is okay: ACPI specs says A20 must be enabled
-#
-# If physical address of wakeup_code is 0x12345, BIOS should call us with
-# cs = 0x1234, eip = 0x05
-#
-
-#define BEEP \
-   inb $97, %al;   \
-   outb%al, $0x80; \
-   movb$3, %al;\
-   outb%al, $97;   \
-   outb%al, $0x80; \
-   movb$-74, %al;  \
-   outb%al, $67;   \
-   outb%al, $0x80; \
-   movb$-119, %al; \
-   outb%al, $66;   \
-   outb%al, $0x80; \
-   movb$15, %al;   \
-   outb%al, $66;
-
-
-ALIGN
-   .align  16
-ENTRY(wakeup_start)
-wakeup_code:
-   wakeup_code_start = .
-   .code16
-
-# Running in *copy* of this code, somewhere in low 1MB.
-
-   cli
-   cld
-   # setup data segment
-   movw%cs, %ax
-   movw%ax, %ds# Make ds:0 point to wakeup_start
-   movw%ax, %ss
-
-   # Data segment must be set up before we can see whether to beep.
-   testl   $4, realmode_flags - wakeup_code
-   jz  1f
-   BEEP
-1:
-
-   # Private stack is needed for ASUS board
-   mov $(wakeup_stack - wakeup_code), %sp
-
-   pushl   $0  # Kill any dangerous flags
-   popfl
-
-   movlreal_magic - wakeup_code, %eax
-   cmpl$0x12345678, %eax
-   jne bogus_real_magic
-
-   testl   $1, realmode_flags - wakeup_code
-   jz  1f
-   lcall   $0xc000,$3
-   movw%cs, %ax
-   movw%ax, %ds# Bios might have played with that
-   movw%ax, %ss
-1:
-
-   testl   $2, realmode_flags - wakeup_code
-   jz  1f
-   mov video_mode - wakeup_code, %ax
-   callmode_set
-1:
-
-   mov %ds, %ax# Find 32bit wakeup_code addr
-   movzx   %ax, %esi   # (Convert %ds:gdt to a liner 
ptr)
-   shll$4, %esi
-   # Fix up the vectors
-   addl%esi, wakeup_32_vector - wakeup_code
-   addl%esi, wakeup_long64_vector - wakeup_code
-   addl%esi, gdt_48a + 2 - wakeup_code # Fixup the gdt pointer
-
-   lidtl   %ds:idt_48a - wakeup_code
-   lgdtl   %ds:gdt_48a - wakeup_code   # load gdt with whatever is
- 

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Rafael J. Wysocki wrote:

Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
===
--- /dev/null
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
@@ -0,0 +1,122 @@
+/*
+ * ACPI wakeup real mode startup stub
+ */
+#include 
+#include 
+#include 
+#include 
+
+   .code16
+   .section ".header", "a"
+
+/* This should match the structure in wakeup.h */
+   .globl  wakeup_header
+wakeup_header:
+video_mode:.short  0   /* Video mode number */
+pmode_return:  .byte   0x66, 0xea  /* ljmpl */
+   .long   0   /* offset goes here */
+   .short  __KERNEL_CS


Missing a .short pad here... Pavel fixed that at some point, I thought.


+pmode_cr0: .long   0   /* Saved %cr0 */
+pmode_cr3: .long   0   /* Saved %cr3 */
+pmode_cr4: .long   0   /* Saved %cr4 */
+pmode_efer:.quad   0   /* Saved EFER */
+pmode_gdt: .quad   0
+realmode_flags:.long   0
+real_magic:.long   0
+trampoline_segment:.word 0
+signature: .long   0x51ee
+
+   .text
+   .globl  _start
+   .code16
+wakeup_code:
+_start:
+   cli
+   cld
+
+   /* Set up segments */
+   movw%cs, %ax
+   movw%ax, %ds
+   movw%ax, %es
+   movw%ax, %ss
+
+   movl$wakeup_stack_end, %esp
+
+   /* Clear the EFLAGS */
+   pushl   $0
+   popfl
+
+   /* Check header signature... */
+   movlsignature, %eax
+   cmpl$0x51ee, %eax
+   jne bogus_real_magic
+
+   /* Check we really have everything... */
+   movlend_signature, %eax
+   cmpl$0x65a22c82, %eax
+   jne bogus_real_magic
+
+   /* Zero the bss */
+   xorl%eax, %eax
+   movw$__bss_start, %di
+   movw$__bss_end + 3, %cx
+   subw%di, %cx
+   shrw$2, %cx
+   rep
+   stosl
+
+   /* Call the C code */
+   calll   main
+
+   /* Do any other stuff... */
+
+#ifndef CONFIG_64BIT
+   /* This could also be done in C code... */
+   movlpmode_cr3, %eax
+   movl%eax, %cr3
+
+   movlpmode_cr4, %ecx
+   jecxz   1f
+   movl%ecx, %cr4
+1:
+   movlpmode_efer, %eax
+   movlpmode_efer + 4, %edx
+   movl%eax, %ecx
+   orl %edx, %ecx
+   jz  1f
+   movl$0xc080, %ecx
+   wrmsr
+1:
+
+   lgdtl   pmode_gdt
+
+   /* This really couldn't... */
+   movlpmode_cr0, %eax
+   movl%eax, %cr0
+   jmp pmode_return
+#else
+   pushw   $0
+   pushw   trampoline_segment
+   pushw   $0
+   lret
+#endif
+
+bogus_real_magic:
+1:
+   hlt
+   jmp 1b
+
+   .data
+   .balign 4
+   .globl  HEAP, heap_end
+HEAP:
+   .long   wakeup_heap
+heap_end:
+   .long   wakeup_stack
+
+   .bss
+wakeup_heap:
+   .space  2048
+wakeup_stack:
+   .space  2048
+wakeup_stack_end:
Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.h
===
--- /dev/null
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.h
@@ -0,0 +1,29 @@
+/*
+ * Definitions for the wakeup data structure at the head of the
+ * wakeup code.
+ */
+
+#ifndef ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
+#define ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H
+
+#include 
+
+/* This must match data at wakeup.S */
+struct wakeup_header {
+   u16 video_mode; /* Video mode number */
+   u16 _jmp1;  /* ljmpl opcode, 32-bit only */
+   u32 pmode_entry;/* Protected mode resume point, 32-bit only */
+   u16 _jmp2;  /* CS value, 32-bit only */
+   u32 pmode_cr0;  /* Protected mode cr0 */
+   u32 pmode_cr3;  /* Protected mode cr3 */
+   u32 pmode_cr4;  /* Protected mode cr4 */
+   u32 pmode_efer_low; /* Protected mode EFER */
+   u32 pmode_efer_high;
+   u64 pmode_gdt;
+   u32 realmode_flags;
+   u32 real_magic;
+   u16 trampoline_segment; /* segment with trampoline code, 64-bit only */
+   u32 signature;  /* To check we have correct structure */
+} __attribute__((__packed__));
+
+#endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.ld
===
--- /dev/null
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.ld
@@ -0,0 +1,51 @@
+/*
+ * wakeup.ld
+ *
+ * Linker script for the real-mode wakeup code
+ */
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+   . = 0x3f00;
+   .header : { *(.header) }
+
+   . = 0;
+   .text   : { *(.text*) }
+
+   . = ALIGN(16);
+   .rodata : { *(.rodata*) }
+
+   .videocards : {
+   video_cards = .;
+   *(.videocards)
+   

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Sam Ravnborg wrote:

+
+   . = 0;
+   .text   : { *(.text*) }
+
+   . = ALIGN(16);

Why?


It's good practice to have at least paragraph (segment boundary) 
alignment between different types of data.  In the case of the .bss, it 
also allows cleaning with rep;movsl.


It's technically not all that necessary (except for 4-byte alignment for 
the .bss), but it makes things easier to debug on the assembly level.



+   /* Adjust this as appropriate */
+   /* This allows 4 pages (16K) */
+   . = ASSERT(_end <= 0x4000, "Wakeup too big!");

PAGE_SIZE * 4?


Not really, because it's not at all related to the kernel page size; the 
reference to pages there is informal.  If we go to a larger virtual page 
size we do NOT want this to change.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

> > > > This rewrites wakeup code to .c, and it fixes stack (should use movl
> > > > ,%esp, not movw). Testers wanted. Makefile infrastructure was done by
> > > > hpa, cleanups by rjw.
> > > 
> > > I'll test it tomorrow
> > 
> > Works on my nx6325 (good sign, the box is easy to break ;-)).
> > 
> > > and I still have some more cleanups (I was distracted by a nasty scheduler
> > > issue in the current mainline).
> > 
> > The cleanups are still in the works (sorry).
> 
> Below is a version with some easy cleanups, rebased on top of the patches that
> move the 64-bit hibernation code to arch/x86/power .

Can you post a delta against my versoin? I do not see any changes from
a quick glance.

This is probably more acceptable version of beep; but there are
probably even better ways to clean it...

if (wakeup_header.realmode_flags & 4) {
inb(97);
outb(0, 0x80);
outb(3, 97);
outb(0, 0x80);
outb(-74, 67);
outb(0, 0x80);
outb(-119, 66);
outb(0, 0x80);
outb(15, 66);
}

...like the version that makes beep/pause/beep/pause, so that user can
count them.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Sam Ravnborg
> ===
> --- /dev/null
> +++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.ld
> @@ -0,0 +1,51 @@
> +/*
> + * wakeup.ld
> + *
> + * Linker script for the real-mode wakeup code
> + */
> +OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
> +OUTPUT_ARCH(i386)
> +ENTRY(_start)
> +
> +SECTIONS
> +{
> + . = 0x3f00;
> + .header : { *(.header) }

Can we please use C style in this file.
Like this:

{
.header : {
*(.header)
}

It is not as short as the above but it pays of to keep
an consistent style in the whole file and across
different .lds files.

And for good measure name it wakeup.lds.

Do we never need data from a .h file?
If we do name it wakeup.lds.S and kbuild
will fix it (assuming we have wakeup.lds
as a prerequisite where it is needed.

> +
> + . = 0;
> + .text   : { *(.text*) }
> +
> + . = ALIGN(16);
Why?
> + .rodata : { *(.rodata*) }
> +
> + .videocards : {
> + video_cards = .;
> + *(.videocards)
> + video_cards_end = .;
> + }
> +
> + . = ALIGN(16);
Why?
> + .data   : { *(.data*) }
> +
> + .signature  : {
> + end_signature = .;
> + LONG(0x65a22c82)
> + }
> +
> + . = ALIGN(16);
Why?
> + .bss:
> + {
> + __bss_start = .;
> + *(.bss)
> + __bss_end = .;
> + }
> +
> + . = ALIGN(16);
Why?
> + _end = .;
> +
> + /DISCARD/ : { *(.note*) }
> +
> + /* Adjust this as appropriate */
> + /* This allows 4 pages (16K) */
> + . = ASSERT(_end <= 0x4000, "Wakeup too big!");
PAGE_SIZE * 4?


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, Rafael J. Wysocki wrote:
> On Wednesday, 6 of February 2008, Rafael J. Wysocki wrote:
> > On Tuesday, 5 of February 2008, Pavel Machek wrote:
> > > 
> > > This rewrites wakeup code to .c, and it fixes stack (should use movl
> > > ,%esp, not movw). Testers wanted. Makefile infrastructure was done by
> > > hpa, cleanups by rjw.
> > 
> > I'll test it tomorrow
> 
> Works on my nx6325 (good sign, the box is easy to break ;-)).
> 
> > and I still have some more cleanups (I was distracted by a nasty scheduler
> > issue in the current mainline).
> 
> The cleanups are still in the works (sorry).

Below is a version with some easy cleanups, rebased on top of the patches that
move the 64-bit hibernation code to arch/x86/power .

Thanks,
Rafael

---
 arch/x86/boot/Makefile |2 
 arch/x86/boot/boot.h   |5 
 arch/x86/boot/video-bios.c |6 
 arch/x86/boot/video-mode.c |  173 
 arch/x86/boot/video-vesa.c |8 
 arch/x86/boot/video-vga.c  |   12 -
 arch/x86/boot/video.c  |  157 --
 arch/x86/kernel/acpi/Makefile  |9 
 arch/x86/kernel/acpi/realmode/Makefile |   55 +
 arch/x86/kernel/acpi/realmode/copy.S   |1 
 arch/x86/kernel/acpi/realmode/video-bios.c |1 
 arch/x86/kernel/acpi/realmode/video-mode.c |1 
 arch/x86/kernel/acpi/realmode/video-vesa.c |1 
 arch/x86/kernel/acpi/realmode/video-vga.c  |1 
 arch/x86/kernel/acpi/realmode/wakemain.c   |   26 ++
 arch/x86/kernel/acpi/realmode/wakeup.S |  122 +++
 arch/x86/kernel/acpi/realmode/wakeup.h |   29 ++
 arch/x86/kernel/acpi/realmode/wakeup.ld|   51 
 arch/x86/kernel/acpi/sleep.c   |   80 ++-
 arch/x86/kernel/acpi/wakeup_32.S   |  245 +-
 arch/x86/kernel/acpi/wakeup_64.S   |  313 -
 arch/x86/kernel/acpi/wakeup_rm.S   |   10 
 arch/x86/kernel/head_64.S  |4 
 arch/x86/kernel/setup_32.c |4 
 arch/x86/kernel/smpboot_64.c   |   10 
 25 files changed, 614 insertions(+), 712 deletions(-)

Index: linux-2.6/arch/x86/boot/Makefile
===
--- linux-2.6.orig/arch/x86/boot/Makefile
+++ linux-2.6/arch/x86/boot/Makefile
@@ -30,7 +30,7 @@ subdir-   := compressed
 
 setup-y+= a20.o cmdline.o copy.o cpu.o cpucheck.o edd.o
 setup-y+= header.o main.o mca.o memory.o pm.o pmjump.o
-setup-y+= printf.o string.o tty.o video.o version.o
+setup-y+= printf.o string.o tty.o video.o video-mode.o 
version.o
 setup-$(CONFIG_X86_APM_BOOT) += apm.o
 setup-$(CONFIG_X86_VOYAGER) += voyager.o
 
Index: linux-2.6/arch/x86/boot/boot.h
===
--- linux-2.6.orig/arch/x86/boot/boot.h
+++ linux-2.6/arch/x86/boot/boot.h
@@ -286,6 +286,11 @@ int getchar_timeout(void);
 /* video.c */
 void set_video(void);
 
+/* video-mode.c */
+int set_mode(u16 mode);
+int mode_defined(u16 mode);
+void probe_cards(int unsafe);
+
 /* video-vesa.c */
 void vesa_store_edid(void);
 
Index: linux-2.6/arch/x86/boot/video-bios.c
===
--- linux-2.6.orig/arch/x86/boot/video-bios.c
+++ linux-2.6/arch/x86/boot/video-bios.c
@@ -50,6 +50,7 @@ static int set_bios_mode(u8 mode)
if (new_mode == mode)
return 0;   /* Mode change OK */
 
+#ifndef _WAKEUP
if (new_mode != boot_params.screen_info.orig_video_mode) {
/* Mode setting failed, but we didn't end up where we
   started.  That's bad.  Try to revert to the original
@@ -59,13 +60,18 @@ static int set_bios_mode(u8 mode)
 : "+a" (ax)
 : : "ebx", "ecx", "edx", "esi", "edi");
}
+#endif
return -1;
 }
 
 static int bios_probe(void)
 {
u8 mode;
+#ifdef _WAKEUP
+   u8 saved_mode = 0x03;
+#else
u8 saved_mode = boot_params.screen_info.orig_video_mode;
+#endif
u16 crtc;
struct mode_info *mi;
int nmodes = 0;
Index: linux-2.6/arch/x86/boot/video-mode.c
===
--- /dev/null
+++ linux-2.6/arch/x86/boot/video-mode.c
@@ -0,0 +1,173 @@
+/* -*- linux-c -*- --- *
+ *
+ *   Copyright (C) 1991, 1992 Linus Torvalds
+ *   Copyright 2007-2008 rPath, Inc. - All Rights Reserved
+ *
+ *   This file is part of the Linux kernel, and is made available under
+ *   the terms of the GNU General Public License version 2.
+ *
+ * --- */
+
+/*
+ * arch/i386/boot/video-mode.c
+ *
+ * Set the video mode.  This is separated out 

Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Rafael J. Wysocki wrote:


 ENTRY(wakeup_long64)
 wakeup_long64:
-   movqsaved_magic, %rax
-   movq$0x123456789abcdef0, %rdx
-   cmpq%rdx, %rax
-   jne bogus_64_magic
+   movqsaved_magic, %rax
+   movq$0x123456789abcdef0, %rdx
+   cmpq%rdx, %rax
+   jne bogus_64_magic


A random magic is probably more likely to be unique than something like 
that.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Pavel Machek wrote:


This is probably more acceptable version of beep; but there are
probably even better ways to clean it...

if (wakeup_header.realmode_flags  4) {
inb(97);
outb(0, 0x80);
outb(3, 97);
outb(0, 0x80);
outb(-74, 67);
outb(0, 0x80);
outb(-119, 66);
outb(0, 0x80);
outb(15, 66);
}



What is available at this point -- are BIOS calls still accessible; are 
interrupts running?


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
On Thu 2008-02-07 14:45:35, H. Peter Anvin wrote:
 Rafael J. Wysocki wrote:

  ENTRY(wakeup_long64)
  wakeup_long64:
 -movqsaved_magic, %rax
 -movq$0x123456789abcdef0, %rdx
 -cmpq%rdx, %rax
 -jne bogus_64_magic
 +movqsaved_magic, %rax
 +movq$0x123456789abcdef0, %rdx
 +cmpq%rdx, %rax
 +jne bogus_64_magic

 A random magic is probably more likely to be unique than something like 
 that.

This is already unlikely enough, I'd say. It does not look like a
pointer, and it is long enough.

Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
On Thu 2008-02-07 14:46:25, H. Peter Anvin wrote:
 Pavel Machek wrote:

 This is probably more acceptable version of beep; but there are
 probably even better ways to clean it...

 if (wakeup_header.realmode_flags  4) {
 inb(97);
 outb(0, 0x80);
 outb(3, 97);
 outb(0, 0x80);
 outb(-74, 67);
 outb(0, 0x80);
 outb(-119, 66);
 outb(0, 0x80);
 outb(15, 66);
 }


 What is available at this point -- are BIOS calls still accessible; are 
 interrupts running?

No interrupts. BIOS calls work on some machines, but I'd like this to
work when bios does not.

Actually, matthieu's code is probably better to start from:

+/* one ISA cycle @8Mhz */
+#define PAUSE outb %al, $0x80
+#define WAIT_100MS \
+   movl $80, %eax; \
+   2: \
+   PAUSE; \
+   dec %eax; \
+   jne 2b
+
+/* What's the PIT rate */
+#define COUNT 0xf89
 #define BEEP \
-   inb $97, %al;   \
-   outb%al, $0x80; \
-   movb$3, %al;\
-   outb%al, $97;   \
-   outb%al, $0x80; \
-   movb$-74, %al;  \
-   outb%al, $67;   \
-   outb%al, $0x80; \
-   movb$-119, %al; \
-   outb%al, $66;   \
-   outb%al, $0x80; \
-   movb$15, %al;   \
-   outb%al, $66;
+   /* enable counter 2 */ \
+   inb $0x61, %al; \
+   PAUSE;  \
+   orb $3, %al; \
+   outb%al, $0x61; \
+   PAUSE;  \
+   /* set command for counter 2, 2 byte write */ \
+   movb$0xB6, %al; \
+   outb%al, $0x43; \
+   PAUSE;  \
+   /* select desired HZ */ \
+   movb$(COUNT  0xff), %al; \
+   outb%al, $0x42; \
+   PAUSE;  \
+   movb$(COUNT  8), %al; \
+   outb%al, $0x42; \
+   WAIT_100MS; \
+   /* disable counter 2 */ \
+   inb $0x61, %al; \
+   PAUSE;  \
+   andb$0xFC, %al; \
+   outb%al, $0x61; \
+   WAIT_100MS
+
+#define CBEEP \
+   testl   $4, realmode_flags - wakeup_code; \
+   jz  1f; \
+   BEEP; \
+1:

...because it allows user to compute number of beeps.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, H. Peter Anvin wrote:
 Rafael J. Wysocki wrote:
  -   rep; stosl
  +   rep
  +   stosl
 
 Yuck!
 
 Please don't perpetuate the braindamage that this is two instructions. 
 It's one instruction with a modifier;

Sure, it is.

 the fact that gas wants a separator is broken enough as it is.

[Well, the newline is a separator too.]  I'll keep it in one line if you want
that.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, H. Peter Anvin wrote:
 Pavel Machek wrote:
  
  This is probably more acceptable version of beep; but there are
  probably even better ways to clean it...
  
  if (wakeup_header.realmode_flags  4) {
  inb(97);
  outb(0, 0x80);
  outb(3, 97);
  outb(0, 0x80);
  outb(-74, 67);
  outb(0, 0x80);
  outb(-119, 66);
  outb(0, 0x80);
  outb(15, 66);
  }
  
 
 What is available at this point -- are BIOS calls still accessible; are 
 interrupts running?

No interrupts.

We're in the real mode, so BIOS calls should be accessible.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

This rewrites wakeup code to .c, and it fixes stack (should use movl
,%esp, not movw). Testers wanted. Makefile infrastructure was done by
hpa, cleanups by rjw.
   
   I'll test it tomorrow
  
  Works on my nx6325 (good sign, the box is easy to break ;-)).
  
   and I still have some more cleanups (I was distracted by a nasty scheduler
   issue in the current mainline).
  
  The cleanups are still in the works (sorry).
 
 Below is a version with some easy cleanups, rebased on top of the patches that
 move the 64-bit hibernation code to arch/x86/power .

Can you post a delta against my versoin? I do not see any changes from
a quick glance.

This is probably more acceptable version of beep; but there are
probably even better ways to clean it...

if (wakeup_header.realmode_flags  4) {
inb(97);
outb(0, 0x80);
outb(3, 97);
outb(0, 0x80);
outb(-74, 67);
outb(0, 0x80);
outb(-119, 66);
outb(0, 0x80);
outb(15, 66);
}

...like the version that makes beep/pause/beep/pause, so that user can
count them.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Sam Ravnborg
 ===
 --- /dev/null
 +++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.ld
 @@ -0,0 +1,51 @@
 +/*
 + * wakeup.ld
 + *
 + * Linker script for the real-mode wakeup code
 + */
 +OUTPUT_FORMAT(elf32-i386, elf32-i386, elf32-i386)
 +OUTPUT_ARCH(i386)
 +ENTRY(_start)
 +
 +SECTIONS
 +{
 + . = 0x3f00;
 + .header : { *(.header) }

Can we please use C style in this file.
Like this:

{
.header : {
*(.header)
}

It is not as short as the above but it pays of to keep
an consistent style in the whole file and across
different .lds files.

And for good measure name it wakeup.lds.

Do we never need data from a .h file?
If we do name it wakeup.lds.S and kbuild
will fix it (assuming we have wakeup.lds
as a prerequisite where it is needed.

 +
 + . = 0;
 + .text   : { *(.text*) }
 +
 + . = ALIGN(16);
Why?
 + .rodata : { *(.rodata*) }
 +
 + .videocards : {
 + video_cards = .;
 + *(.videocards)
 + video_cards_end = .;
 + }
 +
 + . = ALIGN(16);
Why?
 + .data   : { *(.data*) }
 +
 + .signature  : {
 + end_signature = .;
 + LONG(0x65a22c82)
 + }
 +
 + . = ALIGN(16);
Why?
 + .bss:
 + {
 + __bss_start = .;
 + *(.bss)
 + __bss_end = .;
 + }
 +
 + . = ALIGN(16);
Why?
 + _end = .;
 +
 + /DISCARD/ : { *(.note*) }
 +
 + /* Adjust this as appropriate */
 + /* This allows 4 pages (16K) */
 + . = ASSERT(_end = 0x4000, Wakeup too big!);
PAGE_SIZE * 4?


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, H. Peter Anvin wrote:
 Rafael J. Wysocki wrote:
  Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
  ===
  --- /dev/null
  +++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
  @@ -0,0 +1,122 @@
  +/*
  + * ACPI wakeup real mode startup stub
  + */
  +#include asm/segment.h
  +#include asm/msr-index.h
  +#include asm/page_64.h
  +#include asm/pgtable_64.h
  +
  +   .code16
  +   .section .header, a
  +
  +/* This should match the structure in wakeup.h */
  +   .globl  wakeup_header
  +wakeup_header:
  +video_mode:.short  0   /* Video mode number */
  +pmode_return:  .byte   0x66, 0xea  /* ljmpl */
  +   .long   0   /* offset goes here */
  +   .short  __KERNEL_CS
 
 Missing a .short pad here... Pavel fixed that at some point, I thought.

Hm, the struct in wakeup.h doesn't contain it too.  Why exactly is it
necessary?

[--snip--]
  }
  -   memcpy((void *)acpi_wakeup_address, wakeup_start,
  -  wakeup_end - wakeup_start);
  -   acpi_copy_wakeup_routine(acpi_wakeup_address);
  +   memcpy((void *)acpi_realmode, wakeup_code_start, 4*PAGE_SIZE);
 
 Using a PAGE_SIZE multiplier here isn't a good thing...

Yes, I'll fix that in one of the next iterations.

 
  +   header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
 
 ... especially not with magic constants like this.

Yeah.  Pavel, what's at 0x3f00, btw?

 If you're putting the header at the end, then you should also replace 
 the end_signature stuff since that's, then, redundant.

In fact, I'd prefer to remove .signature from the header and use the
end_signature only, so that I can use struct wakeup_header for addressing
the header fields in the assembly too.

 Furthermore, by doing so, you're also padding the binary out to its maximum
 length, so you might as well just remove the .bss-clearing stuff.

Do you mean placing the header at the end will fill the area between it and the
code with zeros, so the .bss clearing is not necessary?

 It's not really clear to me why to do this what way...
 
  +   if (header-signature != 0x51ee) {
  +   printk(KERN_ERR wakeup header does not match\n);
  +   return -EINVAL;
  +   }
  +
  +   header-video_mode = saved_video_mode;
  +
  +#ifndef CONFIG_64BIT
  +   store_gdt(header-pmode_gdt);
  +
  +   header-pmode_efer_low = nx_enabled;
  +   if (header-pmode_efer_low  1) {
  +   /* This is strange, why not save efer, always? */
  +   rdmsr(MSR_EFER, header-pmode_efer_low,
  +   header-pmode_efer_high);
  +   }
 
 Yes, why not save EFER every time?

Well, I think we can do that.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Thursday, 7 of February 2008, Pavel Machek wrote:
 On Thu 2008-02-07 14:46:25, H. Peter Anvin wrote:
  Pavel Machek wrote:
 
  This is probably more acceptable version of beep; but there are
  probably even better ways to clean it...
 
  if (wakeup_header.realmode_flags  4) {
  inb(97);
  outb(0, 0x80);
  outb(3, 97);
  outb(0, 0x80);
  outb(-74, 67);
  outb(0, 0x80);
  outb(-119, 66);
  outb(0, 0x80);
  outb(15, 66);
  }
 
 
  What is available at this point -- are BIOS calls still accessible; are 
  interrupts running?
 
 No interrupts. BIOS calls work on some machines, but I'd like this to
 work when bios does not.
 
 Actually, matthieu's code is probably better to start from:
 
 +/* one ISA cycle @8Mhz */
 +#define PAUSE outb %al, $0x80
 +#define WAIT_100MS \
 +   movl $80, %eax; \
 +   2: \
 +   PAUSE; \
 +   dec %eax; \
 +   jne 2b
 +
 +/* What's the PIT rate */
 +#define COUNT 0xf89
  #define BEEP \
 -   inb $97, %al;   \
 -   outb%al, $0x80; \
 -   movb$3, %al;\
 -   outb%al, $97;   \
 -   outb%al, $0x80; \
 -   movb$-74, %al;  \
 -   outb%al, $67;   \
 -   outb%al, $0x80; \
 -   movb$-119, %al; \
 -   outb%al, $66;   \
 -   outb%al, $0x80; \
 -   movb$15, %al;   \
 -   outb%al, $66;
 +   /* enable counter 2 */ \
 +   inb $0x61, %al; \
 +   PAUSE;  \
 +   orb $3, %al; \
 +   outb%al, $0x61; \
 +   PAUSE;  \
 +   /* set command for counter 2, 2 byte write */ \
 +   movb$0xB6, %al; \
 +   outb%al, $0x43; \
 +   PAUSE;  \
 +   /* select desired HZ */ \
 +   movb$(COUNT  0xff), %al; \
 +   outb%al, $0x42; \
 +   PAUSE;  \
 +   movb$(COUNT  8), %al; \
 +   outb%al, $0x42; \
 +   WAIT_100MS; \
 +   /* disable counter 2 */ \
 +   inb $0x61, %al; \
 +   PAUSE;  \
 +   andb$0xFC, %al; \
 +   outb%al, $0x61; \
 +   WAIT_100MS
 +
 +#define CBEEP \
 +   testl   $4, realmode_flags - wakeup_code; \
 +   jz  1f; \
 +   BEEP; \
 +1:
 
 ...because it allows user to compute number of beeps.

Hm, it seems we can convert it at least partially to C.

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Rafael J. Wysocki wrote:

On Thursday, 7 of February 2008, H. Peter Anvin wrote:

Rafael J. Wysocki wrote:

Index: linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
===
--- /dev/null
+++ linux-2.6/arch/x86/kernel/acpi/realmode/wakeup.S
@@ -0,0 +1,122 @@
+/*
+ * ACPI wakeup real mode startup stub
+ */
+#include asm/segment.h
+#include asm/msr-index.h
+#include asm/page_64.h
+#include asm/pgtable_64.h
+
+   .code16
+   .section .header, a
+
+/* This should match the structure in wakeup.h */
+   .globl  wakeup_header
+wakeup_header:
+video_mode:.short  0   /* Video mode number */
+pmode_return:  .byte   0x66, 0xea  /* ljmpl */
+   .long   0   /* offset goes here */
+   .short  __KERNEL_CS

Missing a .short pad here... Pavel fixed that at some point, I thought.


Hm, the struct in wakeup.h doesn't contain it too.  Why exactly is it
necessary?


Err, I guess it's only necessary if _jmp2 is declared u32.  I generally 
prefer to keep fields naturally aligned even though x86 doesn't require 
it, it's a bit of paranoia on my part.




Yeah.  Pavel, what's at 0x3f00, btw?



To be fair, this might have come from my early hack, I don't know for sure.


In fact, I'd prefer to remove .signature from the header and use the
end_signature only, so that I can use struct wakeup_header for addressing
the header fields in the assembly too.


I *thought* that's what I had originally.  I'm a bit confused, or it 
might have been something Pavel changed.



Furthermore, by doing so, you're also padding the binary out to its maximum
length, so you might as well just remove the .bss-clearing stuff.


Do you mean placing the header at the end will fill the area between it and the
code with zeros, so the .bss clearing is not necessary?


Yes.  It could, of course, also be cleared by a simple memset() in the 
setup code in the kernel, as opposed by the initial assembly code. 
That's probably the preferred option.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin
Okay, this uses the iodelay as the timesource... here is the total 
silliness (and totally untested, of course.)


-hpa

static inline void io_delay(void)
{
	outb(0, 0x80);
}

static void udelay(int loops)
{
	while (loops--)
		io_delay();	/* Approximately 1 us */
}

static void beep(unsigned int hz)
{
	u8 enable;

	if (!hz) {
		enable = 0x00;		/* Turn off speaker */
	} else {
		u16 div = 1193181/hz;

		outb(0xb6, 0x43);	/* Ctr 2, squarewave, load, binary */
		io_delay();
		outb(div, 0x42);	/* LSB of counter */
		io_delay();
		outb(div  8, 0x42);	/* MSB of counter */
		io_delay();

		enable = 0x03;		/* Turn on speaker */
	}
	inb(0x61);		/* Dummy read of System Control Port B */
	io_delay();
	outb(enable, 0x61);	/* Enable timer 2 output to speaker */
	io_delay();
}

#define DOT_HZ		880
#define DASH_HZ		587
#define US_PER_DOT	125000

/* Okay, this is totally silly, but it's kind of fun. */
void send_morse(const char *pattern)
{
	char s;

	while ((s = *pattern++)) {
		switch (s) {
		case '.':
			beep(DOT_HZ);
			udelay(US_PER_DOT);
			beep(0);
			udelay(US_PER_DOT);
			break;
		case '-':
			beep(DASH_HZ);
			udelay(US_PER_DOT*3);
			beep(0);
			udelay(US_PER_DOT);
			break;
		default:	/* Assume it's a space */
			udelay(US_PER_DOT*3);
			break;
		}
	}
}




Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Sam Ravnborg wrote:

+
+   . = 0;
+   .text   : { *(.text*) }
+
+   . = ALIGN(16);

Why?


It's good practice to have at least paragraph (segment boundary) 
alignment between different types of data.  In the case of the .bss, it 
also allows cleaning with rep;movsl.


It's technically not all that necessary (except for 4-byte alignment for 
the .bss), but it makes things easier to debug on the assembly level.



+   /* Adjust this as appropriate */
+   /* This allows 4 pages (16K) */
+   . = ASSERT(_end = 0x4000, Wakeup too big!);

PAGE_SIZE * 4?


Not really, because it's not at all related to the kernel page size; the 
reference to pages there is informal.  If we go to a larger virtual page 
size we do NOT want this to change.


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

   - memcpy((void *)acpi_wakeup_address, wakeup_start,
   -wakeup_end - wakeup_start);
   - acpi_copy_wakeup_routine(acpi_wakeup_address);
   + memcpy((void *)acpi_realmode, wakeup_code_start, 4*PAGE_SIZE);
  
  Using a PAGE_SIZE multiplier here isn't a good thing...
 
 Yes, I'll fix that in one of the next iterations.

Agreed.

   + header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
  
  ... especially not with magic constants like this.
 
 Yeah.  Pavel, what's at 0x3f00, btw?

struct wakeup_header.

I really need the entry point to be at offset 0, so that I can get
pointers to my data. I could not figure out how to do it any other
way. And if 0 is taken, I thought I'd put header at the end.

Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Rafael J. Wysocki
On Friday, 8 of February 2008, Pavel Machek wrote:
 Hi!

Hi,

-   memcpy((void *)acpi_wakeup_address, wakeup_start,
-  wakeup_end - wakeup_start);
-   acpi_copy_wakeup_routine(acpi_wakeup_address);
+   memcpy((void *)acpi_realmode, wakeup_code_start, 4*PAGE_SIZE);
   
   Using a PAGE_SIZE multiplier here isn't a good thing...
  
  Yes, I'll fix that in one of the next iterations.
 
 Agreed.
 
+   header = (struct wakeup_header *)(acpi_realmode + 0x3f00);
   
   ... especially not with magic constants like this.
  
  Yeah.  Pavel, what's at 0x3f00, btw?
 
 struct wakeup_header.
 
 I really need the entry point to be at offset 0, so that I can get
 pointers to my data. I could not figure out how to do it any other
 way. And if 0 is taken, I thought I'd put header at the end.

What does the number 0x3f00 follow from?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

 + header = (struct wakeup_header *)(acpi_realmode + 0x3f00);

... especially not with magic constants like this.
   
   Yeah.  Pavel, what's at 0x3f00, btw?
  
  struct wakeup_header.
  
  I really need the entry point to be at offset 0, so that I can get
  pointers to my data. I could not figure out how to do it any other
  way. And if 0 is taken, I thought I'd put header at the end.
 
 What does the number 0x3f00 follow from?

wakeup.ld:

SECTIONS
{
. = 0x3f00;
.header : { *(.header) }

Ok, if we can use defines, this is probably great candidate for one of
them.
Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Pavel Machek wrote:


I really need the entry point to be at offset 0, so that I can get
pointers to my data. I could not figure out how to do it any other
way. And if 0 is taken, I thought I'd put header at the end.



Why not just put the structure at 0, and put pointers in the structure 
to everything else you need?


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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread Pavel Machek
Hi!

 I really need the entry point to be at offset 0, so 
 that I can get
 pointers to my data. I could not figure out how to do 
 it any other
 way. And if 0 is taken, I thought I'd put header at the 
 end.
 
 
 Why not just put the structure at 0, and put pointers in 
 the structure to everything else you need?

segments:offsets rear its ugly head here. I need %ds to point to my
data, and the way to do it is copy it from %cs; that needs start to be
at 0.

If you can find a solution that does not need this (some
segment/offset arithmetics at beggining of wakeup?) we could use it,
but I was lost between relocations.

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-07 Thread H. Peter Anvin

Pavel Machek wrote:

Hi!

I really need the entry point to be at offset 0, so 
that I can get
pointers to my data. I could not figure out how to do 
it any other
way. And if 0 is taken, I thought I'd put header at the 
end.


Why not just put the structure at 0, and put pointers in 
the structure to everything else you need?


segments:offsets rear its ugly head here. I need %ds to point to my
data, and the way to do it is copy it from %cs; that needs start to be
at 0.

If you can find a solution that does not need this (some
segment/offset arithmetics at beggining of wakeup?) we could use it,
but I was lost between relocations.



Let me look at it in the morning.  Got a specific pointer?

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-06 Thread Rafael J. Wysocki
On Wednesday, 6 of February 2008, Rafael J. Wysocki wrote:
> On Tuesday, 5 of February 2008, Pavel Machek wrote:
> > 
> > This rewrites wakeup code to .c, and it fixes stack (should use movl
> > ,%esp, not movw). Testers wanted. Makefile infrastructure was done by
> > hpa, cleanups by rjw.
> 
> I'll test it tomorrow

Works on my nx6325 (good sign, the box is easy to break ;-)).

> and I still have some more cleanups (I was distracted by a nasty scheduler
> issue in the current mainline).

The cleanups are still in the works (sorry).

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


Re: [rft] s2ram wakeup moves to .c, could fix few machines

2008-02-06 Thread Rafael J. Wysocki
On Tuesday, 5 of February 2008, Pavel Machek wrote:
> 
> This rewrites wakeup code to .c, and it fixes stack (should use movl
> ,%esp, not movw). Testers wanted. Makefile infrastructure was done by
> hpa, cleanups by rjw.
> 
> Signed-off-by: Pavel Machek <[EMAIL PROTECTED]>
> 
[--snip--]
> diff --git a/arch/x86_64/kernel/acpi/wakeup.S 
> b/arch/x86_64/kernel/acpi/wakeup.S
> new file mode 100644
> index 000..d0f40d9
> --- /dev/null
> +++ b/arch/x86_64/kernel/acpi/wakeup.S

Surely this is not intentional?

> @@ -0,0 +1,425 @@
> +.text
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +# Copyright 2003 Pavel Machek <[EMAIL PROTECTED]>, distribute under GPLv2
> +#
> +# wakeup_code runs in real mode, and at unknown address (determined at 
> run-time).
> +# Therefore it must only use relative jumps/calls. 
> +#
> +# Do we need to deal with A20? It is okay: ACPI specs says A20 must be 
> enabled
> +#
> +# If physical address of wakeup_code is 0x12345, BIOS should call us with
> +# cs = 0x1234, eip = 0x05
> +#
> +
> +#define BEEP \
> + inb $97, %al;   \
> + outb%al, $0x80; \
> + movb$3, %al;\
> + outb%al, $97;   \
> + outb%al, $0x80; \
> + movb$-74, %al;  \
> + outb%al, $67;   \
> + outb%al, $0x80; \
> + movb$-119, %al; \
> + outb%al, $66;   \
> + outb%al, $0x80; \
> + movb$15, %al;   \
> + outb%al, $66;
> +
> +
> +ALIGN
> + .align  16
> +ENTRY(wakeup_start)
> +wakeup_code:
> + wakeup_code_start = .
> + .code16
> +
> +# Running in *copy* of this code, somewhere in low 1MB.
> +
> + cli
> + cld
> + # setup data segment
> + movw%cs, %ax
> + movw%ax, %ds# Make ds:0 point to wakeup_start
> + movw%ax, %ss
> +
> + # Data segment must be set up before we can see whether to beep.
> + testl   $4, realmode_flags - wakeup_code
> + jz  1f
> + BEEP
> +1:
> +
> + # Private stack is needed for ASUS board
> + mov $(wakeup_stack - wakeup_code), %sp
> +
> + pushl   $0  # Kill any dangerous flags
> + popfl
> +
> + movlreal_magic - wakeup_code, %eax
> + cmpl$0x12345678, %eax
> + jne bogus_real_magic
> +
> + testl   $1, realmode_flags - wakeup_code
> + jz  1f
> + lcall   $0xc000,$3
> + movw%cs, %ax
> + movw%ax, %ds# Bios might have played with that
> + movw%ax, %ss
> +1:
> +
> + testl   $2, realmode_flags - wakeup_code
> + jz  1f
> + mov video_mode - wakeup_code, %ax
> + callmode_set
> +1:
> +
> + mov %ds, %ax# Find 32bit wakeup_code addr
> + movzx   %ax, %esi   # (Convert %ds:gdt to a liner 
> ptr)
> + shll$4, %esi
> + # Fix up the vectors
> + addl%esi, wakeup_32_vector - wakeup_code
> + addl%esi, wakeup_long64_vector - wakeup_code
> + addl%esi, gdt_48a + 2 - wakeup_code # Fixup the gdt pointer
> +
> + lidtl   %ds:idt_48a - wakeup_code
> + lgdtl   %ds:gdt_48a - wakeup_code   # load gdt with whatever is
> + # appropriate
> +
> + movl$1, %eax# protected mode (PE) bit
> + lmsw%ax # This is it!
> + jmp 1f
> +1:
> +
> + ljmpl   *(wakeup_32_vector - wakeup_code)
> +
> + .balign 4
> +wakeup_32_vector:
> + .long   wakeup_32 - wakeup_code
> + .word   __KERNEL32_CS, 0
> +
> + .code32
> +wakeup_32:
> +# Running in this code, but at low address; paging is not yet turned on.
> +
> + movl$__KERNEL_DS, %eax
> + movl%eax, %ds
> +
> + /*
> +  * Prepare for entering 64bits mode
> +  */
> +
> + /* Enable PAE */
> + xorl%eax, %eax
> + btsl$5, %eax
> + movl%eax, %cr4
> +
> + /* Setup early boot stage 4 level pagetables */
> + leal(wakeup_level4_pgt - wakeup_code)(%esi), %eax
> + movl%eax, %cr3
> +
> +/* Check if nx is implemented */
> +movl$0x8001, %eax
> +cpuid
> +movl%edx,%edi
> +
> + /* Enable Long Mode */
> + xorl%eax, %eax
> + btsl$_EFER_LME, %eax
> +
> + /* No Execute supported? */
> + btl $20,%edi
> + jnc 1f
> + btsl$_EFER_NX, %eax
> + 
> + /* Make changes effective */
> +1:   movl$MSR_EFER, %ecx
> + xorl%edx, %edx
> + wrmsr
> +
> + xorl%eax, %eax
> + btsl$31, %eax   /* Enable paging and in turn 
> activate Long Mode */
> + btsl$0, %eax/* Enable protected mode */
> +
> + /* Make changes effective */
> + movl%eax, %cr0
> +
> + /* At this 

  1   2   >