This is the patch that upgrade lilo to match the version included in the old lilosh CVS. diff -ruN lilo.orig/ChangeLog lilo/ChangeLog --- lilo.orig/ChangeLog Thu Jan 1 09:00:00 1970 +++ lilo/ChangeLog Thu Dec 7 16:17:10 2000 @@ -0,0 +1,44 @@ +2000-11-26 NIIBE Yutaka + + * first.S (done): Flush the cache. + * second.c (start): Call cache_flush. + (cache_flush): New function. + +2000-11-25 NIIBE Yutaka + + * first.S: Don't put '$' for register spec. + * second.c (start): Don't put '$' for register spec. + (machine_type, memory_size, io_base, put_string_1, read_sectors): + Likewise. + * second.lds: Use new tool chain's ldscript. + * defs.h: Add declaration of memcpy. + +2000-09-09 NIIBE Yutaka + + * first.S (real_start): Set argument 0 for cache enable call. + +2000-08-19 NIIBE Yutaka + + * second.c (get_sector_address): Bug fix for # of sector == 0. + (start): Support machine types of CqREEK and SolutionEngine. + + * first.S (load_sector_address): Bug fix for checking LBA. + (real_start): Call "enable cache" BIOS feature. + +2000-08-05 NIIBE Yutaka + + * Makefile (first.o): Added -traditional for "'" in comments. + + * second.c (machine_type, serial_type, memory_size, io_base): New + functions. + (start): Implement kernel command line handling a bit. + (read_sectors): Emit error message. + (get_sector_address): Emit error message. + + * first.S (read_a_sector): Implement error handling. + (load_sector_address): Check if it's LBA. + +2000-07-22 NIIBE Yutaka + + * second.c (start): Don't load two magic sectors at the memory + of executable image. diff -ruN lilo.orig/Makefile lilo/Makefile --- lilo.orig/Makefile Fri Dec 8 10:10:02 2000 +++ lilo/Makefile Fri Dec 8 11:46:04 2000 @@ -39,76 +39,55 @@ GO=-DGO=0x`sed '/go/s/^.*go 0 \(....\) A.*$$/\1/p;d' first.lis` SHELL=/bin/sh -CC=cc -CPP=$(CC) -E -AS86=as86 -0 -a -LD86=ld86 -0 -CFLAGS=-Wall -g $(PCONFIG) -LDFLAGS=#-Xlinker -qmagic +CROSS_COMPILE = sh3-linux- +CC =$(CROSS_COMPILE)gcc +LD =$(CROSS_COMPILE)ld +OBJCOPY =$(CROSS_COMPILE)objcopy +STRIP =$(CROSS_COMPILE)strip + +CFLAGS = -O2 -I. -pipe -fPIC $(CONFIG) -DPATH_MAX=255 +CPP=$(CC) -E -traditional + +#CFLAGS=-Wall -g $(PCONFIG) +#LDFLAGS=#-Xlinker -qmagic OBJS=lilo.o map.o geometry.o boot.o device.o common.o bsect.o cfg.o temp.o \ partition.o identify.o -.SUFFIXES: .img .b +.SUFFIXES: .b -all: check-config lilo boot.b dump.b os2_d.b chain.b dparam.com \ - activate - -check-config: - $(CPP) check-config.cpp $(PCONFIG) >/dev/null +all: lilo boot.b .c.o: $(CC) -c $(CFLAGS) $*.c -.s.o: - $(AS86) -w -o $*.o $*.s - -.o.img: - $(LD86) -s -o $*.img $*.o +boot.b: first.bin second.bin + cat first.bin second.bin >boot.b -.img.b: - dd if=$*.img of=$*.b bs=32 skip=1 +first.bin: first.exe + $(OBJCOPY) -S first.exe -O binary first.bin -activate: activate.c - $(CC) -Wall -s -O -o activate activate.c $(LDFLAGS) - -dparam.com: dparam.img - dd if=dparam.img of=dparam.com bs=288 skip=1 - -lilo: $(OBJS) - $(CC) -o lilo $(LDFLAGS) $(OBJS) +second.bin: second.exe + $(OBJCOPY) -R .comment -S second.exe -O binary second.bin -boot.b: first.b second.b - (dd if=first.b bs=512 conv=sync; dd if=second.b) >boot.b +first.exe: first.o + $(LD) -EL -e start first.o -o first.exe -Ttext 0x8c200000 -first.s: first.S lilo.h lilo - $(CPP) $(PCONFIG) `./lilo -X` first.S -o first.s +second.exe: second.o string.o + $(LD) -T second.lds -EL second.o string.o -o second.exe -Ttext 0x8c201000 -second.s: second.S lilo.h lilo - $(CPP) $(PCONFIG) $(GO) `./lilo -X` second.S -o second.s +first.o: first.S + $(CC) $(CFLAGS) -c first.S -chain.s: chain.S lilo.h - $(CPP) $(PCONFIG) $(GO) chain.S -o chain.s +second.o: second.c + $(CC) $(CFLAGS) -c second.c -os2_d.s: chain.S lilo.h - $(CPP) $(PCONFIG) $(GO) chain.S -DDOS_D -o os2_d.s +string.o: string.c + $(CC) $(CFLAGS) -c string.c -#dos_d.s: chain.S lilo.h first.lis -# $(CPP) $(PCONFIG) $(GO) chain.S -DDOS_D -o dos_d.s - -dump.s: dump.S lilo.h first.lis - $(CPP) $(PCONFIG) `./lilo -X` dump.S -DDOS_D -o dump.s \ - -DGO=0x`sed '/go/s/^.*go 0 \(....\) A.*$$/\1/p;d' first.lis` - -xxx.s: chain.S lilo.h - $(CPP) chain.S -DXXX -o xxx.s - -first.o first.lis: first.s - $(AS86) -w -o first.o -l first.lis first.s - -second.lis: second.s - $(AS86) -w -l second.lis second.s +lilo: $(OBJS) + $(CC) -o lilo $(LDFLAGS) $(OBJS) install: all if [ ! -d $$ROOT$(SBIN_DIR) ]; then mkdir $$ROOT$(SBIN_DIR); fi @@ -118,13 +97,9 @@ mkdir $$ROOT$(USRSBIN_DIR); fi if [ -f $$ROOT$(BOOT_DIR)/boot.b ]; then \ mv $$ROOT$(BOOT_DIR)/boot.b $$ROOT$(BOOT_DIR)/boot.old; fi - if [ -f $$ROOT$(BOOT_DIR)/chain.b ]; then \ - mv $$ROOT$(BOOT_DIR)/chain.b $$ROOT$(BOOT_DIR)/chain.old; fi - if [ -f $$ROOT$(BOOT_DIR)/os2_d.b ]; then \ - mv $$ROOT$(BOOT_DIR)/os2_d.b $$ROOT$(BOOT_DIR)/os2_d.old; fi - cp boot.b chain.b os2_d.b $$ROOT$(BOOT_DIR) + cp boot.b $$ROOT$(BOOT_DIR) cp lilo $$ROOT$(SBIN_DIR) - strip $$ROOT$(SBIN_DIR)/lilo + $(STRIP) $$ROOT$(SBIN_DIR)/lilo cp keytab-lilo.pl $$ROOT$(USRSBIN_DIR) @if [ -e $$ROOT/etc/lilo/install ]; then echo; \ echo -n "$$ROOT/etc/lilo/install is obsolete. LILO is now ";\ @@ -142,11 +117,8 @@ && mv ../lilo ../lilo-`cat VERSION` clean: - rm -f *.o *.img *.lis first.s second.s chain.s \ - os2_d.s dump.s tmp_make first.b second.b - -spotless: clean - rm -f lilo activate boot.b chain.b os2_d.b dump.b dparam.com + rm -f *.o *.exe *.bin tmp_make + rm -f lilo boot.b ### Dependencies activate.o : activate.c diff -ruN lilo.orig/chain.S lilo/chain.S --- lilo.orig/chain.S Thu Oct 15 05:14:25 1998 +++ lilo/chain.S Thu Jan 1 09:00:00 1970 @@ -1,255 +0,0 @@ -/* chain.S - LILO boot chainer */ - -/* Copyright 1992-1998 Werner Almesberger. See file COPYING for details. */ - - -#define LILO_ASM -#include "lilo.h" - - - .text - - .globl _main - .org 0 - -_main: jmp start - - .org 6 - - .ascii "LILO" - .word STAGE_CHAIN - .word VERSION - -offset: .word 0 -drive: .byte 0 - .byte 0 ! head, always zero - -hint: .word drvmap ! pointer to drive map - -ptable: .blkw 0x20 ! partition table to preload - -start: cli ! set SS:SP to 0:7C00 - xor ax,ax - mov ss,ax - mov ax,#0x7c00 - mov sp,ax - sti - mov ax,#SETUPSEG ! move boot sector to default location - mov ds,ax - xor ax,ax - mov es,ax - mov cx,#256 -mtmp = SETUPSECS-1 ! broken math ... - mov si,#mtmp*512 - mov di,#BOOTSEG*16 - rep - movsw -#ifdef DOS_D -dos4: seg es - mov byte ptr BOOTSEG*16+0x24,#0x81 -#endif - mov cx,#0x20 ! move partition table - mov si,#ptable - mov di,#PART_TABLE - rep - movsw - ! mess with the partition table -#if defined(LCF_REWRITE_TABLE) || defined(LCF_READONLY) - mov si,#prtmap ! get partition table change rules -prtclp: lodsw ! bios == 0 indicates end - or al,al - jz pmend ! at end -> quit - cmp al,cache ! already in cache ? - je incache ! yes -> no loading required - push ax ! save table data - call flush ! flush the cache - pop ax - push ax - mov cache,al ! remember drive in cache - cmp al,drive ! boot drive ? - jne noc ! no -> load into scratch area - xor ax,ax ! load at 0000:0600 - mov bx,#PARTS_LOAD - jmp loadit -noc: mov ax,ds - mov bx,#PARTS_SCR ! scratch area -loadit: mov es,ax ! set up pointers and remember them - mov ces,ax - mov cbx,bx - mov ax,#0x201 ! load partition table, one sector - mov dx,cache ! drive from cache (DH = 0) - mov cx,#1 - int 0x13 ! load it - jc wrfail ! error -> abort - pop ax ! get BIOS and offset -incache:les bx,cbx ! load pointer - add bx,#PART_TABLE_OFFSET ! move to partition table - add bl,ah ! offset is always in [0x1be,0x1fd] - lodsw ! see what we need to do - seg es ! match ? - cmp byte ptr (bx),al - jne nocng ! no -> do not change - seg es ! change - mov byte ptr (bx),ah - mov byte ptr dirty,#1 ! mark as dirty -nocng: br prtclp ! next one - -flush: test byte ptr dirty,#1 ! dirty ? - jz noflush ! no -> do not write - mov ax,#0x301 ! write one sector - mov dx,cache ! get the drive - or dl,dl ! nothing cached ? - jz noflush ! no -> do not flush - les bx,cbx ! reload pointer - int 0x13 ! write ... - jc wrfail ! argl -noflush:ret -pmend: call flush ! flush table - br nopp ! and proceed -wrfail: mov si,#failmsg ! complain - call say - mov ax,#FIRSTSEG ! try to restart LILO - jmpi #GO,FIRSTSEG - -cache: .byte 0 ! drive, 0 means not cached - .byte 0 ! head, always 0 -cbx: .blkw 1 -ces: .blkw 1 -dirty: .byte 0 - -#endif - -nopp: - mov ax,drvmap ! need to install mapper ? - or ax,ax - jz noimap ! no -> go on - call swap13 -noimap: - - mov si,offset ! DS:SI and ES:SI point to the partition - add si,#PART_TABLE - mov dx,drive ! initialize DX (drive and head) - xor ax,ax ! set DS and ES to zero -#ifdef XXX - mov ax,ds - mov es,ax - mov si,#lilosig - mov bx,#cmd - mov dl,#0xfe -#else - mov ds,ax - mov es,ax -#endif - mov bp,#0 ! might help some boot problems - mov ax,#0xaa55 ! boot signature (just in case ...) - jmpi #BOOTSEG*16,0 ! start boot sector - -#ifdef XXX -lilosig:.ascii "LILO" -cmd: .ascii "98" - .byte 0 -#endif - -#if defined(LCF_REWRITE_TABLE) - -! Display a NUL-terminated string on the console - -say: lodsb ! get byte - or al,al ! NUL ? - jz aret ! yes -> done - mov ah,#14 ! display, tty-style - xor bh,bh - int 0x10 - jmp say ! next one -aret: ret ! done - -failmsg:.ascii "Rewrite error." - .byte 13,10,0 - -#endif - -swap13: seg es ! allocate 1 kB - dec word ptr [0x413] - int 0x12 ! get start segment - mov cl,#6 - shl ax,cl - cli ! disable interrupts - xor bx,bx ! zero a few registers - mov di,bx - seg es ! change offset - xchg bx,[0x4c] - mov old13of,bx - mov bx,ax ! change segment - seg es - xchg bx,[0x4e] - mov old13sg,bx - mov es,ax ! move drive swapper - mov si,#new13 - mov cx,#new13end-new13 - rep - movsb - sti ! enable interrupts - ret ! done - -new13: push ax ! save AX (contains function code in AH) - push bp ! need BP to mess with stack - mov bp,sp - ! Stack layout: - ! - ! +8 INT flags - ! +6 INT CS - ! +4 INT IP - ! +2 AX - ! BP+0 BP - pushf ! push flags (to act like interrupt) - push si - mov si,#drvmap-new13 -mapfl: seg cs ! get next entry - lodsw - or ax,ax ! at end ? - jz nomap ! yes -> do not map - cmp dl,al ! match ? - jne mapfl ! no -> continue - mov dl,ah ! map drive -nomap: pop si ! restore SI - mov 8(bp),ax ! overwrite old flags (to remember mapping) - mov ax,2(bp) ! restore AX - mov bp,(bp) ! restore BP - .byte 0x9a ! CALL FAR -old13of:.word 0 -old13sg:.word 0 - push bp ! save BP again - mov bp,sp - ! New stack layout: - ! - ! +10 mapping (was flags) - ! +8 INT CS - ! +6 INT IP - ! +4 AX - ! +2 obsolete BP - ! BP+0 BP - xchg ax,4(bp) ! save AX and get command - pushf ! fix driver number, if necessary - cmp ah,#8 ! do not fix - je done13 - cmp ah,#0x15 ! do not fix - je done13 - mov ax,10(bp) ! no mapping ? - or ax,ax - jz done13 - mov dl,al ! fix mapping -done13: mov ax,4(bp) ! restore AX - pop 10(bp) ! restore flags - pop bp ! get BP - add sp,#4 ! fix SP - iret ! done - -drvmap: .blkw DRVMAP_SIZE+1 - -new13end: - -#if defined(LCF_REWRITE_TABLE) -prtmap: .blkw PRTMAP_SIZE*2+1 ! only first word of last entry is read -#endif - -theend: diff -ruN lilo.orig/chain.old.S lilo/chain.old.S --- lilo.orig/chain.old.S Wed Jun 18 16:42:15 1997 +++ lilo/chain.old.S Thu Jan 1 09:00:00 1970 @@ -1,260 +0,0 @@ -/* chain.S - LILO boot chainer */ - -/* Copyright 1992-1997 Werner Almesberger. See file COPYING for details. */ - - -#define LILO_ASM -#include "lilo.h" - - - .text - - .globl _main - .org 0 - -_main: jmp start - - .org 2 - - .ascii "LILO" - .word STAGE_CHAIN - .word VERSION - -offset: .word 0 -drive: .byte 0 - .byte 0 ! head, always zero - -start: cli ! set SS:SP to 0:7C00 - xor ax,ax - mov ss,ax - mov ax,#0x7c00 - mov sp,ax - sti - mov ax,#SETUPSEG ! move boot sector to default location - mov ds,ax - xor ax,ax - mov es,ax - mov cx,#256 - mov si,#512 - mov di,#BOOTSEG*16 - rep - movsw - push bx ! save secret message -#ifdef DOS_D -#if 0 - seg es - cmp byte ptr BOOTSEG*16+0x26,#0x29 - je dos4 - mov bx,#baddos ! complain - call say - mov ax,#FIRSTSEG ! restart LILO - jmpi #GO,FIRSTSEG -#endif -dos4: seg es - mov byte ptr BOOTSEG*16+0x24,#0x81 -#endif - mov cx,#0x20 ! move partition table - mov si,#PART_TABLE_OFFSET - mov di,#PART_TABLE - rep - movsw -#if defined(SWAP_HD) || defined(SWAP_FD) - call swap13 -#endif - ! table entry - pop bx ! get secret message (active partition) -#ifdef LCF_REWRITE_TABLE - or bl,bl ! none set ? - jz tonopp ! yes -> do not patch -br tonopp - cmp bx,#0x81 ! valid code ? - jb towrfail ! no -> abort - cmp bx,#0x84 - jna wrokay ! yes -> continue -towrfail:br wrfail -tonopp: br nopp -wrokay: push bx ! save BX - xor ax,ax ! ES becomes 0 - mov es,ax - mov ax,#0x201 ! load partition table, one sector - mov dx,#0x80 ! first drive - mov cx,#1 - mov bx,#PARTS_LOAD - int 0x13 ! load it - jc wrfail ! error -> abort - mov cx,#4 ! process all four entries - mov bx,#PART_TABLE -ptchpt: seg es ! clear all active flags - mov byte ptr (bx),#0 -#if defined(LCF_FIX_TYPE) && defined(LCF_HIDE_DOS) - seg es - mov al,(bx+4) ! get partition type - cmp al,#PART_DOS12 ! hidden ? - je hideme ! no -> hide it - cmp al,#PART_DOS16 - je hideme - cmp al,#PART_DOS32 - jne nonrel ! already hidden -> continue -hideme: add al,#HIDDEN_OFF ! write back corrected value - seg es - mov (bx+4),al -#endif -nonrel: add bx,#16 ! next entry - loop ptchpt - pop bx ! compute active flag position - dec bx - shl bl,1 - shl bx,1 - shl bx,1 - shl bx,1 - cmp bx,offset ! right ? - jne wrfail ! no -> abort - seg es ! set active flag - mov byte ptr (bx+PART_TABLE),#0x80 -#ifdef LCF_FIX_TYPE - seg es ! is this a - mov al,byte ptr (bx+PART_TABLE+4) - cmp al,#PART_HDOS12 ! hidden ? - je unhideme ! yes -> unhide it - cmp al,#PART_HDOS16 - je unhideme - cmp al,#PART_HDOS32 - jne nounhid ! not hidden -> continue -unhideme:sub al,#HIDDEN_OFF ! write back corrected value - seg es - mov (bx+PART_TABLE+4),al -#endif -nounhid:mov ax,#0x301 ! save it (restore all registers for - mov dx,#0x80 ! paranoia) - mov cx,#1 - mov bx,#0x600 - int 0x13 ! write ... - jc wrfail ! argl - mov bx,#passmsg ! confirm modification - call say - jmp nopp -wrfail: mov bx,#failmsg ! complain - call say - mov ax,#FIRSTSEG ! restart LILO - jmpi #GO,FIRSTSEG -#endif -nopp: mov si,offset ! DS:SI and ES:SI point to the partition - add si,#PART_TABLE - mov dx,drive ! initialize DX (drive and head) - xor ax,ax ! set DS and ES to zero -#ifdef XXX - mov ax,ds - mov es,ax - mov si,#lilosig - mov bx,#cmd - mov dl,#0xfe -#else - mov ds,ax - mov es,ax -#endif - mov bp,#0 ! might help some boot problems - mov ax,#0xaa55 ! boot signature (just in case ...) - jmpi #BOOTSEG*16,0 ! start boot sector - -#ifdef XXX -lilosig:.ascii "LILO" -cmd: .ascii "98" - .byte 0 -#endif - -#if defined(DOS_D) || defined(LCF_REWRITE_TABLE) - -! Display a NUL-terminated string on the console - -say: mov al,(bx) ! get byte - or al,al ! NUL ? - jz aret ! yes -> done - push bx ! save pointer - mov ah,#14 ! display, tty-style - xor bh,bh - int 0x10 - pop bx - inc bx ! next one - jmp say -aret: ret ! done - -#ifdef DOS_D -baddos: .ascii "Need DOS version 4 or newer." - .byte 13,10,0 -#endif - -failmsg:.ascii "Rewrite error." - .byte 13,10,0 - -passmsg:.ascii "Rewrote the partition table." - .byte 13,10,0 - -#endif - -#if defined(SWAP_HD) || defined(SWAP_FD) - -swap13: seg es ! allocate 1 kB - dec word ptr [0x413] - int 0x12 ! get start segment - mov cl,#6 - shl ax,cl - cli ! disable interrupts - xor bx,bx ! zero a few registers - mov di,bx - seg es ! change offset - xchg bx,[0x4c] - mov old13of,bx - mov bx,ax ! change segment - seg es - xchg bx,[0x4e] - mov old13sg,bx - mov es,ax ! move drive swapper - mov si,#new13 - mov cx,#new13end-new13 - rep - movsb - sti ! enable interrupts - ret ! done - -new13: seg cs ! save function code - mov fcode-new13,ah - test dl,#0x80 ! hard disk drive ? -#ifdef SWAP_FD - jnz noswap ! yes -> go on -#else - jz noswap ! no -> go on -#endif - xor dl,#1 ! swap drive 0 and 1 -noswap: pushf - .byte 0x9a ! CALL FAR -old13of:.word 0 -old13sg:.word 0 - pushf ! fix driver number, if necessary - seg cs - cmp byte ptr fcode-new13,#8 ! do not fix - je done13 - seg cs - cmp byte ptr fcode-new13,#0x15 ! do not fix - je done13 - test dl,#0x80 ! hard disk drive ? -#ifdef SWAP_FD - jnz done13 ! yes -> go on -#else - jz done13 ! no -> go on -#endif - xor dl,#1 ! fix it -done13: seg cs - mov tmpbx-new13,bx ! restore flags - mov bx,sp - seg ss - pop 6(bx) - seg cs - mov bx,tmpbx-new13 - iret ! done -new13end: -fcode: .byte 0 ! function code -tmpbx: .word 0 - -#endif - -theend: diff -ruN lilo.orig/defs.h lilo/defs.h --- lilo.orig/defs.h Thu Jan 1 09:00:00 1970 +++ lilo/defs.h Thu Dec 7 16:17:10 2000 @@ -0,0 +1,2 @@ +extern void *memcpy (void *__dest, const void *__src, unsigned int __n); +extern int strlen (__const char *__s); diff -ruN lilo.orig/dump.S lilo/dump.S --- lilo.orig/dump.S Wed Jun 18 16:42:22 1997 +++ lilo/dump.S Thu Jan 1 09:00:00 1970 @@ -1,131 +0,0 @@ -/* dump.S - LILO register dumper */ - -/* Copyright 1995-1997 Werner Almesberger. See file COPYING for details. */ - - -#define LILO_ASM -#include "lilo.h" - - - .text - - .globl _main - .org 0 - -_main: push sp ! push all registers - push ss - pushf - push es - push ds - push cs - push bp - push di - push si - push dx - push cx - push bx - push ax - mov ax,#BOOTSEG ! let DS point to where we really are - mov ds,ax - mov bx,#msgs ! set up loop -l: call say ! output message - cmp byte ptr (bx),#0 ! at end ? - je back ! yes -> back to LILO - pop ax ! get next data word - push bx - call wout ! output data word - pop bx - jmp l ! next round - -#if 0 -back: mov ax,#FIRSTSEG - mov ds,ax - mov word ptr (CODE_START_1),#CODE_START_1+8 - mov word ptr (CODE_START_1+2),#FIRSTSEG - mov word ptr (CODE_START_1+4),#CODE_START_1+12 - mov byte ptr (CODE_START_1+6),#0xfe - mov es,ax ! adjust segments - mov ax,#BOOTSEG - mov ds,ax - mov word ptr (10),#0xffff ! no timeout - mov si,#haltnow ! copy string data - mov di,#CODE_START_1+8 - mov cx,#6 - rep - movsb - mov ax,#FIRSTSEG ! restart LILO - jmpi #GO,FIRSTSEG -#else -back: hlt ! stay here - jmp back -#endif - -! Display a NUL-terminated string on the console - -say: mov al,(bx) ! get byte - inc bx ! move pointer - or al,al ! NUL ? - jz aret ! yes -> done - push bx ! save pointer - mov ah,#14 ! display, tty-style - xor bh,bh - int 0x10 - pop bx - jmp say ! next one - -wout: push ax ! display one word - mov al,ah - call bout - pop ax -bout: push ax ! display one byte - shr al,#4 - call nout - pop ax -nout: and al,#15 ! display one nibble - add al,#48 - cmp al,#58 - jb nokay - add al,#7 -nokay: xor bh,bh ! display on screen - mov ah,#14 - int 0x10 -aret: ret - -msgs: .byte 13,10 - .ascii "Register dump:" - .byte 13,10,10 - .ascii "AX=" - .byte 0 - .ascii " BX=" - .byte 0 - .ascii " CX=" - .byte 0 - .ascii " DX=" - .byte 0,13,10 - .ascii "SI=" - .byte 0 - .ascii " DI=" - .byte 0 - .ascii " BP=" - .byte 0,13,10 - .ascii "CS=" - .byte 0 - .ascii " DS=" - .byte 0 - .ascii " ES=" - .byte 0,13,10 - .ascii "F=" - .byte 0,13,10 - .ascii "SS:SP=" - .byte 0 - .ascii ":" - .byte 0,13,10,10 -#if 0 - .ascii "Restarting LILO ..." -#else - .ascii "System halted." -#endif - .byte 13,10,10,0,0 - -haltnow:.ascii "LILO" ! prevent automatic reboot - .byte 0 diff -ruN lilo.orig/first.S lilo/first.S --- lilo.orig/first.S Sat Dec 5 08:20:12 1998 +++ lilo/first.S Thu Dec 7 16:17:10 2000 @@ -1,226 +1,257 @@ -/* first.S - LILO first stage boot loader */ - -/* Copyright 1992-1998 Werner Almesberger. See file COPYING for details. */ - - -#define LILO_ASM -#include "lilo.h" - -#ifndef LCF_NO1STDIAG -#define CYL_CHECK -#endif - - - .text - - .globl _main - - .org 0 - -_main: cli ! NT 4 blows up if this is missing - jmp start - - .org 6 - -! Boot device parameters. They are set by the installer. - +/* $Id: first.S,v 1.16 2000/11/26 07:11:58 gniibe Exp $ + * + * Primary boot loader + * + * lilo/arch/sh/first.S + * + * Copyright (C) 2000 Niibe Yutaka + * + * This file is subject to the terms and conditions of the GNU General + * Public License. + * + */ + +/* + * NOTE: Keep this code "position independent", so that this works well + * among machines with different memory map. + * + * Some machine starts its memmory at 0x08000000 (Area2), + * while others starts at 0x0c000000 (Area3). + */ + +/* + * Memory map: + * [ First Loader ] 512 + * [ Stack ] 4096-512 + * [ Second Loader ] 4KB + * [ Reserved ] 4KB + * [ MAP load area ] 512 + * [ Descriptor table 1/2 ] 512 + * [ Descriptor table 2/2 ] 512 + * [ Default Command Line ] 512 + * [ Keyboard Translation ] 512 + * [ Greeting Message ] 512 + * [ Reserved ] + * [ Reserved ] + * + */ + .global start +start: + bra real_start + .byte 3 ! This becomes "mov r0, r12" with next "l" + ! + .ascii "lba" ! special marker for LBA32 + ! .ascii "LILO" - .word STAGE_FIRST - .word VERSION + .word 1 +#if 1 + /* EDIT HERE ! */ + ! Depends LILOs version + .word 20 +#else + /* v--- Major Version */ + .word 4*256 + 21 + ! /* ^--- Minor Version*/ +#endif +/* x86 LILO parameters (Not used for SuperH... yet) */ timeout:.word 0 ! input timeout delay: .word 0 ! boot delay port: .byte 0 ! COM port (0 = unused, 1 = COM1, etc.) sparam: .byte 0 ! serial port parameters (0 = unused) -tstamp: .long 0 ! timestamp +/* Timestamp (Filled by LILO command) */ +tstamp: .long 0 -d1_cx: .word 0 ! first descriptor sector address +/* First descripter sector (Filled by LILO command) */ +d1_cx: .word 0 d1_dx: .word 0 -d1_al: .byte 0 ! (unused) +d1_al: .byte 0 -d2_cx: .word 0 ! second descriptor sector address +/* Second descripter sector (Filled by LILO command) */ +d2_cx: .word 0 d2_dx: .word 0 -d2_al: .byte 0 ! (unused) +d2_al: .byte 0 -dc_cx: .word 0 ! default command-line sector address +/* Default command-line sector (Filled by LILO command) */ +dc_cx: .word 0 dc_dx: .word 0 -dc_al: .byte 0 ! (unused) +dc_al: .byte 0 +/* Prompt? (Filled by LILO command) */ prompt: .byte 0 ! indicates whether to always enter prompt ! (also used as alignment byte) +/* Greeting message length & sector (Filled by LILO command) */ ms_len: .word 0 ! initial greeting message ms_cx: .word 0 ms_dx: .word 0 -ms_al: .byte 0 ! (unused) +ms_al: .byte 0 +/* Second descripter sector (Filled by LILO command) */ kt_cx: .word 0 ! keyboard translation table kt_dx: .word 0 kt_al: .byte 0 d_addr: ! second stage sector addresses - .org CODE_START_1 - -ext_si: .word 0 ! external interface -ext_es: .word 0 -ext_bx: .word 0 -ext_dl: .byte 0 - -start: mov ax,#BOOTSEG ! set DS - mov ds,ax - mov ext_es,es ! copy possible external parameters - mov ext_si,si - mov ext_bx,bx - mov ext_dl,dl - mov ax,#FIRSTSEG ! beam us up ... - mov es,ax - mov cx,#256 - sub si,si - sub di,di - cld - rep - movsw - jmpi go,FIRSTSEG - -go: cli ! no interrupts - mov ds,ax ! AX is already set - mov es,ax ! (ES may be wrong when restarting) - mov sp,#STACK ! set the stack - mov ax,#STACKSEG - mov ss,ax - sti ! now it is safe - - mov al,#0x0d ! gimme a CR ... - call display - mov al,#0x0a ! ... an LF ... - call display - mov al,#0x4c ! ... an 'L' ... - call display - -lagain: mov si,#d_addr ! ready to load the second stage loader - mov bx,#SECOND - cld -sload: lodsw ! get CX - mov cx,ax - lodsw ! get DX - mov dx,ax - or ax,cx ! at EOF ? - jz done ! yes -> start it - inc si ! skip the length byte - call cread - jc error ! error -> start over again - add bx,#512 ! next sector - jmp sload -error: -#ifndef LCF_NO1STDIAG - push ax ! display a space - mov al,#32 - call display - pop ax - mov al,ah ! display error code - call bout -#endif - xor ax,ax ! reset the FDC - mov dl,al - int 0x13 - jmp lagain ! redo from start -done: mov al,#0x49 ! display an 'I' - call display - jmpi 0,SECONDSEG ! start the second stage loader - -#ifndef LCF_NO1STDIAG -bout: push ax ! display one byte - shr al,#4 - call nout - pop ax -nout: and al,#15 ! display one nibble - add al,#48 - cmp al,#58 - jb nokay - add al,#7 -nokay: ! fall through -#endif - -display:xor bh,bh ! display on screen - mov ah,#14 - int 0x10 - ret - -linerr: pop dx ! discard stack contents - pop cx - pop bx - ret ! (carry is already set) - -cread: test dl,#LINEAR_FLAG ! linear address ? - jz readsect ! no -> go on - and dl,#0xff-LINEAR_FLAG ! remove flag - -! -! Translate the linear address into a sector/track/cylinder address -! - push bx ! BX is used as scratch - push cx ! LSW - push dx ! MSW with drive - mov ah,#8 ! get drive geometry (do not clobber ES:DI) - int 0x13 - jc linerr ! error -> quit - mov al,dh ! AL <- #heads-1 - pop dx ! get MSW - mov t_drive,dl ! save drive - mov dl,dh ! linear address (high) into DX - xor dh,dh -#ifdef CYL_CHECK - push cx ! compute #cyls-1 - xchg ch,cl - rol ch,1 - rol ch,1 - and ch,#3 - mov n_cyl,cx ! save #cyls-1 - pop cx -#endif - and cx,#0x3f ! CX <- #secs - mul cl ! AX <- #secs/cyl - add ax,cx - xchg ax,bx - pop ax ! linear address (low) into AX - div bx ! DX <- cylinder, AX <- remaining secs - xchg ax,dx - div cl ! AL <- track, AH <- sector - inc ah - mov t_sector,ah - xchg ax,dx ! AX <- cylinder, DL <- track - mov dh,dl ! set up DX (head:drive) - mov dl,t_drive -#ifdef CYL_CHECK - cmp ax,n_cyl ! valid cylinder number ? - ja linerr3 ! no -> error -#endif - xchg ah,al ! build cylinder number - ror al,1 - ror al,1 - or al,t_sector - mov cx,ax - pop bx ! restore BX -readsect: - mov ax,#0x201 ! read one sector - int 0x13 - ret ! quit, possibly with errors - -#ifdef CYL_CHECK -linerr3:pop bx ! pop BX and linear address - xor ax,ax ! zero indicates internal error - stc ! error - ret - -n_cyl: .word 0 ! temporary space -#endif -t_drive:.byte 0 -t_sector:.byte 0 - - -/* Here are at least 66 bytes of free space. This is reserved for the - partition table and the boot signature. */ + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + .long 0xffffffff + + .word 0xffff + + .align 2 +real_start: + /* Get base pointer, to be position independent */ + mova next, r0 + mov #0x02, r1 + shll8 r1 + sub r1, r0 + mov r0, r12 ! Base pointer + ! + mov #0x10, r1 + shll8 r1 + mov r12, r15 + add r1, r15 ! Setup stack pointer + ! + mov #0x10, r13 ! buffer number + ! + /* Enable cache */ + mov #6, r0 ! Cache "on" + mov #0, r4 + trapa #0x3f + ! + /* Output message "L" */ + mova message, r0 + mov r0, r4 + mov #1, r5 + mov #0, r0 ! Serial Output + trapa #0x3f + ! + /* Load second stage loader */ + mov #52, r11 ! #52: desc# of second stage loader +loop: mov r11, r4 + bsr load_sector_address ! get r4 (=dev) and r5 (=lba) + add r12, r4 ! desc# --> address of descriptor + bt done + ! + mov r13, r6 + shll8 r6 + bsr read_a_sector + add r12, r6 ! buffer number -> buffer address + ! + add #2, r13 ! buffer # += 2 + bra loop + add #5, r11 ! next desc# is +5 + +done: + /* Flush cache */ + mov #6, r0 ! Cache "on" + mov #0, r4 + trapa #0x3f + + /* Jump to the second loader */ + mov #0x10, r0 + shll8 r0 + add r12, r0 ! Get the address into r0 + jmp @r0 + mov r12, r4 ! First argument is base pointer + + .align 2 +message: + .string "L" + + .align 2 +/* + * LOAD_SECTOR_ADDRESS: + * Read the sector descripter (5-byte tuple), and translate + * it as device number and lba. Set T flag if its NULL. + * + * INPUT: r4 (pointer to descripter (5-byte long, not aligned) + * OUTPUT: r4 (DEVICE #), r5 (LBA) and T register (T when done) + * Clobbers: r0, r1, r2, r3 + */ +load_sector_address: + mov.b @r4+, r0 + extu.b r0, r0 + mov.b @r4+, r1 + extu.b r1, r1 + mov.b @r4+, r2 + extu.b r2, r2 + mov.b @r4+, r3 + extu.b r3, r3 + ! + shll8 r3 + or r3, r1 + shll8 r1 + or r0, r1 + mov r1, r5 + mov.b @r4, r0 + cmp/eq #0, r0 + bt 1f ! NULL (end of descriptor) + ! + /* Check if its really LBA... */ + mov r2, r0 + and #0x0F, r0 ! Get device number + mov #0xc0, r3 + extu.b r3, r3 + cmp/hi r2, r3 + bf 1f ! Unset T + ! + /* Its not LBA!! */ + mova not_lba_message, r0 + mov r0, r4 + mov #36, r5 + mov #0, r0 ! Serial Output + trapa #0x3f + sett ! End of descriptor + ! +1: rts + mov r0, r4 ! device number + +/* + * READ a sector + * INPUT: r4 (DEVICE #), r5 (LBA), r6 (BUFFER ADDRESS) + * OUTPUT: r0 (RESULT) + * + * Invoke BIOS call READ_SECTORS with number_of_sectors=1. + */ +read_a_sector: + mov #2, r0 ! READ SECTORS + mov #1, r7 ! number of sectors + trapa #0x3f + ! + tst r0, r0 + bt 1f + ! /* ERROR */ + mova read_error_message, r0 + mov r0, r4 + mov #19, r5 + mov #0, r0 ! Serial Output + trapa #0x3f + ! /* Go to the monitor */ + mov #0, r0 + jmp @r0 + nop + ! +1: rts + nop + + .align 2 +not_lba_message: + .string "ERROR: Sector address is not in LBA\n" + .align 2 +read_error_message: + .string "ERROR: Sector read\n" -theend: + .align 9 +next: --- lilo.orig/second.c Thu Jan 1 09:00:00 1970 +++ lilo/second.c Thu Dec 7 21:03:56 2000 @@ -0,0 +1,411 @@ +/* $Id: second.c,v 1.22 2000/11/26 07:11:16 gniibe Exp $ + * + * Secondary boot loader + * + * lilo/arch/sh/second.c + * + * Copyright (C) 2000 Niibe Yutaka + * + * This file is subject to the terms and conditions of the GNU General + * Public License. + * + */ + +#include "defs.h" + +static void put_string (unsigned char *); +static int get_sector_address (unsigned long, int *, unsigned long *); +static int load_sectors (unsigned long, unsigned long); +static int read_sectors (int, unsigned long, unsigned char *, int); +static int load_sectors_with_maps (int, int, unsigned long *); + +static int machine_type (void); +static int serial_type (void); +static int memory_size (void); +static int io_base (void); +static void cache_flush (void); + +static const char hexchars[] = "0123456789abcdef"; +#define digits hexchars /* 10base is same for 16base (up to 10) */ +static inline char highhex (int x) { return hexchars[(x >> 4) & 0xf]; } +static inline char lowhex (int x) { return hexchars[x & 0xf]; } +static void printouthex (int); + +static unsigned long base_pointer = 0; /* Avoid BSS */ +static unsigned long kernel_image = 0; /* Avoid BSS */ + +/* Sector descriptor */ +#define SD_DESCR1 24 +#define SD_DESCR2 29 +#define SD_DEFCMD 34 +/* 39 prompt (byte) */ +/* 40 length (word) */ +#define SD_MSG 42 +#define SD_KBDTBL 47 + +static inline char *string_set (char *dest, const char *str) +{ + int len = strlen (str); + memcpy (dest, str, len); + return dest + len; +} + +void +start (unsigned long base) +{ + base_pointer = base; + + put_string ("I"); + load_sectors (SD_DESCR1, 0x3200); + load_sectors (SD_DESCR2, 0x3400); + put_string ("L"); + /* XXX: checksum */ + + load_sectors (SD_DEFCMD, 0x3600); + load_sectors (SD_KBDTBL, 0x3800); + put_string ("O "); + +#if 0 + load_sectors (SD_MSG, 0x3a00); +#endif + /* XXX: delay, key check... */ + /* XXX: list up images */ + /* XXX: check signature */ + /* Input command line */ + /* XXX: Is there default command line? Use it! */ + put_string ("boot: "); + put_string ("first-image\n"); /* XXX: should handle input commandline... */ + + /* Structure of descriptor + [ checksum 2byte ] + [ DESCR_SIZE:52-byte + (image-name (16-byte) + passwd (16-byte) + rd_size (4-byte) + initrd (5-byte sector desc) + start (5-byte sector desc) + start_page (16-bit) + flags (16-bit) + vga_mode (16-bit) + ) + ] * 19 + */ + + put_string ("Loading "); + put_string ((char *)(base_pointer+0x3200+2)); /* Image name */ + + kernel_image = base_pointer + 0x10000 - 0x400; + { + int desc = 0x3200+2+16+16+4+5; /* kernel image */ + + /* Skip two sectors: Fallback command line and options */ + desc = load_sectors_with_maps (desc, 0, &kernel_image); + put_string ("."); + + while (desc != 0) + { + desc = load_sectors_with_maps (desc, 0, &kernel_image); + put_string ("."); + } + } + put_string ("done.\n"); + +#if 0 + { + int i; + + put_string ("DUMP: "); + for (i=0; i<16; i++) + printouthex (*(unsigned char *)(base_pointer+0x10000+i)); + put_string ("\n"); + } +#endif + + /* XXX: kernel paramerter setting */ + { + unsigned long parm = base_pointer - 0x200000 + 0x1000; + char *cmdline = (char *)(parm+256); + int mem_size; + unsigned char *p; + + *(long *)parm = 1; /* Read only mount? */ + *(long *)(parm+4) = 0; /* RAMDISK Flags */ + *(long *)(parm+8) = 0x0301; /* Root device: XXX should get from cls.. */ + *(long *)(parm+12) = 1; /* Loader type (LILO = 1) */ + *(long *)(parm+16) = 0; /* Initrd start */ + *(long *)(parm+20) = 0; /* Initrd size */ + *(long *)(parm+24) = 0; /* Not defined yet */ + + /* XXX: Should take the line from command line sector... */ +#define DC_MAGIC 0xf4f2 /* magic number of default cmd. line sector */ + p = (unsigned char *)(base_pointer+0x3600); + if(p[0] == (DC_MAGIC & 0xff) && p[1] == (DC_MAGIC >> 8)) + cmdline = string_set(cmdline, p+2); + cmdline = string_set(cmdline, (char *)(base_pointer + 0x10000 - 0x200)); + +#if 0 + /* Query to BIOS and build the command line string */ + /* Build string "mem=XXM" */ + mem_size = memory_size (); + mem_size >>= 20; /* In Mega-byte */ + cmdline = string_set (cmdline, "mem="); + if (mem_size >= 100) + { + *cmdline++ = digits[mem_size/100]; + mem_size = mem_size % 100; + } + if (mem_size >= 10) + { + *cmdline++ = digits[mem_size/10]; + mem_size = mem_size % 10; + } + *cmdline++ = digits[mem_size]; + *cmdline++ = 'M'; + *cmdline++ = ' '; + + switch (machine_type ()) + { + case 0: /* Unknown board */ + { /* Build string "sh_mv=unknown,0xXXXXXX,1" */ + unsigned int io = io_base (); + int b31_24, b23_16, b15_08, b07_00; + + b31_24 = (io>>24)&0xff; + b23_16 = (io>>16)&0xff; + b15_08 = (io>>8)&0xff; + b07_00 = (io>>0)&0xff; + + cmdline = string_set (cmdline, "sh_mv=unknown,0x"); + *cmdline++ = highhex (b31_24); *cmdline++ = lowhex (b31_24); + *cmdline++ = highhex (b23_16); *cmdline++ = lowhex (b23_16); + *cmdline++ = highhex (b15_08); *cmdline++ = lowhex (b15_08); + *cmdline++ = highhex (b07_00); *cmdline++ = lowhex (b07_00); + cmdline = string_set (cmdline, ",1 "); + break; + } + + case 1: + cmdline = string_set (cmdline, "sh_mv=CqREEK "); + break; + + case 3: + cmdline = string_set (cmdline, "sh_mv=SolutionEngine "); + break; + } + + if (serial_type () == 0) + cmdline = string_set (cmdline, "console=ttySC0,115200"); + else + cmdline = string_set (cmdline, "console=ttySC1,115200"); +#endif + + *cmdline = '\0'; /* Terminate the string */ + } + + cache_flush (); + asm volatile ("jmp @r0; nop" + : /* no output */ + : "z" (base_pointer + 0x10000)); +} + +static int +load_sectors_with_maps (int desc, int offset, unsigned long *buf_p) +{ + int dev; + unsigned long lba; + int i, count; + + /* Load the map at 0x3000 */ + if (load_sectors (desc, 0x3000) < 0) + return 0; + + for (i = offset*5; i<505; i+=5) + { + if ((count = get_sector_address (0x3000+i, &dev, &lba)) == 0) + return 0; + + read_sectors (dev, lba, (unsigned char *)*buf_p, count); + *buf_p += count*512; + } + + /* There's next map */ + return 0x3000+505; +} + +static int +machine_type (void) +{ + register long __sc0 __asm__ ("r0") = 3; /* FEATURE QUERY */ + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0) + : "memory"); + + return (__sc0 >> 8); +} + +static int +serial_type (void) +{ + register long __sc0 __asm__ ("r0") = 3; /* FEATURE QUERY */ + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0) + : "memory"); + + return (__sc0 & 0x07); +} + +static int +memory_size (void) +{ + register long __sc0 __asm__ ("r0") = 4; /* MEMORY SIZE */ + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0) + : "memory"); + + return (__sc0); +} + +static int +io_base (void) +{ + register long __sc0 __asm__ ("r0") = 5; /* IO BASE */ + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0) + : "memory"); + + return (__sc0); +} + +static void +cache_flush (void) +{ + register long __sc0 __asm__ ("r0") = 6; /* CACHE_CONTROL */ + register long __sc4 __asm__ ("r4") = 0; /* ENABLE */ + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0), "r" (__sc4) + : "memory"); +} + +static void inline +put_string_1 (unsigned char *str, long len) +{ + register long __sc0 __asm__ ("r0") = 0; /* OUTPUT */ + register long __sc4 __asm__ ("r4") = (long) str; + register long __sc5 __asm__ ("r5") = (long) len; /* For New BIOS */ + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0), "r" (__sc4), "r" (__sc5) + : "memory"); +} + +static void +put_string (unsigned char *str) +{ + int len = strlen (str); + put_string_1 (str, len); +} + +static int +read_sectors (int dev, unsigned long lba, unsigned char *buf, int count) +{ + register long __sc0 __asm__ ("r0") = 2; /* READ SECTORS */ + register long __sc4 __asm__ ("r4") = (long) dev; + register long __sc5 __asm__ ("r5") = (long) lba; + register long __sc6 __asm__ ("r6") = (long) buf; + register long __sc7 __asm__ ("r7") = (long) count; + + asm volatile ("trapa #0x3F" + : "=z" (__sc0) + : "0" (__sc0), "r" (__sc4), "r" (__sc5), + "r" (__sc6), "r" (__sc7) + : "memory"); + + if (__sc0 < 0) + put_string ("ERROR: Sector read\n"); + + return __sc0; +} + +static int +get_sector_address (unsigned long sector_desc, int *devp, unsigned long *lbap) +{ + unsigned long s; + unsigned char *p = (unsigned char *)(sector_desc+base_pointer); + int len; + + /* Number of sectors */ + len = (int)p[4]; + if (len == 0) + return 0; + + /* p[2]: drive number */ + if ((int)p[2] < 0xc0) + /* XXX: should return error */ + put_string ("ERROR: Sector address is not in LBA\n"); + + *devp = (int)p[2] & 0x0f; + + s = p[0] + (p[1]<<8) + (p[3]<<16); + + *lbap = s; + +#if 0 + { + unsigned long lba = *lbap; + + put_string ("DEV= "); + printouthex ((*devp)&0xff); + put_string ("\n"); + put_string ("LBA= "); + printouthex ((lba>>24)&0xff); + printouthex ((lba>>16)&0xff); + printouthex ((lba>>8)&0xff); + printouthex (lba&0xff); + put_string ("\n"); + } +#endif + + return len; +} + +static int +load_sectors (unsigned long sector_desc, unsigned long mem) +{ + int dev; + unsigned long lba; + int count; + unsigned char *buf = (unsigned char *)(mem+base_pointer); + + count = get_sector_address (sector_desc, &dev, &lba); + + if (count) + return read_sectors (dev, lba, buf, count); + + return -1; +} + +#if 0 +static void +printouthex(int x) +{ + char z[4]; + + z[0] = highhex (x); + z[1] = lowhex (x); + z[2] = ' '; + z[3] = '\0'; + + put_string (z); +} +#endif diff -ruN lilo.orig/second.lds lilo/second.lds --- lilo.orig/second.lds Thu Jan 1 09:00:00 1970 +++ lilo/second.lds Fri Dec 8 11:13:20 2000 @@ -0,0 +1,212 @@ +OUTPUT_FORMAT("elf32-sh-linux", "elf32-sh-linux", "elf32-sh-linux") +OUTPUT_ARCH(sh) +ENTRY(start) +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + . = 0x400000 + SIZEOF_HEADERS; + .interp : { *(.interp) } + .hash : { *(.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rel.init : { *(.rel.init) } + .rela.init : { *(.rela.init) } + .rel.text : + { + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + } + .rela.text : + { + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + } + .rel.fini : { *(.rel.fini) } + .rela.fini : { *(.rela.fini) } + .rel.rodata : + { + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + } + .rela.rodata : + { + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + } + .rel.data : + { + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + } + .rela.data : + { + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + } + .rel.ctors : { *(.rel.ctors) } + .rela.ctors : { *(.rela.ctors) } + .rel.dtors : { *(.rel.dtors) } + .rela.dtors : { *(.rela.dtors) } + .rel.got : { *(.rel.got) } + .rela.got : { *(.rela.got) } + .rel.sdata : + { + *(.rel.sdata) + *(.rel.sdata.*) + *(.rel.gnu.linkonce.s*) + } + .rela.sdata : + { + *(.rela.sdata) + *(.rela.sdata.*) + *(.rela.gnu.linkonce.s*) + } + .rel.sbss : { *(.rel.sbss) } + .rela.sbss : { *(.rela.sbss) } + .rel.bss : { *(.rel.bss) } + .rela.bss : { *(.rela.bss) } + .rel.plt : { *(.rel.plt) } + .rela.plt : { *(.rela.plt) } + .init : + { + KEEP (*(.init)) + } =0 + .plt : { *(.plt) } + .text : + { + *(.text) + *(.text.*) + *(.stub) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) + } =0 + _etext = .; + PROVIDE (etext = .); + .fini : + { + KEEP (*(.fini)) + } =0 + .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) } + .rodata1 : { *(.rodata1) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ +/* . = ALIGN(0x10000) + (. & (0x10000 - 1)); */ + .data : + { + __data_start = . ; + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .eh_frame : { *(.eh_frame) } + .gcc_except_table : { *(.gcc_except_table) } + .note.ABI-tag : { *(.note.ABI-tag) } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .got : { *(.got.plt) *(.got) } + .dynamic : { *(.dynamic) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : + { + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + } + _edata = .; + PROVIDE (edata = .); + __bss_start = .; + .sbss : + { + *(.dynsbss) + *(.sbss) + *(.sbss.*) + *(.scommon) + } + .bss : + { + *(.dynbss) + *(.bss) + *(.bss.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(32 / 8); + } + . = ALIGN(32 / 8); + _end = .; + PROVIDE (end = .); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* These must appear regardless of . */ +} diff -ruN lilo.orig/string.c lilo/string.c --- lilo.orig/string.c Thu Jan 1 09:00:00 1970 +++ lilo/string.c Thu Dec 7 16:17:10 2000 @@ -0,0 +1,22 @@ +#include + +/* Implementation taken from Linux kernel (linux/lib/string.c) */ + +size_t strlen(const char * s) +{ + const char *sc; + + for (sc = s; *sc != '\0'; ++sc) + /* nothing */; + return sc - s; +} + +void * memcpy(void * dest,const void *src,size_t count) +{ + char *tmp = (char *) dest, *s = (char *) src; + + while (count--) + *tmp++ = *s++; + + return dest; +}