wok-next rev 15368
Up ipxe (1.0.0-20130925)
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Mon Oct 14 13:38:36 2013 +0000 (2013-10-14) |
parents | 8267887ae7af |
children | 4ae7c7dde4e2 |
files | ipxe/receipt ipxe/stuff/ipxe.cmd ipxe/stuff/lkrnprefix.S |
line diff
1.1 --- a/ipxe/receipt Sat Oct 12 12:04:33 2013 +0000 1.2 +++ b/ipxe/receipt Mon Oct 14 13:38:36 2013 +0000 1.3 @@ -1,8 +1,8 @@ 1.4 # SliTaz package receipt. 1.5 1.6 PACKAGE="ipxe" 1.7 -VERSION="1.0.0-20121001" 1.8 -GIT_TAG="d23db2848813a9d872e1d71272e7f41df7d0d01c" 1.9 +VERSION="1.0.0-20130925" 1.10 +GIT_TAG="7405685df2bea9a457970d8b5a63ede08fcda6f7" 1.11 CATEGORY="system-tools" 1.12 SHORT_DESC="Open source network boot firmware." 1.13 MAINTAINER="pascal.bellard@slitaz.org" 1.14 @@ -18,6 +18,7 @@ 1.15 compile_rules() 1.16 { 1.17 cd $src/src 1.18 + cp $stuff/lkrnprefix.S arch/i386/prefix 1.19 make bin/undionly.kpxe bin/ipxe.lkrn 1.20 } 1.21 1.22 @@ -26,41 +27,12 @@ 1.23 { 1.24 mkdir $fs/boot 1.25 cp -a $src/src/bin/ipxe.lkrn $fs/boot/ipxe 1.26 - cat > $fs/boot/ipxe.cmd <<EOT 1.27 -#!ipxe 1.28 - 1.29 -dhcp 1.30 - 1.31 -:menu 1.32 -menu SliTaz net boot menu 1.33 -item lan Your PXE boot 1.34 -item web SliTaz WEB boot 1.35 -item rolling SliTaz development version 1.36 -item config iPXE configuration 1.37 -item exit iPXE command line 1.38 -choose --default web --timeout 3000 target && goto ${target} 1.39 - 1.40 -:exit 1.41 -help 1.42 -shell 1.43 -goto menu 1.44 - 1.45 -:web 1.46 -chain http://mirror.slitaz.org/pxe/pxelinux.0 1.47 -chain http://mirror.switch.ch/ftp/mirror/pxe/pxelinux.0 1.48 -chain http://download.tuxfamily.org/slitaz/pxe/pxelinux.0 1.49 -goto menu 1.50 - 1.51 -:lan 1.52 -autoboot 1.53 -goto menu 1.54 - 1.55 -:rolling 1.56 -sanboot http://mirror.slitaz.org/iso/rolling/slitaz-rolling.iso 1.57 -goto menu 1.58 - 1.59 -:config 1.60 -config 1.61 -goto menu 1.62 + OFS=$((0x28B)) 1.63 + dd if=$stuff/ipxe.cmd bs=1 of=$fs/boot/ipxe conv=notrunc \ 1.64 + seek=$OFS count=$((0xA00-$OFS)) 1.65 + OFS=$((0x151)) 1.66 + unix2dos <<EOT | dd bs=1 of=$fs/boot/ipxe conv=notrunc \ 1.67 + seek=$OFS count=$((0x1F0-$OFS)) 1.68 +$SHORT_DESC 1.69 EOT 1.70 }
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/ipxe/stuff/ipxe.cmd Mon Oct 14 13:38:36 2013 +0000 2.3 @@ -0,0 +1,43 @@ 2.4 +#!ipxe 2.5 + 2.6 +set menu-timeout 3000 2.7 +dhcp 2.8 + 2.9 +:menu 2.10 +menu SliTaz net boot menu 2.11 +item --key l lan Your PXE boot 2.12 +item --key w web SliTaz WEB boot 2.13 +item --key r rolling SliTaz development version 2.14 +item --key c config iPXE configuration 2.15 +item --key e exit iPXE command line 2.16 +choose --timeout ${menu-timeout} --default web target || goto exit 2.17 +set menu-timeout 0 2.18 +goto ${target} 2.19 + 2.20 +:exit 2.21 +help 2.22 +echo Type 'exit' to get the back to the menu 2.23 +shell 2.24 +goto menu 2.25 + 2.26 +:web 2.27 +imgfree 2.28 +set weburl http://mirror.slitaz.org/pxe/ 2.29 +set 210:string ${weburl} && chain ${weburl}pxelinux.0 && boot || 2.30 +set weburl http://mirror.switch.ch/ftp/mirror/slitaz/pxe/ 2.31 +set 210:string ${weburl} && chain ${weburl}pxelinux.0 && boot || 2.32 +set weburl http://download.tuxfamily.org/slitaz/pxe/ 2.33 +set 210:string ${weburl} && chain ${weburl}pxelinux.0 && boot || 2.34 +goto menu 2.35 + 2.36 +:lan 2.37 +autoboot || 2.38 +goto menu 2.39 + 2.40 +:rolling 2.41 +sanboot http://mirror.slitaz.org/iso/rolling/slitaz-rolling.iso || 2.42 +goto menu 2.43 + 2.44 +:config 2.45 +config 2.46 +goto menu
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/ipxe/stuff/lkrnprefix.S Mon Oct 14 13:38:36 2013 +0000 3.3 @@ -0,0 +1,644 @@ 3.4 +/* 3.5 + Copyright (C) 2000, Entity Cyber, Inc. 3.6 + 3.7 + Authors: Gary Byers (gb@thinguin.org) 3.8 + Marty Connor (mdc@thinguin.org) 3.9 + 3.10 + This software may be used and distributed according to the terms 3.11 + of the GNU Public License (GPL), incorporated herein by reference. 3.12 + 3.13 + Description: 3.14 + 3.15 + This is just a little bit of code and data that can get prepended 3.16 + to a ROM image in order to allow bootloaders to load the result 3.17 + as if it were a Linux kernel image. 3.18 + 3.19 + A real Linux kernel image consists of a one-sector boot loader 3.20 + (to load the image from a floppy disk), followed a few sectors 3.21 + of setup code, followed by the kernel code itself. There's 3.22 + a table in the first sector (starting at offset 497) that indicates 3.23 + how many sectors of setup code follow the first sector and which 3.24 + contains some other parameters that aren't interesting in this 3.25 + case. 3.26 + 3.27 + When a bootloader loads the sectors that comprise a kernel image, 3.28 + it doesn't execute the code in the first sector (since that code 3.29 + would try to load the image from a floppy disk.) The code in the 3.30 + first sector below doesn't expect to get executed (and prints an 3.31 + error message if it ever -is- executed.) 3.32 + 3.33 + We don't require much in the way of setup code. Historically, the 3.34 + Linux kernel required at least 4 sectors of setup code. 3.35 + Therefore, at least 4 sectors must be present even though we don't 3.36 + use them. 3.37 + 3.38 +*/ 3.39 + 3.40 +FILE_LICENCE ( GPL_ANY ) 3.41 + 3.42 +#define SETUPSECS 4 /* Minimal nr of setup-sectors */ 3.43 +#define PREFIXSIZE ((SETUPSECS+1)*512) 3.44 +#define PREFIXPGH (PREFIXSIZE / 16 ) 3.45 +#define BOOTSEG 0x07C0 /* original address of boot-sector */ 3.46 +#define INITSEG 0x9000 /* we move boot here - out of the way */ 3.47 +#define SETUPSEG 0x9020 /* setup starts here */ 3.48 +#define SYSSEG 0x1000 /* system loaded at 0x10000 (65536). */ 3.49 + 3.50 + .text 3.51 + .code16 3.52 + .arch i386 3.53 + .org 0 3.54 + .section ".prefix", "ax", @progbits 3.55 + .globl _lkrn_start 3.56 +_lkrn_start: 3.57 + 3.58 +bootsector: 3.59 +_start: 3.60 + 3.61 +/* some extra features */ 3.62 +#define EXE_SUPPORT real mode dos .exe file support 3.63 + 3.64 +#define EXEADRS(x) (x+0xE0) 3.65 + 3.66 +/* some contraints to reduce the size */ 3.67 +//#define FLOPPY_1440K_ONLY 1.44M floppies support only 3.68 + 3.69 +#ifdef EXE_SUPPORT 3.70 +/* Initial temporary stack size */ 3.71 +#define EXE_STACK_SIZE 0x400 3.72 + 3.73 +/* Temporary decompression area (avoid DOS high memory area) */ 3.74 +#define EXE_DECOMPRESS_ADDRESS 0x110000 3.75 + 3.76 +/* Fields within the Program Segment Prefix */ 3.77 +#define PSP_CMDLINE_LEN 0x80 3.78 +#define PSP_CMDLINE_START 0x81 3.79 + 3.80 +#define HEADER_SIZE 0x20 3.81 + 3.82 +signature: 3.83 + decw %bp // Magic number: MZ 3.84 + popw %dx 3.85 + jmp start // Bytes on last page of file 3.86 +blocks: 3.87 + .word 0 // Pages in file 3.88 + .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ 3.89 + .ascii "ADDW" 3.90 + .long blocks 3.91 + .long 512 3.92 + .long 0 3.93 + .previous 3.94 + .word 0 // Relocations 3.95 + .word ( HEADER_SIZE / 16 ) // Size of header in paragraphs 3.96 + .word ( EXE_STACK_SIZE / 16 ) // Minimum extra paragraphs needed 3.97 + .word ( EXE_STACK_SIZE / 16 ) // Maximum extra paragraphs needed 3.98 +init_ss: 3.99 + .word -( ( _exe_start - signature ) / 16 ) // Initial (relative) SS value 3.100 + .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ 3.101 + .ascii "ADDW" 3.102 + .long init_ss 3.103 + .long 16 3.104 + .long 0 3.105 + .previous 3.106 + .word EXE_STACK_SIZE // Initial SP value 3.107 + .word 0 // Checksum 3.108 + .word _exe_start // Initial IP value 3.109 + /* Initial code segment (relative to start of executable) */ 3.110 + //.word -( ( _exe_start - signature ) / 16 ) // Initial (relative) CS value 3.111 + .word -( HEADER_SIZE / 16 ) // Initial (relative) CS value 3.112 +// .word 0x001C // File address of relocation table 3.113 +// .word 0,0,0 // Overlay number 3.114 + 3.115 +start: 3.116 + pushw %dx 3.117 + xorw %dx, %dx 3.118 +#endif 3.119 + cld # assume nothing 3.120 +stacktop = 0x9E00 # in 0x8000 .. 0xA000 3.121 +zeroed = 12 # zeroed registers 3.122 + movw $stacktop-12-zeroed, %di # stacktop is an arbitrary value >= 3.123 + # length of bootsect + length of 3.124 + # setup + room for stack; 3.125 + # 12 is disk parm size. 3.126 + pushw $INITSEG 3.127 + popw %ss # %ss contain INITSEG 3.128 + movw %di, %sp # put stack at INITSEG:stacktop-... 3.129 + 3.130 +# Many BIOS's default disk parameter tables will not recognize 3.131 +# multi-sector reads beyond the maximum sector number specified 3.132 +# in the default diskette parameter tables - this may mean 7 3.133 +# sectors in some cases. 3.134 +# 3.135 +# Since single sector reads are slow and out of the question, 3.136 +# we must take care of this by creating new parameter tables 3.137 +# (for the first disk) in RAM. We can set the maximum sector 3.138 +# count to 36 - the most we will encounter on an ED 2.88. 3.139 +# 3.140 +# High doesn't hurt. Low does. Let's use the max: 63 3.141 + 3.142 + pushw %ss 3.143 + popw %es # %es = %ss = INITSEG 3.144 + xorw %ax, %ax # %ax = 0 3.145 + movw $zeroed/2, %cx # clear gdt + offset, %ds, limits 3.146 + rep # don't worry about cld 3.147 + stosw # already done above 3.148 + popw %bx # offset = 0 3.149 + popw %ds # %ds = 0 3.150 + popw %fs # %fs = 0 3.151 + 3.152 + movb setup_sects+0x7C00, %al # read bootsector + setup (%ds = 0) 3.153 + incw %ax 3.154 + 3.155 + ldsw 0x78(%bx), %si # %ds:%bx+0x78 is parameter table address 3.156 + pushw %es 3.157 + pushw %di 3.158 + movb $6, %cl # copy 12 bytes 3.159 + rep # don't worry about cld 3.160 + movsw # already done above 3.161 + pushw %ss 3.162 + popw %ds # now %ds = %es = %ss = INITSEG 3.163 + popl %fs:0x78(%bx) # update parameter table address 3.164 + movb $63, 0x4-12(%di) # patch sector count, %di = stacktop 3.165 + cli 3.166 + 3.167 + xchg %ax, %di # sector count 3.168 + popw %ax # limits = 0 3.169 + incw %cx # cylinder 0, sector 1, clear Z 3.170 + call read_first_sectors # read setup 3.171 + 3.172 +# This routine loads the system at address LOADSEG, making sure 3.173 +# no 64kB boundaries are crossed. We try to load it as fast as 3.174 +# possible, loading whole tracks whenever we can. 3.175 + 3.176 + popw %bx # clear %bx 3.177 + movw syssize, %di 3.178 + addw $(512/16)-1, %di 3.179 + shrw $9-4, %di 3.180 + movw $SYSSEG, %cx 3.181 + call read_sectorsCX 3.182 + 3.183 +# This procedure turns off the floppy drive motor, so 3.184 +# that we enter the kernel in a known state, and 3.185 +# don't have to worry about it later. 3.186 + 3.187 +kill_motor: 3.188 + xchgw %ax, %di # reset FDC (%di < 128) 3.189 + int $0x13 3.190 + 3.191 +# After that (everything loaded), we jump to the setup-routine 3.192 +# loaded directly after the bootblock: 3.193 +# Segments are as follows: %ds = %ss = INITSEG 3.194 + 3.195 + ljmp $SETUPSEG, $0 3.196 + 3.197 +#ifdef EXE_SUPPORT 3.198 +dosexit: 3.199 + movw $0x4c00, %ax 3.200 + int $0x21 3.201 + 3.202 +_exe_start: 3.203 + pushw $dosexit 3.204 + movw $EXEADRS(need386), %si 3.205 + pushfw // save flags 3.206 + // bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 3.207 + // flags 0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF 3.208 + movb $0x10, %ah // DF = IF = TF = 0 3.209 + pushw %ax 3.210 + popfw // < 286 : flags[12..15] are forced 1 3.211 + pushfw // = 286 : flags[12..15] are forced 0 3.212 + popw %cx // > 286 : only flags[15] is forced 0 3.213 + popfw // restore flags 3.214 + addb %ah, %ch // test F0 and 00 cases 3.215 + cmpb %ah, %ch 3.216 + jbe puts // C=8086/80186, Z=80286 3.217 +// smsww %ax 3.218 +// andb $1, %al 3.219 +// jne puts 3.220 + 3.221 + /* Terminate command line with a NUL */ 3.222 + movzbw PSP_CMDLINE_LEN, %si 3.223 + movb $0, PSP_CMDLINE_START(%si) 3.224 + cmpb $'?', PSP_CMDLINE_START-1(%si) 3.225 + je help 3.226 + pushw %si 3.227 + 3.228 + /* Install iPXE. Use a fixed temporary decompression area to 3.229 + * avoid trashing the DOS high memory area. 3.230 + */ 3.231 + call alloc_basemem 3.232 + movl $EXE_DECOMPRESS_ADDRESS, %edi 3.233 + stc 3.234 + sbbl %ebp, %ebp /* Allow arbitrary relocation */ 3.235 + xorl %esi, %esi 3.236 + call install_prealloc 3.237 + 3.238 + xorl %ebp, %ebp 3.239 + xorl %ecx, %ecx 3.240 + 3.241 + /* Calculate command line physical address */ 3.242 + xorl %edx, %edx 3.243 + movw %ds, %dx 3.244 + shll $4, %edx 3.245 + popw %si 3.246 + orw %si, %si 3.247 + jne gotarg 3.248 + movw $EXEADRS(default_config), %bp 3.249 + addl %edx, %ebp 3.250 + movw $0xA00-default_config, %cx 3.251 +gotarg: 3.252 + addl $PSP_CMDLINE_START, %edx 3.253 + 3.254 + jmp start_ipxe 3.255 + 3.256 +help: 3.257 + movw $EXEADRS(helpmsg), %si 3.258 +puts: 3.259 + lodsb 3.260 + orb %al, %al 3.261 + je exit 3.262 + call putc 3.263 + jmp puts 3.264 +#endif 3.265 + 3.266 +putcdot: 3.267 + movb $0x2E, %al 3.268 +putc: 3.269 + movb $0xE, %ah 3.270 + movw $7, %bx 3.271 + int $0x10 3.272 +exit: 3.273 + ret 3.274 + 3.275 + 3.276 +# read_sectors reads %di sectors into %es:0 buffer. 3.277 +# %es:0 is updated to the next memory location. 3.278 +# First, sectors are read sector by sector until 3.279 +# sector per track count is known. Then they are 3.280 +# read track by track. 3.281 +# Assume no error on first track. 3.282 + 3.283 +#ifdef FLOPPY_1440K_ONLY 3.284 +#define FLOPPY_HEADS 2 /* 2 heads */ 3.285 +#define FLOPPY_SECTORS 18 /* 18 sectors */ 3.286 +#else 3.287 +#define FLOPPY_HEADS 2 /* 2 heads minimum */ 3.288 +#define FLOPPY_SECTORS 9 /* 9 sectors minimum */ 3.289 +#endif 3.290 + 3.291 +check_limits: 3.292 +#ifndef FLOPPY_1440K_ONLY 3.293 + popw %dx 3.294 +#ifdef FLOPPY_SECTORS 3.295 + cmpb $FLOPPY_SECTORS+1, %cl # minimum sector count 3.296 + jb check_head 3.297 +#endif 3.298 + cmpb %al, %cl # max sector known ? 3.299 + ja next_head # no -> store it 3.300 +check_head: 3.301 +#ifdef FLOPPY_HEADS 3.302 + cmpb $FLOPPY_HEADS, %dh # 2 heads minimum 3.303 + jb check_cylinder 3.304 +#endif 3.305 + cmpb %ah, %dh # max head known ? 3.306 + ja next_cylinder # no -> store it 3.307 +check_cylinder: 3.308 +#endif 3.309 + pushaw 3.310 +#ifndef FLOPPY_1440K_ONLY 3.311 + cbw # %ah = 0 3.312 +#endif 3.313 + int $0x13 # reset controler 3.314 + popaw 3.315 + movb $1, %al # sector by sector... 3.316 +read_sectorslp: 3.317 + pushw %dx # some bios break dx... 3.318 +#ifndef FLOPPY_1440K_ONLY 3.319 + pushw %ax # limits 3.320 + subb %cl, %al # sectors remaining in track 3.321 + ja tolastsect 3.322 + movb $1, %al # 1 sector mini 3.323 +tolastsect: 3.324 +#else 3.325 + mov $FLOPPY_SECTORS+1, %al 3.326 + subb %cl, %al # sectors remaining in track 3.327 +#endif 3.328 + cbw 3.329 + cmpw %di, %ax 3.330 + jb more1trk 3.331 + movw %di, %ax # sectors to read 3.332 +more1trk: 3.333 + pushw %ax # save context 3.334 + movb $2, %ah # cmd: read chs 3.335 + int $0x13 3.336 +#ifndef FLOPPY_1440K_ONLY 3.337 + popw %dx # save %ax 3.338 + popw %ax # limits 3.339 +#else 3.340 + popw %ax # restore context 3.341 + popw %dx 3.342 +#endif 3.343 + jc check_limits 3.344 +#ifndef FLOPPY_1440K_ONLY 3.345 + xchgw %ax, %bp 3.346 + addw %dx,%cx # next sector 3.347 + movw %cx, %gs 3.348 + movw %es, %cx 3.349 + pushw %dx 3.350 + shlw $5, %dx 3.351 + addw %dx, %cx 3.352 + popw %dx 3.353 + subw %dx,%di # update sector counter 3.354 + popw %dx 3.355 +read_sectorsCX: 3.356 + movw %cx, %es # next location 3.357 + jz putcdot 3.358 +#else 3.359 + addw %ax,%cx # next sector 3.360 + movw %cx, %gs 3.361 + movw %es, %cx 3.362 + pushw %ax 3.363 + shlw $5, %ax 3.364 + addw %ax, %cx 3.365 + popw %ax 3.366 + subw %ax,%di # update sector counter 3.367 +read_sectorsCX: 3.368 + movw %cx, %es # next location 3.369 + jz putcdot 3.370 +#endif 3.371 +read_sectors: 3.372 + movw %gs, %cx 3.373 +#ifndef FLOPPY_1440K_ONLY 3.374 +# al is last sector+1 3.375 +# ah is last cylinder+1 3.376 + xchgw %ax, %bp 3.377 +#endif 3.378 +#ifndef FLOPPY_1440K_ONLY 3.379 + cmpb %al,%cl # reach sector limit ? 3.380 + jne bdendlp 3.381 +next_head: 3.382 + movb %cl,%al 3.383 +#else 3.384 + cmpb $FLOPPY_SECTORS+1,%cl # reach sector limit ? 3.385 + jne bdendlp 3.386 +#endif 3.387 + incb %dh # next head 3.388 + movb $1,%cl # first sector 3.389 +#ifndef FLOPPY_1440K_ONLY 3.390 + cmpb %ah, %dh # reach head limit ? 3.391 + jne bdendlp 3.392 +next_cylinder: 3.393 + movb %dh,%ah 3.394 +#else 3.395 + cmpb %cl,%dh # reach head limit ? 3.396 + je bdendlp 3.397 +#endif 3.398 +# NOTE : support 256 cylinders max 3.399 + incb %ch # next cylinder 3.400 +read_first_sectors: 3.401 + movb $0,%dh # first head 3.402 +bdendlp: 3.403 + jmp read_sectorslp 3.404 + 3.405 +#ifdef EXE_SUPPORT 3.406 +need386: 3.407 + .ascii "No 386+." 3.408 + .byte 13,10 3.409 + .byte 0 3.410 +helpmsg: 3.411 + .ascii "No help available." 3.412 + .byte 13,10 3.413 + .byte 0 3.414 +#endif 3.415 + 3.416 +/* 3.417 + The following header is documented in the Linux source code at 3.418 + Documentation/x86/boot.txt 3.419 +*/ 3.420 + .org 497 3.421 +setup_sects: 3.422 + .byte SETUPSECS 3.423 +root_flags: 3.424 + .word 0 3.425 +syssize: 3.426 + .long -PREFIXPGH 3.427 + 3.428 + .section ".zinfo.fixup", "a", @progbits /* Compressor fixups */ 3.429 + .ascii "ADDL" 3.430 + .long syssize 3.431 + .long 16 3.432 + .long 0 3.433 + .previous 3.434 + 3.435 +ram_size: 3.436 + .word 0 3.437 +vid_mode: 3.438 + .word 0 3.439 +root_dev: 3.440 + .word 0 3.441 +boot_flag: 3.442 + .word 0xAA55 3.443 +jump: 3.444 + /* Manually specify a two-byte jmp instruction here rather 3.445 + * than leaving it up to the assembler. */ 3.446 + .byte 0xeb 3.447 + .byte setup_code - header 3.448 +header: 3.449 + .byte 'H', 'd', 'r', 'S' 3.450 +version: 3.451 + .word 0x0207 /* 2.07 */ 3.452 +realmode_swtch: 3.453 + .long 0 3.454 +start_sys: 3.455 + .word 0 3.456 +kernel_version: 3.457 + .word 0 3.458 +type_of_loader: 3.459 + .byte 0 3.460 +loadflags: 3.461 + .byte 0 3.462 +setup_move_size: 3.463 + .word 0 3.464 +code32_start: 3.465 + .long SYSSEG*16 3.466 +ramdisk_image: 3.467 + .long 0 3.468 +ramdisk_size: 3.469 + .long 0 3.470 +bootsect_kludge: 3.471 + .long 0 3.472 +heap_end_ptr: 3.473 + .word 0 3.474 +pad1: 3.475 + .word 0 3.476 +cmd_line_ptr: 3.477 + .long 0 3.478 +initrd_addr_max: 3.479 + /* We don't use an initrd but some bootloaders (e.g. SYSLINUX) have 3.480 + * been known to require this field. Set the value to 2 GB. This 3.481 + * value is also used by the Linux kernel. */ 3.482 + .long 0x7fffffff 3.483 +kernel_alignment: 3.484 + .long 0 3.485 +relocatable_kernel: 3.486 + .byte 0 3.487 +pad2: 3.488 + .byte 0, 0, 0 3.489 +cmdline_size: 3.490 + .long 0x7ff 3.491 +hardware_subarch: 3.492 + .long 0 3.493 +hardware_subarch_data: 3.494 + .byte 0, 0, 0, 0, 0, 0, 0, 0 3.495 + 3.496 +/* 3.497 + We don't need to do too much setup. 3.498 + 3.499 + This code gets loaded at SETUPSEG:0. It wants to start 3.500 + executing the image that's loaded at SYSSEG:0 and 3.501 + whose entry point is SYSSEG:0. 3.502 +*/ 3.503 +setup_code: 3.504 + movl ramdisk_image, %eax 3.505 + orl %eax, %eax 3.506 + jnz setup_done 3.507 + 3.508 + movw $default_config, %di 3.509 + movw $-1, %bx 3.510 + 3.511 + movw $9, %cx 3.512 +1: 3.513 + pushw %ax 3.514 + loop 1b 3.515 + pushw $0x9310 3.516 + pushw %ax 3.517 + pushw %bx 3.518 + pushw %ax 3.519 + pushw $0x9300+(INITSEG>>12) 3.520 + pushw %di 3.521 + pushw %bx 3.522 + movb $8, %cl 3.523 +1: 3.524 + pushw %ax 3.525 + loop 1b 3.526 +1: 3.527 + incw %bx 3.528 + cmpb %al, (%bx,%di) 3.529 + jne 1b 3.530 + movw %bx, ramdisk_size 3.531 + movb $0x10, ramdisk_image+2 3.532 + 3.533 + pushw %ss 3.534 + popw %es 3.535 + movw %sp, %si 3.536 + movb $0x87, %ah 3.537 + movw $(run_ipxe-default_config)/2+1, %cx 3.538 + int $0x15 3.539 + 3.540 +setup_done: 3.541 + /* We expect to be contiguous in memory once loaded. The Linux image 3.542 + * boot process requires that setup code is loaded separately from 3.543 + * "non-real code". Since we don't need any information that's left 3.544 + * in the prefix, it doesn't matter: we just have to ensure that 3.545 + * %cs:0000 is where the start of the image *would* be. 3.546 + */ 3.547 + ljmp $(SYSSEG-(PREFIXSIZE/16)), $run_ipxe 3.548 + 3.549 +default_config: 3.550 + 3.551 + .org PREFIXSIZE 3.552 +/* 3.553 + We're now at the beginning of the kernel proper. 3.554 + */ 3.555 +run_ipxe: 3.556 + /* Set up stack just below 0x7c00 and clear direction flag */ 3.557 + xorw %ax, %ax 3.558 + movw %ax, %ss 3.559 + movw $0x7c00, %sp 3.560 + cld 3.561 + 3.562 + /* Retrieve command-line pointer */ 3.563 + movl %ds:cmd_line_ptr, %edx 3.564 + testl %edx, %edx 3.565 + jz no_cmd_line 3.566 + 3.567 + /* Set up %es:%di to point to command line */ 3.568 + movl %edx, %edi 3.569 + andl $0xf, %edi 3.570 + rorl $4, %edx 3.571 + movw %dx, %es 3.572 + 3.573 + /* Find length of command line */ 3.574 + pushw %di 3.575 + movw $0xffff, %cx 3.576 + repnz scasb 3.577 + notw %cx 3.578 + popw %si 3.579 + 3.580 + /* Make space for command line on stack */ 3.581 + movw %sp, %di 3.582 + subw %cx, %di 3.583 + andw $~0xf, %di 3.584 + movw %di, %sp 3.585 + 3.586 + /* Copy command line to stack */ 3.587 + pushw %ds 3.588 + pushw %es 3.589 + popw %ds 3.590 + pushw %ss 3.591 + popw %es 3.592 + rep movsb 3.593 + popw %ds 3.594 + 3.595 + /* Store new command-line pointer */ 3.596 + movzwl %sp, %edx 3.597 +no_cmd_line: 3.598 + 3.599 + /* Calculate maximum relocation address */ 3.600 + movl ramdisk_image, %ebp 3.601 + testl %ebp, %ebp 3.602 + jnz 1f 3.603 + decl %ebp /* Allow arbitrary relocation if no initrd */ 3.604 +1: 3.605 + 3.606 + /* Install iPXE */ 3.607 + call alloc_basemem 3.608 + xorl %esi, %esi 3.609 + xorl %edi, %edi 3.610 + call install_prealloc 3.611 + 3.612 + /* Retrieve initrd pointer and size */ 3.613 + movl ramdisk_image, %ebp 3.614 + movl ramdisk_size, %ecx 3.615 + 3.616 +start_ipxe: 3.617 + /* Set up real-mode stack */ 3.618 + movw %bx, %ss 3.619 + movw $_estack16, %sp 3.620 + 3.621 + /* Jump to .text16 segment */ 3.622 + pushw %ax 3.623 + pushw $1f 3.624 + lret 3.625 + .section ".text16", "awx", @progbits 3.626 +1: 3.627 + /* Set up %ds for access to .data16 */ 3.628 + movw %bx, %ds 3.629 + 3.630 + /* Store command-line pointer */ 3.631 + movl %edx, cmdline_phys 3.632 + 3.633 + /* Store initrd pointer and size */ 3.634 + movl %ebp, initrd_phys 3.635 + movl %ecx, initrd_len 3.636 + 3.637 + /* Run iPXE */ 3.638 + pushl $main 3.639 + pushw %cs 3.640 + call prot_call 3.641 + popl %ecx /* discard */ 3.642 + 3.643 + /* Uninstall iPXE */ 3.644 + call uninstall 3.645 + 3.646 + /* Boot next device */ 3.647 + int $0x18