root/arch/i386/i386/apmcall.S

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. apmcall

    1 /*      $OpenBSD: apmcall.S,v 1.5 2003/06/03 20:10:31 mickey Exp $      */
    2 
    3 /*
    4  * Copyright (c) 2000,2001 Michael Shalayeff
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   19  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
   20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   22  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   24  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
   25  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
   26  * THE POSSIBILITY OF SUCH DAMAGE.
   27  */
   28 
   29 #include <machine/asm.h>
   30 
   31 #ifndef APM_DISABLE_INTERRUPTS
   32 #define APM_DISABLE_INTERRUPTS  1
   33 #endif /* APM_DISABLE_INTERRUPTS */
   34 
   35         .data
   36         .globl  _C_LABEL(apm_ep)
   37         .globl  _C_LABEL(apm_cli)
   38 _C_LABEL(apm_cli):
   39         .long   APM_DISABLE_INTERRUPTS
   40 /*
   41  * int apmcall(u_int f, int dev, struct apmregs *r)
   42  *
   43  */
   44         .text
   45 ENTRY(apmcall)
   46         pushl   %ebp
   47         movl    %esp, %ebp
   48         pushl   %ebx
   49         pushl   %esi
   50         pushl   %edi
   51 
   52         movl    16(%ebp), %ebx
   53         movl    8(%ebx), %ecx
   54         movl    12(%ebx), %edx
   55         movl    12(%ebp), %ebx
   56 
   57         pushfl
   58 
   59         cmp     $0, _C_LABEL(apm_cli)
   60         je      1f
   61         cli
   62 1:
   63 #if defined(DEBUG) || defined(DIAGNOSTIC)
   64         pushl   %ds
   65         pushl   %es
   66         pushl   %fs
   67         pushl   %gs
   68         xorl    %eax, %eax
   69         movl    %eax, %ds
   70         movl    %eax, %es
   71         movl    %eax, %fs
   72         movl    %eax, %gs
   73 #endif
   74         movl    8(%ebp), %eax
   75 
   76         clc
   77         lcall   %cs:*(_C_LABEL(apm_ep))
   78         pushl   %eax
   79         setc    %al
   80         movzbl  %al, %esi
   81         popl    %eax
   82 
   83 #if defined(DEBUG) || defined(DIAGNOSTIC)
   84         popl    %gs
   85         popl    %fs
   86         popl    %es
   87         popl    %ds
   88 #endif
   89         popfl
   90 
   91         movl    16(%ebp), %edi
   92         movl    %eax, 0(%edi)
   93         movl    %ebx, 4(%edi)
   94         movl    %ecx, 8(%edi)
   95         movl    %edx, 12(%edi)
   96 
   97         testl   $0xff00, %eax
   98         jnz     1f
   99         xorl    %esi, %esi
  100 1:
  101         movl    %esi, %eax
  102 
  103         popl    %edi
  104         popl    %esi
  105         popl    %ebx
  106         popl    %ebp
  107         ret
  108 
  109         .end

/* [<][>][^][v][top][bottom][index][help] */