From 914fe1ed468df8c08cf321f829349cff4ea9066f Mon Sep 17 00:00:00 2001 From: hpa Date: Sun, 19 Dec 2004 10:52:23 +0000 Subject: [PATCH] Make extlinux actually compile. No words on actually working, yet; and even so, it needs an installer. --- extlinux.asm | 111 +++++++++++++++++++++++++++++------------------------------ ui.inc | 6 ++-- 2 files changed, 57 insertions(+), 60 deletions(-) diff --git a/extlinux.asm b/extlinux.asm index d9feb97..5ec5426 100644 --- a/extlinux.asm +++ b/extlinux.asm @@ -112,21 +112,14 @@ trackbuf resb trackbufsize ; Track buffer goes here getcbuf resb trackbufsize ; ends at 5000h - alignb 8 - - ; Expanded superblock -SuperInfo equ $ - resq 16 ; The first 16 bytes expanded 8 times -FAT resd 1 ; Location of (first) FAT -RootDirArea resd 1 ; Location of root directory area -RootDir resd 1 ; Location of root directory proper -DataArea resd 1 ; Location of data area -RootDirSize resd 1 ; Root dir size in sectors -TotalSectors resd 1 ; Total number of sectors -EndSector resd 1 ; Location of filesystem end -ClustSize resd 1 ; Bytes/cluster +SuperBlock resb 1024 ; ext2 superblock +SuperInfo resd 16 ; DOS superblock expanded +ClustSize resd 1 ; Bytes/cluster ("block") +SecPerClust resd 1 ; Sectors/cluster ClustMask resd 1 ; Sectors/cluster - 1 -CopySuper resb 1 ; Distinguish .bs versus .bss +PtrsPerBlock1 resd 1 ; Pointers/cluster +PtrsPerBlock2 resd 1 ; (Pointers/cluster)^2 +PtrsPerBlock3 resd 1 ; (Pointers/cluster)^3 DriveNumber resb 1 ; BIOS drive number ClustShift resb 1 ; Shift count for sectors/cluster ClustByteShift resb 1 ; Shift count for bytes/cluster @@ -212,7 +205,6 @@ superinfo_size equ ($-superblock)-1 ; How much to expand ; FAT32 need 54 more bytes superblock_len equ $-superblock -SecPerClust equ bxSecPerClust ; ; Note we don't check the constraints above now; we did that at install ; time (we hope!) @@ -580,6 +572,7 @@ LDLDwords dw 0 ; Total dwords starting at ldlinux_sys LDLSectors dw 0 ; Number of sectors - (bootsec+this sec) CheckSum dd 0 ; Checksum starting at ldlinux_sys ; value = LDLINUX_MAGIC - [sum of dwords] +CurrentDir dd 2 ; "Current" directory inode number ; Space for up to 64 sectors, the theoretical maximum SectorPtrs times 64 dd 0 @@ -750,21 +743,47 @@ expand_super: loop .loop ; -; Compute some information about this filesystem. +; Load the real (ext2) superblock; 1024 bytes long at offset 1024 ; + mov bx,SuperBlock + mov eax,1024 >> SECTOR_SHIFT + mov cx,ax + call getlinsec ; -; Common initialization code +; Compute some values... ; -%include "cpuinit.inc" + xor edx,edx + inc edx + + ; s_log_block_size = log2(blocksize) - 10 + mov cl,[SuperBlock+s_log_block_size] + add cl,10 + mov [ClustByteShift],cl + mov eax,edx + shl eax,cl + mov [ClustSize],eax + + sub cl,2 ; 4 bytes/pointer + shl edx,cl + mov [PtrsPerBlock1],edx + shl edx,cl + mov [PtrsPerBlock2],edx + shl edx,cl + mov [PtrsPerBlock3],eax + + sub cl,SECTOR_SHIFT-2 + mov [ClustShift],cl + shr eax,SECTOR_SHIFT + mov [SecPerClust],eax + dec eax + mov [ClustMask],eax ; -; Clear Files structures +; Common initialization code ; - mov di,Files - mov cx,(MAX_OPEN*open_file_t_size)/4 - xor eax,eax - rep stosd +%include "init.inc" +%include "cpuinit.inc" ; ; Initialize the metadata cache @@ -772,19 +791,6 @@ expand_super: call initcache ; -; Initialization that does not need to go into the any of the pre-load -; areas -; - ; Now set up screen parameters - call adjust_screen - - ; Wipe the F-key area - mov al,NULLFILE - mov di,FKeyName - mov cx,10*(1 << FILENAME_MAX_LG2) - rep stosb - -; ; Now, everything is "up and running"... patch kaboom for more ; verbosity and using the full screen system ; @@ -804,22 +810,12 @@ expand_super: ; to take'm out. In fact, we may want to put them back if we're going ; to boot ELKS at some point. ; - mov si,linuxauto_cmd ; Default command: "linux auto" - mov di,default_cmd - mov cx,linuxauto_len - rep movsb - - mov di,KbdMap ; Default keymap 1:1 - xor al,al - inc ch ; CX <- 256 -mkkeymap: stosb - inc al - loop mkkeymap ; ; Load configuration file ; - mov di,syslinux_cfg +load_config: + mov di,ConfigName call open jz no_config_file @@ -944,20 +940,20 @@ open_inode: shl eax, ext2_group_desc_lg2size ; Get byte offset in desc table xor edx,edx - div dword [BlockSize] + div dword [ClustSize] ; eax = block #, edx = offset in block add eax,dword [SuperBlock+s_first_data_block] inc eax ; s_first_data_block+1 mov cl,[ClustShift] shl eax,cl - call getcachesec ; Get the group descriptor + call getcachesector ; Get the group descriptor add si,dx mov esi,[gs:si+bg_inode_table] ; Get inode table block # pop eax ; Get inode within group movzx edx, word [SuperBlock+s_inode_size] mul edx ; edx:eax = byte offset in inode table - div dword [BlockSize] + div dword [ClustSize] ; eax = block # versus inode table, edx = offset in block add eax,esi shl eax,cl ; Turn into sector @@ -969,7 +965,7 @@ open_inode: and dx,SECTOR_SIZE-1 mov [bx+file_in_off],dx - call getcachesec + call getcachesector add si,dx mov eax,[gs:si+i_size] push eax @@ -1027,7 +1023,7 @@ searchdir: .readdir: mov bx,trackbuf push bx - mov cx,[SecPerBlock] + mov cx,[SecPerClust] call getfssec pop bx pushf ; Save EOF flag @@ -1201,7 +1197,7 @@ linsector: jb .direct mov ebx,[gs:si+i_block+4*EXT2_IND_BLOCK] sub eax,EXT2_NDIR_BLOCKS - mov ebp,[PtrsPerBlk1] + mov ebp,[PtrsPerBlock1] jb .ind1 mov ebx,[gs:si+i_block+4*EXT2_DIND_BLOCK] sub eax,ebp @@ -1323,7 +1319,7 @@ getfssec: inc ebx ; Sector index inc edx ; Linearly next sector mov eax,ebx - call nextsector + call linsector jc .do_read cmp edx,eax je .getseccnt @@ -1333,7 +1329,7 @@ getfssec: lea eax,[eax+ebp-1] ; This is the last sector actually read shl bp,9 add bx,bp ; Adjust buffer pointer - call nextsector + call linsector jc .eof mov edx,eax and cx,cx @@ -1397,6 +1393,7 @@ err_oldkernel db 'Cannot load a ramdisk with an old kernel image.' db CR, LF, 0 err_notdos db ': attempted DOS system call', CR, LF, 0 err_comlarge db 'COMBOOT image too large.', CR, LF, 0 +err_bssimage db 'BSS images not supported.', CR, LF, 0 err_a20 db CR, LF, 'A20 gate not responding!', CR, LF, 0 err_bootfailed db CR, LF, 'Boot failed: please change disks and press ' db 'a key to continue.', CR, LF, 0 @@ -1409,7 +1406,7 @@ aborted_msg db ' aborted.' ; Fall through to crlf_msg! crlf_msg db CR, LF null_msg db 0 crff_msg db CR, FF, 0 -ConfigName db 'syslinux.cfg',0 ; Unmangled form +ConfigName db 'extlinux.cfg',0 ; Unmangled form ; ; Command line options we'd like to take a look at diff --git a/ui.inc b/ui.inc index 17464bc..2872ee5 100644 --- a/ui.inc +++ b/ui.inc @@ -276,15 +276,15 @@ vk_check: %endif xor bx,bx ; Try only one version -%if IS_SYSLINUX || IS_MDSLINUX - jmp get_kernel -%else +%if IS_PXELINUX || IS_ISOLINUX ; Is this a "localboot" pseudo-kernel? cmp byte [VKernelBuf+vk_rname], 0 jne get_kernel ; No, it's real, go get it mov ax, [VKernelBuf+vk_rname+1] jmp local_boot +%else + jmp get_kernel %endif .not_vk: -- 2.7.4