68392d2c3cc434f1607d29ebb993661327830939
[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         movw    $_rom_size, %bp
14 1:      /* Truncate read length to end of track */
15         movzwl  %bp, %eax
16                         movw    $1, %ax
17         /* Read sectors */
18         call    *read_sectors
19         jc      load_failed
20         /* Update %es */
21         movw    %es, %bx
22         shll    $5, %eax
23         addw    %ax, %bx
24         movw    %bx, %es
25         shrl    $5, %eax
26         /* Update LBA address */
27         addl    %eax, %edi
28         adcl    $0, %esi
29         /* Update CHS address */
30                         // hmmmm
31         /* Loop until whole image is read */
32         subw    %ax, %bp
33         jne     1b
34         ljmp    $BOOT_SEG, $start_image
35
36 load_failed:
37         movw    $10f, %si
38         jmp     boot_error
39 10:     .asciz  "Could not load gPXE\r\n"
40
41         .org 510
42         .byte 0x55, 0xaa
43
44 start_image:
45         call    install
46
47         /* Set up real-mode stack */
48         movw    %bx, %ss
49         movw    $_estack16, %sp
50
51         /* Jump to .text16 segment */
52         pushw   %ax
53         pushw   $1f
54         lret
55         .section ".text16", "awx", @progbits
56 1:
57         pushl   $main
58         pushw   %cs
59         call    prot_call
60         popl    %eax /* discard */
61
62         /* Boot next device */
63         int $0x18