blob: 5521ea12f44e068281ef99c309a5f6ebf736ff71 [file] [log] [blame]
Thomas Gleixnerd6910052019-05-22 09:51:29 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
H. Peter Anvin7a734e72009-04-01 18:08:28 -07002/* -----------------------------------------------------------------------
3 *
H. Peter Anvin6f341522014-01-04 14:29:08 -08004 * Copyright 2009-2014 Intel Corporation; author H. Peter Anvin
H. Peter Anvin7a734e72009-04-01 18:08:28 -07005 *
H. Peter Anvin7a734e72009-04-01 18:08:28 -07006 * ----------------------------------------------------------------------- */
7
8/*
9 * "Glove box" for BIOS calls. Avoids the constant problems with BIOSes
H. Peter Anvincf9972a92009-04-11 22:24:05 -070010 * touching registers they shouldn't be.
H. Peter Anvin7a734e72009-04-01 18:08:28 -070011 */
12
David Woodhousee24df922014-01-03 22:30:42 +000013 .code16
H. Peter Anvin6f341522014-01-04 14:29:08 -080014 .section ".inittext","ax"
H. Peter Anvin7a734e72009-04-01 18:08:28 -070015 .globl intcall
16 .type intcall, @function
17intcall:
18 /* Self-modify the INT instruction. Ugly, but works. */
19 cmpb %al, 3f
20 je 1f
21 movb %al, 3f
22 jmp 1f /* Synchronize pipeline */
231:
24 /* Save state */
25 pushfl
26 pushw %fs
27 pushw %gs
28 pushal
29
30 /* Copy input state to stack frame */
31 subw $44, %sp
32 movw %dx, %si
33 movw %sp, %di
34 movw $11, %cx
35 rep; movsd
36
37 /* Pop full state from the stack */
38 popal
39 popw %gs
40 popw %fs
41 popw %es
42 popw %ds
43 popfl
44
45 /* Actual INT */
46 .byte 0xcd /* INT opcode */
473: .byte 0
48
49 /* Push full state to the stack */
50 pushfl
51 pushw %ds
52 pushw %es
53 pushw %fs
54 pushw %gs
55 pushal
56
57 /* Re-establish C environment invariants */
58 cld
59 movzwl %sp, %esp
60 movw %cs, %ax
61 movw %ax, %ds
62 movw %ax, %es
63
64 /* Copy output state from stack frame */
65 movw 68(%esp), %di /* Original %cx == 3rd argument */
66 andw %di, %di
67 jz 4f
68 movw %sp, %si
69 movw $11, %cx
70 rep; movsd
714: addw $44, %sp
72
73 /* Restore state and return */
74 popal
75 popw %gs
76 popw %fs
77 popfl
78 retl
79 .size intcall, .-intcall