~jonathank89/burg/burg-percise

« back to all changes in this revision

Viewing changes to kern/i386/pc/startup.S

  • Committer: bean
  • Date: 2008-08-05 15:15:59 UTC
  • Revision ID: bean@localhost-20080805151559-qph5d40irmv84jom
2008-08-05  Bean  <bean123ch@gmail.com>

        * boot/i386/pc/pxeboot.S (_start): Use drive number 0x7F for pxe.

        * conf/i386-pc.rmk (kernel_img_HEADERS): Add machine/pxe.h.
        (pkglib_MODULES): Add pxe.mod and pxecmd.mod.
        (pxe_mod_SOURCES): New macro.
        (pxe_mod_CFLAGS): Likewise.
        (pxe_mod_LDFLAGS): Likewise.
        (pxecmd_mod_SOURCES): Likewise.
        (pxecmd_mod_CFLAGS): Likewise.
        (pxecmd_mod_LDFLAGS): Likewise.

        * kern/i386/pc/startup.S (grub_pxe_scan): New function.
        (grub_pxe_call): Likewise.

        * include/grub/disk.h (grub_disk_dev_id): Add GRUB_DISK_DEVICE_PXE_ID.

        * commands/i386/pc/pxecmd.c: New file.

        * disk/i386/pc/pxe.c: Likewise.

        * include/grub/i386/pc/pxe.h: Likewise.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2054
2054
        popl    %ebx
2055
2055
        popl    %ebp
2056
2056
        ret
 
2057
 
 
2058
 
 
2059
pxe_rm_entry:
 
2060
        .long   0
 
2061
 
 
2062
/*
 
2063
 * struct grub_pxenv *grub_pxe_scan (void);
 
2064
 */
 
2065
FUNCTION(grub_pxe_scan)
 
2066
        pushl   %ebp
 
2067
        pushl   %ebx
 
2068
 
 
2069
        xorl    %ebx, %ebx
 
2070
        xorl    %ecx, %ecx
 
2071
 
 
2072
        call    prot_to_real
 
2073
        .code16
 
2074
 
 
2075
        pushw   %es
 
2076
 
 
2077
        movw    $0x5650, %ax
 
2078
        int     $0x1A
 
2079
        cmpw    $0x564E, %ax
 
2080
        jnz     1f
 
2081
        cmpl    $0x4E455850, %es:(%bx)          /* PXEN(V+)  */
 
2082
        jnz     1f
 
2083
        cmpw    $0x201, %es:6(%bx)              /* API version  */
 
2084
        jb      1f
 
2085
        lesw    %es:0x28(%bx), %bx              /* !PXE structure  */
 
2086
        cmpl    $0x45585021, %es:(%bx)          /* !PXE  */
 
2087
        jnz     1f
 
2088
        movw    %es, %cx
 
2089
        jmp     2f
 
2090
1:
 
2091
        xorw    %bx, %bx
 
2092
        xorw    %cx, %cx
 
2093
2:
 
2094
 
 
2095
        popw    %es
 
2096
 
 
2097
        DATA32 call     real_to_prot
 
2098
        .code32
 
2099
 
 
2100
        xorl    %eax, %eax
 
2101
        leal    (%eax, %ecx, 4), %ecx
 
2102
        leal    (%ebx, %ecx, 4), %eax           /* eax = ecx * 16 + ebx  */
 
2103
 
 
2104
        orl     %eax, %eax
 
2105
        jz      1f
 
2106
 
 
2107
        movl    0x10(%eax), %ecx
 
2108
        movl    %ecx, pxe_rm_entry
 
2109
 
 
2110
1:
 
2111
 
 
2112
        popl    %ebx
 
2113
        popl    %ebp
 
2114
        ret
 
2115
 
 
2116
/*
 
2117
 * int grub_pxe_call (int func, void* data);
 
2118
 */
 
2119
FUNCTION(grub_pxe_call)
 
2120
        pushl   %ebp
 
2121
        movl    %esp, %ebp
 
2122
        pushl   %esi
 
2123
        pushl   %edi
 
2124
        pushl   %ebx
 
2125
 
 
2126
        movl    %eax, %ecx
 
2127
        movl    %edx, %eax
 
2128
        andl    $0xF, %eax
 
2129
        shrl    $4, %edx
 
2130
        shll    $16, %edx
 
2131
        addl    %eax, %edx
 
2132
        movl    pxe_rm_entry, %ebx
 
2133
 
 
2134
        call    prot_to_real
 
2135
        .code16
 
2136
 
 
2137
        pushl   %ebx
 
2138
        pushl   %edx
 
2139
        pushw   %cx
 
2140
        movw    %sp, %bx
 
2141
        lcall   *%ss:6(%bx)
 
2142
        cld
 
2143
        addw    $10, %sp
 
2144
        movw    %ax, %cx
 
2145
 
 
2146
        DATA32  call    real_to_prot
 
2147
        .code32
 
2148
 
 
2149
        movzwl  %cx, %eax
 
2150
 
 
2151
        popl    %ebx
 
2152
        popl    %edi
 
2153
        popl    %esi
 
2154
        popl    %ebp
 
2155
        ret