On Tuesday, 22 of January 2008, Pavel Machek wrote:
> 
> It seems to compile 32/64bit, and work 32bit...

It also works on a 64-bit system.

Thanks,
Rafael


> --- 
> 
> Factor out common real-mode part of wakeup_{32,64}.S.
> 
> Signed-off-by: Pavel Machek <[EMAIL PROTECTED]>
> 
> ---
> commit 2fac1886274433c64e76611e6b1ba2318c5914a4
> tree 2d6bdc7c2eda9845b57e1d7128b187df1b1fd2c9
> parent 7a9546efcc4d90040a52c003eb9a303200c41f86
> author Pavel <[EMAIL PROTECTED]> Tue, 22 Jan 2008 20:34:03 +0100
> committer Pavel <[EMAIL PROTECTED]> Tue, 22 Jan 2008 20:34:03 +0100
> 
>  arch/x86/kernel/acpi/wakeup.S    |  111 ++++++++++++++++++++++++++++++++++
>  arch/x86/kernel/acpi/wakeup_32.S |  118 +-----------------------------------
>  arch/x86/kernel/acpi/wakeup_64.S |  125 
> +-------------------------------------
>  3 files changed, 116 insertions(+), 238 deletions(-)
> 
> diff --git a/arch/x86/kernel/acpi/wakeup.S b/arch/x86/kernel/acpi/wakeup.S
> new file mode 100644
> index 0000000..38205c8
> --- /dev/null
> +++ b/arch/x86/kernel/acpi/wakeup.S
> @@ -0,0 +1,111 @@
> +# Copyright 2003, 2008 Pavel Machek <[EMAIL PROTECTED]>, distribute under 
> GPLv2
> +
> +#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  4096
> +ENTRY(wakeup_start)
> +wakeup_code:
> +     wakeup_code_start = .
> +     .code16
> +
> +     cli
> +     cld
> +
> +     # setup data segment
> +     movw    %cs, %ax
> +     movw    %ax, %ds                                        # Make ds:0 
> point to wakeup_start
> +     movw    %ax, %ss
> +
> +     testl   $4, realmode_flags - wakeup_code
> +     jz      1f
> +     BEEP
> +1:
> +     mov     $(wakeup_stack - wakeup_code), %sp              # Private stack 
> is needed for ASUS board
> +
> +     pushl   $0                                              # Kill any 
> dangerous flags
> +     popfl
> +
> +
> +     movl    real_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      mode_done
> +     mov     video_mode - wakeup_code, %ax
> +     call    mode_set
> +     jmp     mode_done
> +
> +/* This code uses an extended set of video mode numbers. These include:
> + * Aliases for standard modes
> + *   NORMAL_VGA (-1)
> + *   EXTENDED_VGA (-2)
> + *   ASK_VGA (-3)
> + * Video modes numbered by menu position -- NOT RECOMMENDED because of lack
> + * of compatibility when extending the table. These are between 0x00 and 
> 0xff.
> + */
> +#define VIDEO_FIRST_MENU 0x0000
> +
> +/* Standard BIOS video modes (BIOS number + 0x0100) */
> +#define VIDEO_FIRST_BIOS 0x0100
> +
> +/* VESA BIOS video modes (VESA number + 0x0200) */
> +#define VIDEO_FIRST_VESA 0x0200
> +
> +/* Video7 special modes (BIOS number + 0x0900) */
> +#define VIDEO_FIRST_V7 0x0900
> +
> +# Setting of user mode (AX=mode ID) => CF=success
> +
> +# For now, we only handle VESA modes (0x0200..0x03ff).  To handle other
> +# modes, we should probably compile in the video code from the boot
> +# directory.
> +.code16
> +mode_set:
> +     movw    %ax, %bx
> +     subb    $VIDEO_FIRST_VESA>>8, %bh
> +     cmpb    $2, %bh
> +     jb      check_vesa
> +
> +setbad:
> +     clc
> +     ret
> +
> +check_vesa:
> +     orw     $0x4000, %bx                    # Use linear frame buffer
> +     movw    $0x4f02, %ax                    # VESA BIOS mode set call
> +     int     $0x10
> +     cmpw    $0x004f, %ax                    # AL=4f if implemented
> +     jnz     setbad                          # AH=0 if OK
> +
> +     stc
> +     ret
> +     
> +bogus_real_magic:
> +     jmp bogus_real_magic
> +
> +real_magic:  .quad 0
> +video_mode:  .quad 0
> +realmode_flags:      .quad 0
> diff --git a/arch/x86/kernel/acpi/wakeup_32.S 
> b/arch/x86/kernel/acpi/wakeup_32.S
> index 1e931aa..9b26909 100644
> --- a/arch/x86/kernel/acpi/wakeup_32.S
> +++ b/arch/x86/kernel/acpi/wakeup_32.S
> @@ -3,73 +3,11 @@ #include <linux/linkage.h>
>  #include <asm/segment.h>
>  #include <asm/page.h>
>  
> -#
> -# 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  4096
> -ENTRY(wakeup_start)
> -wakeup_code:
> -     wakeup_code_start = .
> -     .code16
> -
> -     cli
> -     cld
> -
> -     # setup data segment
> -     movw    %cs, %ax
> -     movw    %ax, %ds                                        # Make ds:0 
> point to wakeup_start
> -     movw    %ax, %ss
> -
> -     testl   $4, realmode_flags - wakeup_code
> -     jz      1f
> -     BEEP
> -1:
> -     mov     $(wakeup_stack - wakeup_code), %sp              # Private stack 
> is needed for ASUS board
> +# Copyright 2003, 2008 Pavel Machek <[EMAIL PROTECTED]>, distribute under 
> GPLv2
>  
> -     pushl   $0                                              # Kill any 
> dangerous flags
> -     popfl
> -
> -     movl    real_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
> -     call    mode_set
> -1:
> +#include "wakeup.S"
>  
> +mode_done:
>       # set up page table
>       movl    $swsusp_pg_dir-__PAGE_OFFSET, %eax
>       movl    %eax, %cr3
> @@ -109,60 +47,10 @@ real_save_gdt:   .word 0
>  real_save_cr0:       .long 0
>  real_save_cr3:       .long 0
>  real_save_cr4:       .long 0
> -real_magic:  .long 0
> -video_mode:  .long 0
> -realmode_flags:      .long 0
>  real_efer_save_restore:      .long 0
>  real_save_efer_edx:  .long 0
>  real_save_efer_eax:  .long 0
>  
> -bogus_real_magic:
> -     jmp bogus_real_magic
> -
> -/* This code uses an extended set of video mode numbers. These include:
> - * Aliases for standard modes
> - *   NORMAL_VGA (-1)
> - *   EXTENDED_VGA (-2)
> - *   ASK_VGA (-3)
> - * Video modes numbered by menu position -- NOT RECOMMENDED because of lack
> - * of compatibility when extending the table. These are between 0x00 and 
> 0xff.
> - */
> -#define VIDEO_FIRST_MENU 0x0000
> -
> -/* Standard BIOS video modes (BIOS number + 0x0100) */
> -#define VIDEO_FIRST_BIOS 0x0100
> -
> -/* VESA BIOS video modes (VESA number + 0x0200) */
> -#define VIDEO_FIRST_VESA 0x0200
> -
> -/* Video7 special modes (BIOS number + 0x0900) */
> -#define VIDEO_FIRST_V7 0x0900
> -
> -# Setting of user mode (AX=mode ID) => CF=success
> -
> -# For now, we only handle VESA modes (0x0200..0x03ff).  To handle other
> -# modes, we should probably compile in the video code from the boot
> -# directory.
> -mode_set:
> -     movw    %ax, %bx
> -     subb    $VIDEO_FIRST_VESA>>8, %bh
> -     cmpb    $2, %bh
> -     jb      check_vesa
> -
> -setbad:
> -     clc
> -     ret
> -
> -check_vesa:
> -     orw     $0x4000, %bx                    # Use linear frame buffer
> -     movw    $0x4f02, %ax                    # VESA BIOS mode set call
> -     int     $0x10
> -     cmpw    $0x004f, %ax                    # AL=4f if implemented
> -     jnz     setbad                          # AH=0 if OK
> -
> -     stc
> -     ret
> -
>       .code32
>       ALIGN
>  
> diff --git a/arch/x86/kernel/acpi/wakeup_64.S 
> b/arch/x86/kernel/acpi/wakeup_64.S
> index 5ed3bc5..b02d97f 100644
> --- a/arch/x86/kernel/acpi/wakeup_64.S
> +++ b/arch/x86/kernel/acpi/wakeup_64.S
> @@ -7,78 +7,10 @@ #include <asm/msr.h>
>  #include <asm/asm-offsets.h>
>  
>  # 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
>  
> -     movl    real_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
> -     call    mode_set
> -1:
> +#include "wakeup.S"
>  
> +mode_done:
>       mov     %ds, %ax                        # Find 32bit wakeup_code addr
>       movzx   %ax, %esi                       # (Convert %ds:gdt to a liner 
> ptr)
>       shll    $4, %esi
> @@ -227,64 +159,11 @@ gdt_48a:
>       .word   0x800                           # gdt limit=2048,
>                                               #  256 GDT entries
>       .long   gdta - wakeup_code              # gdt base (relocated in later)
> -     
> -real_magic:  .quad 0
> -video_mode:  .quad 0
> -realmode_flags:      .quad 0
> -
> -.code16
> -bogus_real_magic:
> -     jmp bogus_real_magic
>  
>  .code64
>  bogus_64_magic:
>       jmp bogus_64_magic
>  
> -/* This code uses an extended set of video mode numbers. These include:
> - * Aliases for standard modes
> - *   NORMAL_VGA (-1)
> - *   EXTENDED_VGA (-2)
> - *   ASK_VGA (-3)
> - * Video modes numbered by menu position -- NOT RECOMMENDED because of lack
> - * of compatibility when extending the table. These are between 0x00 and 
> 0xff.
> - */
> -#define VIDEO_FIRST_MENU 0x0000
> -
> -/* Standard BIOS video modes (BIOS number + 0x0100) */
> -#define VIDEO_FIRST_BIOS 0x0100
> -
> -/* VESA BIOS video modes (VESA number + 0x0200) */
> -#define VIDEO_FIRST_VESA 0x0200
> -
> -/* Video7 special modes (BIOS number + 0x0900) */
> -#define VIDEO_FIRST_V7 0x0900
> -
> -# Setting of user mode (AX=mode ID) => CF=success
> -
> -# For now, we only handle VESA modes (0x0200..0x03ff).  To handle other
> -# modes, we should probably compile in the video code from the boot
> -# directory.
> -.code16
> -mode_set:
> -     movw    %ax, %bx
> -     subb    $VIDEO_FIRST_VESA>>8, %bh
> -     cmpb    $2, %bh
> -     jb      check_vesa
> -
> -setbad:
> -     clc
> -     ret
> -
> -check_vesa:
> -     orw     $0x4000, %bx                    # Use linear frame buffer
> -     movw    $0x4f02, %ax                    # VESA BIOS mode set call
> -     int     $0x10
> -     cmpw    $0x004f, %ax                    # AL=4f if implemented
> -     jnz     setbad                          # AH=0 if OK
> -
> -     stc
> -     ret
> -
>  wakeup_stack_begin:  # Stack grows down
>  
>  .org 0xff0
> 



-- 
"Premature optimization is the root of all evil." - Donald Knuth
--
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/

Reply via email to