From: hpa Date: Sun, 8 Apr 2001 05:14:49 +0000 (+0000) Subject: Build isolinux by default. X-Git-Tag: syslinux-3.11~889 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e090b13ca71269320c60c56726c47866df419467;p=platform%2Fupstream%2Fsyslinux.git Build isolinux by default. isolinux: flesh out getfssec and searchdir. --- diff --git a/Makefile b/Makefile index 64848f2..fe949c2 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,8 @@ VERSION = $(shell cat version) # SOURCES = ldlinux.asm syslinux.asm syslinux.c copybs.asm \ pxelinux.asm pxe.inc mbr.asm gethostip.c -BTARGET = bootsect.bin ldlinux.sys ldlinux.bin ldlinux.lst pxelinux.0 mbr.bin +BTARGET = bootsect.bin ldlinux.sys ldlinux.bin ldlinux.lst \ + pxelinux.0 mbr.bin isolinux.bin ITARGET = syslinux.com syslinux copybs.com gethostip DOCS = COPYING NEWS README TODO *.doc sample OTHER = Makefile bin2c.pl now.pl genstupid.pl keytab-lilo.pl version \ @@ -64,11 +65,20 @@ DATE := $(HEXDATE) endif ldlinux.bin: ldlinux.asm - $(NASM) -f bin -dVERSION="'$(VERSION)'" -dDATE_STR="'$(DATE)'" -dHEXDATE="$(HEXDATE)" -l ldlinux.lst -o ldlinux.bin ldlinux.asm + $(NASM) -f bin -dVERSION="'$(VERSION)'" -dDATE_STR="'$(DATE)'" \ + -dHEXDATE="$(HEXDATE)" \ + -l ldlinux.lst -o ldlinux.bin ldlinux.asm perl genstupid.pl < ldlinux.lst -pxelinux.0: pxelinux.asm - $(NASM) -f bin -dVERSION="'$(VERSION)'" -dDATE_STR="'$(DATE)'" -dHEXDATE="$(HEXDATE)" -l pxelinux.lst -o pxelinux.0 pxelinux.asm +pxelinux.0: pxelinux.asm pxe.inc + $(NASM) -f bin -dVERSION="'$(VERSION)'" -dDATE_STR="'$(DATE)'" \ + -dHEXDATE="$(HEXDATE)" \ + -l pxelinux.lst -o pxelinux.0 pxelinux.asm + +isolinux.bin: isolinux.asm + $(NASM) -f bin -dVERSION="'$(VERSION)'" -dDATE_STR="'$(DATE)'" \ + -dHEXDATE="$(HEXDATE)" \ + -l isolinux.lst -o isolinux.bin isolinux.asm bootsect.bin: ldlinux.bin dd if=ldlinux.bin of=bootsect.bin bs=512 count=1 diff --git a/isolinux.asm b/isolinux.asm index 3c54033..f844838 100644 --- a/isolinux.asm +++ b/isolinux.asm @@ -159,7 +159,7 @@ comboot_seg equ 2000h ; COMBOOT image loading zone ; struc open_file_t file_sector resd 1 ; Sector pointer (0 = structure free) -file_sectors resd 1 ; Number of sectors left +file_left resd 1 ; Number of sectors left endstruc %if (open_file_t_size & (open_file_t_size-1)) @@ -292,6 +292,8 @@ InitRDat resd 1 ; Load address (linear) for initrd HiLoadAddr resd 1 ; Address pointer for high load loop HighMemSize resd 1 ; End of memory pointer (bytes) KernelSize resd 1 ; Size of kernel (bytes) +RootDir resd 1 ; Root directory location (LBA) +RootDirLen resd 1 ; Root directory length SavedSSSP resw 1 ; Our SS:SP while running a COMBOOT image FBytes equ $ ; Used by open/getc FBytes1 resw 1 @@ -316,6 +318,7 @@ ConfigFile resw 1 ; Socket for config file PktTimeout resw 1 ; Timeout for current packet KernelExtPtr resw 1 ; During search, final null pointer LocalBootType resw 1 ; Local boot return code +RootDirClust resw 1 ; Root directory length in clusters TextAttrBX equ $ TextAttribute resb 1 ; Text attribute for message file TextPage resb 1 ; Active display page @@ -382,6 +385,7 @@ initial_csum: xor edi,edi ; Show signs of life mov si,isolinux_banner call writestr + call crlf ; For now... ; Set up boot file sizes mov eax,[bi_length] @@ -631,12 +635,24 @@ writechr_simple: ret ; +; Get one sector. Convenience entry point. +; +getonesec: + mov bp,1 + ; Fall through to getlinsec + +; ; Get linear sectors - EBIOS LBA addressing, 2048-byte sectors. ; ; Note that we can't always do this as a single request, because at least ; Phoenix BIOSes has a 127-sector limit. To be on the safe side, stick ; to 32 sectors (64K) per request. ; +; Input: +; EAX - Linear sector number +; ES:BX - Target buffer +; BP - Sector count +; getlinsec: mov si,dapa ; Load up the DAPA mov [si+4],bx @@ -777,6 +793,25 @@ all_read: mov word [writechr+1], writechr_full-(writechr+3) ; +; Now, we need to sniff out the actual filesystem data structures. +; mkisofs gave us a pointer to the primary volume descriptor +; (which will be at 16 only for a single-session disk!); from the PVD +; we should be able to find the rest of what we need to know. +; +get_fs_structures: + mov eax,[bi_pvd] + mov bx,trackbuf + call getonesec + + mov eax,[trackbuf+156+2] + mov [RootDir],eax + mov eax,[trackbuf+156+10] + mov [RootDirLen],eax + add eax,SECTORSIZE-1 + shr eax,SECTORSIZE_LG2 + mov [RootDirClust],ax + +; ; Initialize screen (if we're using one) ; @@ -2619,16 +2654,135 @@ kaboom: ; DS:DI = filename ; If successful: ; ZF clear -; SI = socket pointer +; SI = file pointer ; DX:AX = file length in bytes ; If unsuccessful ; ZF set ; searchdir: - ; ISOLINUX:: Do stuff + push es + push ds + pop es ; DS = ES + call allocate_file ; Temporary file structure for directory + jnz .failure + mov si,bx + movzx eax,word [RootDirClust] + mov [bx+file_left],eax + mov eax,[RootDir] + mov [bx+file_sector],eax + mov edx,[RootDirLen] + mov si,trackbuf+SECTORSIZE + +.getsome: + ; Get a chunk of the directory + pushad + mov si,bx + mov bx,trackbuf+SECTORSIZE + mov cx,[BufSafe] + dec cx ; ... minus one sector + call getfssec + popad + +.compare: + test [si+25], byte 8Eh ; Unwanted file attributes! + jnz .not_file + movzx cx,byte [si+32] ; File identifier length + push si + lea si,[si+33] ; File identifier offset + call iso_compare_names + pop si + je .success +.not_file: + xor eax,eax + mov al,[si] + sub edx,eax ; Decrease bytes left + jbe .failure + add si,ax ; Advance pointer + + ; Are we getting close to the end of the buffer + cmp si,trackbuf+trackbufsize-SECTORSIZE + jb .compare ; No, keep going + + ; Close to end of buffer. Copy fractional sector to top of + ; buffer, and load another chunk. + push di + lea di,[si-(trackbufsize-SECTORSIZE)] + mov cx,trackbuf+trackbufsize + sub cx,si + push di + rep movsb + pop si ; SI <- new pointer location + pop di + jmp short .getsome ; Get another chunk + +.failure: xor ax,ax ; ZF = 1 + pop es + ret + +.success: + mov eax,[si+2] ; Location of extent + mov [bx+file_sector],eax + mov eax,[si+10] ; Data length + push eax + add eax,SECTORSIZE-1 + shr eax,SECTORSIZE_LG2 + mov [bx+file_left],eax + pop eax + mov edx,eax + shr edx,16 + and bx,bx ; ZF = 0 + pop es + ret + +; +; allocate_file: Allocate a file structure +; +; If successful: +; ZF set +; BX = file pointer +; In unsuccessful: +; ZF clear +; +allocate_file: + push cx + mov bx,Files + mov cx,MAX_OPEN +.check: cmp dword [bx], byte 0 + je .found + add bx,open_file_t_size + loop .check + xor cx,cx ; ZF = 1 +.found: pop cx ret +; +; iso_compare_names: +; Compare the names DS:SI and DS:DI and report if they are +; equal from an ISO 9660 perspective. SI is the name from +; the filesystem; CX indicates its length, and ';' terminates. +; DI is expected to end with a null. +; +iso_compare_names: + push ax +.loop: jcxz .si_end + lodsb + dec cx + mov ah,[di] + inc di + or ax,2020h ; Convert both to lowercase + cmp ah,al + jne .done ; ZF = 0 + cmp al,';' + je .si_end + and al,al + jnz .loop +.si_end: + cmp [di], byte 0 + ; Now ZF is set according to the final result +.done: + pop ax + ret ; ; strcpy: Copy DS:SI -> ES:DI up to and including a null byte @@ -3403,9 +3557,7 @@ unmangle_name: call strcpy ret ; -; getfssec: Get multiple clusters from a file, given the starting cluster. -; -; In this case, get multiple blocks from a specific TCP connection. +; getfssec: Get multiple clusters from a file, given the file pointer. ; ; On entry: ; ES:BX -> Buffer @@ -3416,9 +3568,36 @@ unmangle_name: call strcpy ; CF = 1 -> Hit EOF ; getfssec: - ;; ISOLINUX:: DO STUFF + push ds + push cs + pop ds ; DS <- CS + + cmp cx,[si+file_left] + jna .ok_size + mov cx,[si+file_left] +.ok_size: + + mov bp,cx + push cx + mov eax,[si+file_sector] + call getfssec + xor ecx,ecx + pop cx + + add [si+file_sector],ecx + sub [si+file_left],ecx + ja .not_eof ; CF = 0 + + xor ecx,ecx + mov [si+file_sector],ecx ; Mark as unused + xor si,si + stc + +.not_eof: + pop ds ret + ; ---------------------------------------------------------------------------------- ; VGA splash screen code ; ----------------------------------------------------------------------------------