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