These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / arch / i386 / prefix / hdprefix.S
1 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
2
3         .text
4         .arch i386
5         .section ".prefix", "awx", @progbits
6         .code16
7         .org 0
8         .globl  _hd_start
9 _hd_start:
10
11         movw    $load_image, %bp
12         jmp     find_active_partition
13
14 #include "bootpart.S"
15
16 load_image:
17         /* Get disk geometry */
18         pushal
19         pushw   %es
20         movb    $0x08, %ah
21         int     $0x13
22         jc      load_failed
23         movb    %cl, max_sector
24         movb    %dh, max_head
25         popw    %es
26         popal
27         
28 1:      /* Read to end of current track */
29         movb    %cl, %al
30         negb    %al
31         addb    max_sector, %al
32         incb    %al
33         andb    $0x3f, %al
34         movzbl  %al, %eax
35         call    *read_sectors
36         jc      load_failed
37         
38         /* Update %es */
39         movw    %es, %bx
40         shll    $5, %eax
41         addw    %ax, %bx
42         movw    %bx, %es
43         shrl    $5, %eax
44         
45         /* Update LBA address */
46         addl    %eax, %edi
47         adcl    $0, %esi
48         
49         /* Update CHS address */
50         andb    $0xc0, %cl
51         orb     $0x01, %cl
52         incb    %dh
53         cmpb    max_head, %dh
54         jbe     2f
55         xorb    %dh, %dh
56         incb    %ch
57         jnc     2f
58         addb    $0xc0, %cl
59 2:
60         /* Loop until whole image is read */
61         subl    %eax, load_length
62         ja      1b
63         ljmp    $BOOT_SEG, $start_image
64
65 max_sector:
66         .byte   0
67 max_head:
68         .byte   0
69 load_length:
70         .long   0
71         
72         .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
73         .ascii  "ADDL"
74         .long   load_length
75         .long   512
76         .long   0
77         .previous
78
79
80 load_failed:
81         movw    $10f, %si
82         jmp     boot_error
83 10:     .asciz  "Could not load iPXE\r\n"
84
85         .org 510
86         .byte 0x55, 0xaa
87
88 start_image:
89         /* Install iPXE */
90         call    install
91
92         /* Set up real-mode stack */
93         movw    %bx, %ss
94         movw    $_estack16, %sp
95
96         /* Jump to .text16 segment */
97         pushw   %ax
98         pushw   $1f
99         lret
100         .section ".text16", "awx", @progbits
101 1:
102         pushl   $main
103         pushw   %cs
104         call    prot_call
105         popl    %ecx /* discard */
106
107         /* Uninstall iPXE */
108         call    uninstall
109
110         /* Boot next device */
111         int $0x18