kvm tools: Add ivshmem device
[linux-2.6/next.git] / tools / kvm / bios / entry.S
blob2ee21a9116d612b843ab8e5a2941fc19604c2e5f
1 /*
2  * Our pretty trivial BIOS emulation
3  */
5 #include <kvm/bios.h>
6 #include <kvm/assembly.h>
8         .org 0
9         .code16gcc
11 #define EFLAGS_CF       (1 << 0)
13 #include "macro.S"
15 /* If you change these macros, remember to update 'struct biosregs' */
16 .macro SAVE_BIOSREGS
17         pushl   %fs
18         pushl   %es
19         pushl   %edi
20         pushl   %esi
21         pushl   %ebp
22         pushl   %esp
23         pushl   %edx
24         pushl   %ecx
25         pushl   %ebx
26         pushl   %eax
27 .endm
29 .macro RESTORE_BIOSREGS
30         popl    %eax
31         popl    %ebx
32         popl    %ecx
33         popl    %edx
34         popl    %esp
35         popl    %ebp
36         popl    %esi
37         popl    %edi
38         popl    %es
39         popl    %fs
40 .endm
43  * fake interrupt handler, nothing can be faster ever
44  */
45 ENTRY(bios_intfake)
46         /*
47          * Set CF to indicate failure. We don't want callers to think that the
48          * interrupt handler succeeded and then treat the return values in
49          * registers as valid data.
50          */
51         orl     $EFLAGS_CF, 0x4(%esp)
53         IRET
54 ENTRY_END(bios_intfake)
57  * int 10 - video - service
58  */
59 ENTRY(bios_int10)
60         SAVE_BIOSREGS
62         movl            %esp, %eax
63         /* this is way easier than doing it in assembly */
64         /* just push all the regs and jump to a C handler */
65         call    int10_handler
67         RESTORE_BIOSREGS
69         /* Clear CF to indicate success.  */
70         andl    $~EFLAGS_CF, 0x4(%esp)
72         IRET
73 ENTRY_END(bios_int10)
75 ENTRY(bios_int15)
76         SAVE_BIOSREGS
78         movl    %esp, %eax
79         call    int15_handler
81         RESTORE_BIOSREGS
83         IRET
84 ENTRY_END(bios_int15)
86 GLOBAL(__locals)
88 #include "local.S"
90 END(__locals)