Expand PMF_FN_* macros.
[netbsd-mini2440.git] / sys / arch / i386 / pnpbios / pnpbioscall.S
blob44391c5681120bbf59f8c490a9c9e2e2d5115c1c
1 /* $NetBSD: pnpbioscall.S,v 1.1 2002/11/22 15:02:12 fvdl Exp $ */
2 /*
3  * Copyright (c) 1999
4  *      Matthias Drochner.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions, and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
28 #include <machine/asm.h>
29 __KERNEL_RCSID(0, "$NetBSD$");
31 #include "assym.h"
32 #include <machine/segments.h>
34         .data
35 saveesp:
36         .space  4
38 NENTRY(pnpbioscall)
39         pushl   %ebp
40         movl    %esp, %ebp
41         /*
42          * disable interrupts - our handlers can't deal with frames of the
43          * segment we are calling, and the BIOS can't use our IDT anyway
44          */
45         pushfl
46         cli
48         /* call pnpbiostramp() */
49         lcall   $GSEL(GPNPBIOSTRAMP_SEL, SEL_KPL), $0
51         popfl
52         popl    %ebp
53         ret
55 NENTRY(pnpbiostramp)
56         pushl   %ebx
58         /* save current stack pointer */
59         movl    %esp, %eax
60         movl    %eax, saveesp
62         /* switch to new stack */
63         movl    8(%ebp), %esp /* call argument */
64         movl    $GSEL(GPNPBIOSSCRATCH_SEL, SEL_KPL), %eax
65         mov     %ax, %ss
67         /* fake the call return address (16-bit frame) */
68         mov     %cs, %ax
69         push    %ax
70         movl    $(1f - _C_LABEL(pnpbiostramp)), %eax
71         push    %ax
73         /* do a long jump */
74         pushl   $GSEL(GPNPBIOSCODE_SEL, SEL_KPL)
75         pushl   (_C_LABEL(pnpbios_entry))
76 #if 1
77         /* paranoia: don't pass our ds */
78         movl    $GSEL(GPNPBIOSSCRATCH_SEL, SEL_KPL), %eax
79         mov     %ax, %ds
80 #endif
81         lret
83 1:      /* returned from BIOS call */
84         movl    $GSEL(GDATA_SEL, SEL_KPL), %ebx
85 #if 1
86         mov     %bx, %ds
87 #endif
88         /* back to old stack */
89         mov     %bx, %ss
90         movl    saveesp, %ebx
91         movl    %ebx, %esp
93         popl    %ebx
94         lret
95         .globl _C_LABEL(epnpbiostramp)
96 _C_LABEL(epnpbiostramp):